реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> LPC17xx software reset "из любой позы", Может кто нибудь поделится _проверенным_ кодом?
Velund
сообщение Oct 30 2011, 02:43
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



Собственно попытался сейчас по быстрому наваять сброс контроллера используя watchdog - и странности какие то вижу. То ли мое просветление в части особенностей работы собаки в этом камне еще не произошло, то ли одно из двух. wink.gif
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Oct 30 2011, 07:01
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



CODE


/*****************************************************************************
* wdt.h: Header file for NXP LPC214x Family Microprocessors
*
* Copyright© 2006, NXP Semiconductor
* All rights reserved.
*
* History
* 2006.09.01 ver 1.00 Prelimnary version, first Release
*
******************************************************************************/
#ifndef __WDT_H
#define __WDT_H

#define WDEN 0x00000001
#define WDRESET 0x00000002
#define WDTOF 0x00000004
#define WDINT 0x00000008


#define WDT_CLK_SRC_RC 0 //RC - 4MHz
#define WDT_CLK_SRC_APB 1 //APB (system)
#define WDT_CLK_SRC_RTC 2 //RTC - 32768

#define WDT_CLK_SRC WDT_CLK_SRC_RC

#define WDT_PERIOD 2000ull //период в mS
#define WDT_CLK 4000000ull //частота RC-цепочки


#define WDT_FEED_VALUE (WDT_PERIOD*WDT_CLK)/(1000ull*4ull) // /1000 - перевод в сеунды, /4 - предделитель


#endif /* end __WDT_H */
/*****************************************************************************
** End Of File
******************************************************************************/

/*****************************************************************************
* wdt.c: Watchdog C file for NXP LPC23xx/24xx Family Microprocessors
*
* Copyright© 2006, NXP Semiconductor
* All rights reserved.
*
* History
* 2006.07.20 ver 1.00 Prelimnary version, first Release
*
*****************************************************************************/

//volatile unsigned int wdt_counter;

/*****************************************************************************
** Function name: WDTHandler
**
** Descriptions: Watchdog timer interrupt handler
**
** parameters: None
** Returned value: None
**
*****************************************************************************/
//__irq __nested __arm void WDTHandler (void)
//{
// WDMOD &= ~WDTOF; /* clear the time-out interrupt flag */

// __enable_interrupt(); /* handles nested interrupt */

// wdt_counter++;

// VICADDRESS = 0; /* Acknowledge Interrupt */
//}

/*****************************************************************************
** Function name: WDTInit
**
** Descriptions: Initialize watchdog timer, install the
** watchdog timer interrupt handler
**
** parameters: None
** Returned value: true or false, return false if the VIC table
** is full and WDT interrupt handler can be
** installed.
**
*****************************************************************************/
void WDTInit( void )
{
WDTC = WDT_FEED_VALUE; /* once WDEN is set, the WDT will start after feeding */
WDCLKSEL = WDT_CLK_SRC;
WDMOD = WDEN | WDRESET;

WDFEED = 0xAA; /* Feeding sequence */
WDFEED = 0x55;
}

/*****************************************************************************
** Function name: WDTFeed
**
** Descriptions: Feed watchdog timer to prevent it from timeout
**
** parameters: None
** Returned value: None
**
*****************************************************************************/
void WDTFeed( void )
{
WDFEED = 0xAA; /* Feeding sequence */
WDFEED = 0x55;
return;
}

void wdtReset(void)
{
WDTFeed();
}

void wdtReboot(void)
{
__disable_interrupt();
while(1);
}

/******************************************************************************
** End Of File
******************************************************************************/


Код используется в рабочем проекте.
Никогда не применял но вроде пишут что если неправильно записать

Код
WDFEED = 0xAA;
WDFEED = 0x55;


произойдёт немедленный сброс процессора.
Go to the top of the page
 
+Quote Post
KRS
сообщение Oct 31 2011, 11:32
Сообщение #3


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Код
{
    WDMOD=3; WDFEED = 0xAA; WDFEED = 0x55;
    WDFEED = 0xAA; WDFEED = 0x00;
    while(1);
}
Go to the top of the page
 
+Quote Post
skripach
сообщение Oct 31 2011, 11:40
Сообщение #4


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



А что если вывод контроллера завести на сброс и дернуть когда надо? ..так в голову пришло.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
Velund
сообщение Oct 31 2011, 19:30
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 693
Регистрация: 19-11-04
Пользователь №: 1 177



Спасибо всем ответившим. Буду пробовать и в деталях разбираться...
Go to the top of the page
 
+Quote Post
Altemir
сообщение Nov 1 2011, 05:26
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 249
Регистрация: 2-05-06
Из: Россия, Поволжье
Пользователь №: 16 686



Добавлю свои пять копеек: посмотрите процедуру NVIC_SystemReset() wink.gif
Go to the top of the page
 
+Quote Post
goodwin
сообщение Nov 1 2011, 21:42
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 481
Регистрация: 1-08-05
Пользователь №: 7 267



Цитата(Altemir @ Nov 1 2011, 09:26) *
Добавлю свои пять копеек: посмотрите процедуру NVIC_SystemReset() wink.gif


Раньше типа где то видел, что существует баг с NVIC_SystemReset() в ядре у NXP.
Но в LPC17 из первых же партий попробовал заюзать в загрузчике - работает...
И WDT тоже...
Вот куски:

#define WDT_FEED_VALUE 0x003FFFFF/32
void WDTInit( void )
{

WDT->WDTC = WDT_FEED_VALUE; /* once WDEN is set, the WDT will start after feeding */
WDT->WDMOD = WDEN|WDRESET;

WDT->WDFEED = 0xAA; /* Feeding sequence */
WDT->WDFEED = 0x55;
}

/////////////////////////////

SystemInit(); /* initialize clocks */
I2SInit();

if (tst_disk()) test_upgrade();

if (CheckSumm()!=0)
{
CDC_activate();
Host_DelayMS(1000);
NVIC_SystemReset();
}

WDTInit(); // все ОК - пересбросим сторожевым таймером
while(1);

////////////////////////////
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 02:27
Рейтинг@Mail.ru


Страница сгенерированна за 0.01401 секунд с 7
ELECTRONIX ©2004-2016