Рейтинг:  0 / 5

Звезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активнаЗвезда не активна
 
  EXTI_IMR — маска разрешения прерывания. Бит 0 отвечает за нулевую линию, бит 1 за первую и т.д;
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, чтоб понять, какая из линий сработала.

(от сюда )

Ещё хорошо почитать здесь, здесь... Ну и REF_manual_STM32F100x

Например,


#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
    }
}