Например TDA7294

Форум РадиоКот :: Просмотр темы - Прерывание по TIM1 update
Форум РадиоКот
https://radiokot.ru/forum/

Прерывание по TIM1 update
https://radiokot.ru/forum/viewtopic.php?f=59&t=98577
Страница 1 из 1

Автор:  Карась [ Ср дек 25, 2013 17:42:23 ]
Заголовок сообщения:  Прерывание по TIM1 update

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

Есть плата 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. Так, что прошу помочь и сильно не ругать.

Автор:  Карась [ Ср дек 25, 2013 18:01:46 ]
Заголовок сообщения:  Re: Прерывание по TIM1 update

Нашёл ошибку. Она была допущена по элементарной невнимательности. Всё дело было вот в этой строчке:
Код:
TIM1->DIER &= ~TIM_DIER_UIE

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

Просто забыл исправить строчку после того, как экспериментировал без использования прерывания.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/