Есть некое устройство построенное на STR711FR2, в процессе его кодинга было установлено что проц иногда теряет внешние прерывания. Используются прерывания с портов P0.2 и P0.1 оба по переднему фронту (хотя это не важно). Для доказательства этого сделали маленький проект.
настройка
int main(void)
{
XTI_Init();
XTI_LineModeConfig(XTI_Line9 | XTI_Line10, XTI_FallingEdge);
XTI_LineConfig(XTI_Line9, ENABLE);
XTI_LineConfig(XTI_Line10, ENABLE);
XTI_ModeConfig(XTI_Interrupt, ENABLE);
EIC_IRQChannelPriorityConfig(XTI_IRQChannel,1);
EIC_IRQChannelConfig(XTI_IRQChannel,ENABLE);
GPIO_Config(GPIO0,1,GPIO_OUT_PP);
GPIO_Config(GPIO0,(1<<1),GPIO_IN_TRI_CMOS);
GPIO_Config(GPIO0,(1<<2),GPIO_IN_TRI_CMOS);
GPIO_Config(GPIO1,(1<<5),GPIO_OUT_PP);
GPIO_Config(GPIO1,(1<<6),GPIO_OUT_PP);
GPIO_BitWrite(GPIO1,5,0); //--тест
GPIO_BitWrite(GPIO1,6,0); //--тест
EIC_IRQConfig(ENABLE);
while(1); /* infinite loop */
}
обработчик встроен в 71x_it.c в виде
void XTI_IRQHandler(void)
{
/* Change the first led of the GPIO0 port pins state */
u16 INT_X=0;
INT_X=XTI_InterruptLineValue();
if (INT_X & XTI_Line10)
{
GPIO_BitWrite(GPIO1,5,1);
GPIO_BitWrite(GPIO1,5,0);
}
if (INT_X & XTI_Line9)
{
GPIO_BitWrite(GPIO1,6,1);
GPIO_BitWrite(GPIO0,0,!GPIO_BitRead(GPIO0,0));
GPIO_BitWrite(GPIO1,6,0);
}
/* Clear the pending bits */
XTI_PendingBitClear(INT_X);
}
Юзаю uVision4
так вот было подмечено что когда фронты импульсов прерываний на расстоянии более 14 мкс друг от друга то всё нормально на осциллограммах мы видим оба захода (импульсы на портах), когда они входят в зону менее 14 мкс встречаются пропуски. потом когда они равняются друг к другу всё опять работает исправно.
Кто такое наблюдал, просьба рассказать как побороли, но не как обошли. Это просто очень важный момент в нашей системе.