Далее, сегодня сделал тестовый проект и локализовал эту ситуацию:
Код
#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?
Или может у меня руки где кривоваты, а глаз замылился и не видит этого.
Может кто-нить этот код залить у себя и удивиться результату?
Пасу котов...