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

 
 
> LPC2xxx watchdog, маразм или я туплю?
Andy Mozzhevilov
сообщение Sep 13 2005, 10:12
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Включил watchdog. В документации написано, что для активации/сброса wdt нужно писать в feed регистр последовательно 0xaa , 0x55. В процессе хождения по граблям выясняется, что писать нужно еще и атомарно, то есть нельзя допускать вставки дополнительных команд между командами записи. Получается, что нельзя записать 0xaa, потом что-то поделать, а потом записать 0x55, поскольку после записи 0xaa и не записи 0x55 следом uC рестартует по wdt.
В UM на LPC213x формулировка:
Цитата
"Once 0xAA is written to the WDFEED register the next operation in the Watchdog register space should be a WRITE (0x55) to the WDFFED register otherwise the watchdog is triggered."

То есть говорится о следующей операции записи в конкретное пространство wdt регистров, а не о любой следующей операции записи вообще. Или у меня с английским совсем плохо?
Конечно, не проблема записать сразу последовательно 0xaa и 0x55.
Но приходится писать в критической секции, запрещая irq и fiq, поскольку любой int между операциями записи приводит к рестарту. А если это к тому же под ОС, а если я fiq запрещать вообще не хочу?
Кто как юзает этот wdt ?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
KRS
сообщение Sep 13 2005, 10:48
Сообщение #2


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

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



Цитата(Andy Mozzhevilov @ Sep 13 2005, 13:12)
Включил watchdog. В документации написано, что для активации/сброса wdt нужно писать в feed регистр последовательно 0xaa , 0x55. В процессе хождения по граблям выясняется, что писать нужно еще и атомарно, то есть нельзя допускать вставки дополнительных команд между командами записи. Получается, что нельзя записать 0xaa, потом что-то поделать, а потом записать 0x55, поскольку после записи 0xaa и не записи 0x55 следом uC рестартует по wdt.
В UM на LPC213x формулировка:
Цитата
"Once 0xAA is written to the WDFEED register the next operation in the Watchdog register space should be a WRITE (0x55) to the WDFFED register otherwise the watchdog is triggered."

То есть говорится о следующей операции записи в конкретное пространство wdt регистров, а не о любой следующей операции записи вообще. Или у меня с английским совсем плохо?
Конечно, не проблема записать сразу последовательно 0xaa и 0x55.
Но приходится писать в критической секции, запрещая irq и fiq, поскольку любой int между операциями записи приводит к рестарту. А если это к тому же под ОС, а если я fiq запрещать вообще не хочу?
Кто как юзает этот wdt ?
*



Да иммено записи в регистры вотчдога.
Я использовал без запрещения прерываний никаких проблем!
И аппаратный ресет просто устроить, достаточно записать 0xAA а потом любой байт не 0x55 и мгновенный ресет.
Go to the top of the page
 
+Quote Post
makc
сообщение Sep 14 2005, 08:37
Сообщение #3


Гуру
******

Группа: Админы
Сообщений: 3 621
Регистрация: 18-10-04
Из: Москва
Пользователь №: 904



Мне все-таки кажется, что запрещать прерывания при работе с WDT стоит.

Сам однажды столкнулся с проблемой, когда во время записи в регистры WDT приходило прерывание от внешнего девайса и процессор уходил в ресет со всеми вытекающими из этого последствиями...

Вероятность попадания в такую ситуацию мала, но она есть => ее стоит полностью исключить. Тем более, что это совсем не сложно и на работе процессора никак не отразится.


--------------------
BR, Makc
В недуге рождены, вскормлены тленом, подлежим распаду. (с) У.Фолкнер.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Sep 14 2005, 10:29
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(makc @ Sep 14 2005, 13:37)
Вероятность попадания в такую ситуацию мала, но она есть => ее стоит полностью исключить. Тем более, что это совсем не сложно и на работе процессора никак не отразится.
*


Ну ничего себе мала. У меня fiq молотит с частотой 96кГц, дык такая ситуация возникала примерно на 10 fiq, то есть непрерывно, что и дало повод для проведения поиска причины.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Sep 14 2005, 11:18
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Далее, сегодня сделал тестовый проект и локализовал эту ситуацию:

Код
#define IO0SET                0xe0028004
#define IO0DIR                0xe0028008
#define IO0CLR                0xe002800c

#define WDMOD_REG_ADDR        0xe0000000
#define WDTC_REG_ADDR         0xe0000004
#define WDFEED_REG_ADDR       0xe0000008
#define WDTV_REG_ADDR         0xe000000c

#define ANY_VPB_REG           0xe0034004  //ADC ADDR REG

int main (void)
{
 volatile int i;

 *(volatile unsigned int *)IO0DIR = 1<<12;    // P0.12 as output
 *(volatile unsigned int *)IO0CLR = 1<<12;    // P0.12 = 0

 *(volatile unsigned int *)WDTC_REG_ADDR = 0x200000; //wdt set tout

 *(volatile char *)WDMOD_REG_ADDR = 0x03;     // wdt enbale
 *(volatile char *)WDFEED_REG_ADDR = 0xaa;    // wdt start
 *(volatile char *)WDFEED_REG_ADDR = 0x55;    //

 while(1)
 {
   *(volatile unsigned int *)IO0SET = 1<<12;  // set p0.12
   for (i=0; i<4; i++);                       // delay ~30mks
   *(volatile unsigned int *)IO0CLR = 1<<12;  // clr p0.12

   *(volatile char *)WDFEED_REG_ADDR = 0xaa;  // wdt reset, step1

   for (i=0; i<4; i++);                       // delay ~30mks

   i = *(volatile unsigned int*)ANY_VPB_REG;

   for (i=0; i<4; i++);                       // delay ~30mks

   *(volatile char *)WDFEED_REG_ADDR = 0x55;  // wdt reset, step2
 }
}


общий смысл - добавить между записью последовательности 0xaa 0x55 что-либо, что вызовет reset по wdt. Выяснилось, что таковым является любое обращение в периферии, сидящей на VPB . В этом тестовом примере я сделал чтение регистра данных АЦП. Вот картинка:

Прикрепленное изображение


на верхней осциллограмме чтение данных из АЦП заремлено, все замечательно работает и wdt не ресетит проц.
На нижней осциллогамме видно, что пин порта сваливается в HiZ через ~30мкс после установки нуля на выходе p0.12, то есть фактически любое обращение к любому периферийному регистру на VPB шине, вклинивщееся между последовательностью 0xaa и 0x55 вызывает ресет по wdt.

То есть
Цитата
Once 0xAA is written to the WDFEED register the next operation in the Watchdog register space should be a WRITE (0x55) to the WDFFED register otherwise the watchdog is triggered

это не совсем то, что заявлено, и нужно читать
Цитата
next operation in the VPB register space

?
Подумал, мож это инженерные образцы lpc2138 пошаливают. Залил в 2129 - то же самое.
Any comments?

Или может у меня руки где кривоваты, а глаз замылился и не видит этого.
Может кто-нить этот код залить у себя и удивиться результату?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post

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

 


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


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