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