ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
23 ноября
1321039
Dingo (17.06.2023 08:04, просмотров: 135)
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

для чего всё это:

https://caxapa.ru/1319764.html