EXTI_RTSR — маска включения детектора нарастающего фронта сигнала;
EXTI_FTSR — маска включения детектора спадающего фронта сигнала;
EXTI_PR — флаги сработавшего детектора. Тут их и надо сбрасывать, Чтоб покинуть прерывание.
Номер линии совпадает с номером пина в порту. Разрешается лишь выбирать, с какого порта эта линия берётся: с порта A или с порта B, или ещё откуда. Это номера от 0 до 15. Остальные линии подключены к разным сигналам.
Первые 5 линий имеют индивидуальные вектора EXTI0_IRQHandler, EXTI1_IRQHandler, EXTI2_IRQHandler, EXTI3_IRQHandler, EXTI4_IRQHandler. Потом линии делятся на две группы, 5-9 (EXTI9_5_IRQHandler) и 10-15 (EXTI15_10_IRQHandler). В этих векторах ещё потребуется опросить регистр EXTI_PR, чтоб понять, какая из линий сработала.
(от
Ещё хорошо почитать
Например,
#define PORTC0_8_TO_IN GPIOC->CRL = 0x88888888,GPIOC->ODR &= ~0x00FF // pull-down input
#define PORTC0_8_TO_OUT GPIOC->CRL = 0x33333333 // push-pull output 50 MHz
#define PC8BIN (*((volatile unsigned long *) 0x42220120 )) //bit banding for PC8
#define PC9BIN (*((volatile unsigned long *) 0x42220124 )) //bit banding for PC9
#define PC10BIN (*((volatile unsigned long *) 0x42220128 )) //bit banding for PC10
#define PC11BIN (*((volatile unsigned long *) 0x4222012C )) //bit banding for PC11 // es Address A0
#define PC12BIN (*((volatile unsigned long *) 0x42220130 )) //bit banding for PC12 // es Address A1
#define PC13BIN (*((volatile unsigned long *) 0x42220134 )) //bit banding for PC13 // es Address A2
void InterruptCS_On(void){
NVIC_SetPriority(EXTI9_5_IRQn, 15);
NVIC_EnableIRQ(EXTI0_IRQn);
EXTI->IMR &= ~EXTI_IMR_MR0;
EXTI->EMR &= ~EXTI_EMR_MR0;
RCC->APB2ENR|=RCC_APB2ENR_AFIOEN; // Alternative functions clocking
AFIO->EXTICR[2]|=AFIO_EXTICR3_EXTI8_PC; // AFIO_EXTICR3
EXTI->FTSR |= EXTI_FTSR_TR8; // falling edge
EXTI->RTSR |= EXTI_RTSR_TR8; //and rising edge
EXTI->IMR|=EXTI_IMR_MR8; // Line 8 in mask (enable interrupt)
NVIC_EnableIRQ (EXTI9_5_IRQn);
}
void EXTI9_5_IRQHandler (void)
{
if (EXTI->PR & (1<<8)) // interrupt from EXTI8?
{
if(PC8BIN){ // at rising edge PORTC to read (input)
PORTC0_8_TO_IN;
}
else { // at falling edge
if(PC11BIN|PC12BIN|PC13BIN){ //if Address != 0
if(PC9BIN){ //WE is 1
PORTC0_8_TO_OUT;
GPIOC->ODR = (GPIOC->ODR & 0xFF00) + TestData + 1;
}
else{
TestData = (GPIOC->IDR)&0x00FF;
}
}
}
EXTI->PR |= (1<<8); // clear EXTI8
// Обработка события EXTI8
}
}