Привет! Здесь снова Карась.
Есть плата STM32F4Discovery.
Есть вот такой код:
Код:
#include "stm32f4xx.h"
#include "system_stm32f4xx.h"
void TIM1_UP_TIM10_IRQHandler(void)
{
TIM1->SR &= ~TIM_SR_UIF;
GPIOD->ODR ^= 0x4000;
}
int main(void)
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN;
GPIOD->MODER |= GPIO_MODER_MODER15_0 | GPIO_MODER_MODER14_0;
GPIOD->OTYPER &= ~(GPIO_OTYPER_OT_15 | GPIO_OTYPER_OT_14);
GPIOD->OSPEEDR &= ~(GPIO_OSPEEDER_OSPEEDR15 | GPIO_OSPEEDER_OSPEEDR14);
NVIC_EnableIRQ(TIM1_UP_TIM10_IRQn);
__enable_irq();
RCC->APB2ENR |= RCC_APB2ENR_TIM1EN;
TIM1->DIER &= ~TIM_DIER_UIE;
TIM1->ARR = 42000;
TIM1->PSC = 3000;
TIM1->CNT = 0;
TIM1->CR1 &= ~ TIM_CR1_UDIS;
TIM1->CR1 |= TIM_CR1_URS | TIM_CR1_CEN;
GPIOD->ODR |= 0x8000;
for(;;){
}
}
По замыслу синий светодиод на PD15 должен гореть постоянно, а красный на PD14 переключаться в обработчике прерывания по событию TIM1 update, т.е. мигать.
На деле получается вот что: по прерыванию светодиод на PD15 не горит вообще, однако, если не использовать прерывание, а вместо этого отлавливать установку флага TIM_SR_UIF в основном цикле и там же переключать пин PD15 и сбрасывать флагTIM_SR_UIF, то всё нормально - светодиод мигает.
Отсюда вывод: похоже, что я вообще не попадаю в обработчик прерывания. Вопрос - почему? Подозреваю, что причина в какой-нибудь глупой нубовской ошибке - ведь я только начинаю осваивать платформу STM32. Так, что прошу помочь и сильно не ругать.