Есть проблема с настройкой внешних прерываний в STM32F103
Необходимо по заднему фронту кнопки зажигать/гасить светодиод. Кнопка висит на PB15.
Светодиод рабочий на 100 процентов также как и кнопка.
Код обработчика прерываний и настройки внешних прерываний.
Код
void EXTI3_IRQHandler(void)
{
static unsigned int led_stat = 0;
//if(EXTI->PR & EXTI_IMR_MR15)
{
EXTI->PR = EXTI_IMR_MR15; //clear pendig interrupt
if(led_stat == 0)
{
led_stat = 1;
SLED_SET(SLED_0_MSK);
}
else
{
led_stat = 0;
SLED_CLR(SLED_0_MSK);
}
}
_putcharDebug('\r');
_putcharDebug('e');
_putcharDebug('\n');
}
void extIntInit(void)
{
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPBEN;
__no_operation();
AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI15_PB;
EXTI->FTSR = EXTI_FTSR_TR15; //falling edge
//EXTI->RTSR = SW2_EXT_INT_BIT_MSK; //risig edge
NVIC_SetPriority(EXTI3_IRQn, EXTI3_IRQ_PRIO);
NVIC_EnableIRQ(EXTI3_IRQn);
EXTI->IMR = EXTI_IMR_MR15;
//EXTI->EMR = EXTI_IMR_MR15;
}
{
static unsigned int led_stat = 0;
//if(EXTI->PR & EXTI_IMR_MR15)
{
EXTI->PR = EXTI_IMR_MR15; //clear pendig interrupt
if(led_stat == 0)
{
led_stat = 1;
SLED_SET(SLED_0_MSK);
}
else
{
led_stat = 0;
SLED_CLR(SLED_0_MSK);
}
}
_putcharDebug('\r');
_putcharDebug('e');
_putcharDebug('\n');
}
void extIntInit(void)
{
RCC->APB2ENR |= RCC_APB2ENR_AFIOEN | RCC_APB2ENR_IOPBEN;
__no_operation();
AFIO->EXTICR[3] = AFIO_EXTICR4_EXTI15_PB;
EXTI->FTSR = EXTI_FTSR_TR15; //falling edge
//EXTI->RTSR = SW2_EXT_INT_BIT_MSK; //risig edge
NVIC_SetPriority(EXTI3_IRQn, EXTI3_IRQ_PRIO);
NVIC_EnableIRQ(EXTI3_IRQn);
EXTI->IMR = EXTI_IMR_MR15;
//EXTI->EMR = EXTI_IMR_MR15;
}
Программа не большая - содержит 3 источника прерываний (UART1, TIM3, EXT3). UART1 и TIM3 работают без проблем.
Есть задача сканирования кнопок по таймеру.
При опросе кнопки в задаче сканирования кнопок зажигаются 3 светодиода - т.о. пин PB15 рабочий.
4й светодиод проверен и должен зажигаться только по прерыванию. Код настройки внешних прерываний составлен на основе документации, также сравнил с примерами из интернета и тем, что генерирует stm32Cube. Различий я не вижу.
При нажатии кнопки PB15 программа не виснет и не перезагружается, но и прерывание EXT3 не генерируется.
Может кто что подскажет по настройкам. Спасибо.