Чип на 55Mhz, UART0 - 115200, работа с UART'ом TX через DMA, RX - посимвольно в режиме 485-го.
Заметил что иногда после сброса по WDT - USART подвисает. Подвисает так:
После старта первая посылка по DMA уходит без проблем (в терминале вижу правильные данные), но прерывание TXRDY не происходит, поэтому больше девайс ничего не шлет... Хотя флаг TXRDY в статус регистре UART'а есть! Прерываний нет от USART'а вообще никаких, ни RX ни TX, ничего.....
Другая периферия после сброса по WDT работает нормально, вчастности таймер (EDGE_TRIGGERED) тикает, I2C (LEVEL_SENSITIVE) прерывания живут, на SPI висит SD карточка обмен через DMA с прерываниями (EDGE_TRIGGERED) работает.
Подумал UART глючит, пробовал вывести из ступора повторной инициализацией - не помогло. И не удивительно, UART то по всем признакам живой...
Повторный сброс по WDT (иногда второй, иногда третий...) приводит USART в чуства... и USART после этого живет долго и счастливо.
До конца не разобрался в чем было дело, но похоже что со сбросом AIC'a через WDT что-то не чисто, на что натолкнуло значение AIC_IMR = 0xFFFFEEE3 после сброса. Следующий код, решает мою проблему с UART'ом:
Код
static __inline void hal_ClearAIC(void)
{
AT91PS_AIC pAIC = AT91C_BASE_AIC;
int i;
pAIC->AIC_IDCR = 0xFFFFFFFF;
pAIC->AIC_EOICR = 0; // mark last int as handled
for (i = 0; i < 32; i++)
pAIC->AIC_SVR[ i ] = 0xDEADBEEF;
}
{
AT91PS_AIC pAIC = AT91C_BASE_AIC;
int i;
pAIC->AIC_IDCR = 0xFFFFFFFF;
pAIC->AIC_EOICR = 0; // mark last int as handled
for (i = 0; i < 32; i++)
pAIC->AIC_SVR[ i ] = 0xDEADBEEF;
}
вызвать первым при входе в main().
Кто-нибудь сталкивался с чем-то подобным?