1. RTC. При попытке сбросить флаг периодического прерывания в ISR описанным в мануале приемом (чтение SR), флаг запроса ничуть не сбрасывается. Чтобы его сбросить, нужно применить шаманский прием, найденный AlexanrY на "сахара". Т.е. переделать подпрограмму RTC_ClearFlag 91x_rtc.c библиотеки. Она должна выглядеть так:
Цитата
void RTC_ClearFlag(u32 RTC_FLAG)
{
vu32 tmp;
if (RTC_FLAG == RTC_FLAG_Per){
tmp= RTC->CR;
RTC->CR&=~0x0F0000;// clear prediv
if(RTC->SR);
RTC->CR =tmp;// restore prediv
}
else if (RTC_FLAG == RTC_FLAG_Alarm) RTC->CR&=~0x100000;
else if (RTC_FLAG == RTC_FLAG_Tamper) RTC->CR&=~0x1;
}
{
vu32 tmp;
if (RTC_FLAG == RTC_FLAG_Per){
tmp= RTC->CR;
RTC->CR&=~0x0F0000;// clear prediv
if(RTC->SR);
RTC->CR =tmp;// restore prediv
}
else if (RTC_FLAG == RTC_FLAG_Alarm) RTC->CR&=~0x100000;
else if (RTC_FLAG == RTC_FLAG_Tamper) RTC->CR&=~0x1;
}
2. ENET. Периодически генерит так называемые Spurious Interrupts. Если не инициализировать DefaultVector в VIC, то приложение будет спорадически ресетиться и трудно понять почему. Способ борьбы также шаманский- создать в 91x_it.c пустой обработчик Spurious Interrupts и направить на него DefaultVector .
Цитата
void Spurious_Interrupts_Handler()
{//--------------------------
VIC0->VAR = 0xFF;
VIC1->VAR = 0XFF;
}
{//--------------------------
VIC0->VAR = 0xFF;
VIC1->VAR = 0XFF;
}
Запускать VIC в работу так
Цитата
void VIC_Init()
{//------
SCU_AHBPeriphClockConfig(__VIC, ENABLE);
VIC_DeInit();
VIC0->DVAR = (u32)Spurious_Interrupts_Handler;
VIC1->DVAR = (u32)Spurious_Interrupts_Handler;
//.....any else......
}
{//------
SCU_AHBPeriphClockConfig(__VIC, ENABLE);
VIC_DeInit();
VIC0->DVAR = (u32)Spurious_Interrupts_Handler;
VIC1->DVAR = (u32)Spurious_Interrupts_Handler;
//.....any else......
}