NUC970, непонятное с прерываниями. Хочу прерывания по falling edge
от нескольких ножек, всё работает. Теоретический максимум
срабатываний 30кГц/2кГц = 15 раз. А у меня очень редко бывает
сильно больше. Причём непонятно почему, ведь при попадании в
прерывания источник от соответствующего разряда должен отключаться.
Может что-нибудь надо AIC Advanced Interrupt Controller объяснить в регистрах? (Меня смущает в примерах от производителя
обращение к
<i>REG_AIC_SCCRH</i>
Функция ADCm_Next() вызывается так же из прерывания таймера 2 кГц, где разрешает прерывания по спаду на соответствующих битах GPIO. Конечно, флаги GPIO->ISR сбрасываются перед разрешением. Есть мысли куда копать, что проверять?
static void GPIO_PrepIrqDRDY(void)
{
/* Configure pin to falling-edge trigger */
// PG10, PG12, PG13
PORT_RDY->IMD &= rdy_all;
PORT_RDY->IREN &= rdy_all;
PORT_RDY->IFEN &= rdy_all;
/* Enable GPIOI interrupt */
sysInstallISR(IRQ_LEVEL_1, GPIO_IRQn, (PVOID)GPIO_Handler);
sysSetLocalInterrupt(ENABLE_IRQ);
sysEnableInterrupt(GPIO_IRQn);//sysDisableInterrupt(GPIO_IRQn);
}
static void GPIO_Handler(void)
{
UINT32 reg; //reg = inpw(REG_AIC_ISRH);
uint32_t val;
reg = inpw(REG_GPIO_ISR); // Which port call interrupt
switch(reg){
case 0x40: // GPIOG bitmask
for( int k=0; k < ADS_NUM; k++) {
if ( (PORT_RDY->ISR & rdy_msk[k]) != 0 ) {
PORT_RDY->ISR = rdy_msk[k]; // Clear PIN bit.
PORT_RDY->IFEN &= ~rdy_msk[k]; // Stop IC[k] events.
}
}
val = PORT_RDY->IFEN;
if ( 0 == (val & rdy_all) ) { // All DRDY occured.
ADCm_Next( mEV_IO, __LINE__ ); // Parse events.
}else{ // Catch unusual.
char a=0;
a = (val & rdy_msk[0]) ? a|1 : a;
a = (val & rdy_msk[1]) ? a|2 : a;
a = (val & rdy_msk[2]) ? a|4 : a;
uputchar('A'+a);
}
break;
default:
output("[GPIO_ISR]%8x$\n", reg); conout_flush(); while(1); // WTF?!
break;
}
outpw(REG_AIC_SCCRH, (1<<(56-32))/*0x02000000*/); /* INT56 */ /* Clear GPIO interrupt */
}
Бывает так, тут всё понятно:
.seq: 2749998
.seq: 2751998
.Bseq: 2753998
.seq: 2755998
А бывают и вот такие нежданчики, сильно больше 15 раз подряд:
.seq: 2899998
.seq: 2901998
.GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG