Прерывание по TIM1 update

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров

Сообщение Карась »

Привет! Здесь снова Карась.

Есть плата 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. Так, что прошу помочь и сильно не ругать.
Контактная информация:
Реклама
Открыл глаза
Сообщения: 67
Зарегистрирован: Ср май 28, 2008 14:33:11
Откуда: Россия, Саров

Сообщение Карась »

Нашёл ошибку. Она была допущена по элементарной невнимательности. Всё дело было вот в этой строчке:

Код: Выделить всё

TIM1->DIER &= ~TIM_DIER_UIE
Здесь запрещается прерывание, а должно разрешаться. Правильно будет так:

Код: Выделить всё

TIM1->DIER |= TIM_DIER_UIE
Просто забыл исправить строчку после того, как экспериментировал без использования прерывания.
Контактная информация:
Реклама
Ответить

Вернуться в «ARM»