stm32f407 TIM2 ведёт себя некорректно

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
jazz393
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

stm32f407 TIM2 ведёт себя некорректно

Сообщение jazz393 »

IDE - IAR , настраиваю таймер 2, пытаюсь добиться хоть какой-то корректной работы...он очень долго считает, а потом виснет в прерывании...
это инициализация системы тактирования - использую внешний кварц на 8 Мгц (надо сказать что UART настроенный на 9600 работает как надо, т.е. тут вроде всё как надо должно быть...)

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

void init_RCC()
    {
    RCC->CR |= HSEBYP | HSEON;      // включаем HSE
    RCC->CFGR|= SW_0;               // тактируем SYS_CLK от HSE

    RCC->APB2ENR |= SPI1_EN;         // вкл тактирование spi_1
    RCC->APB2ENR |= USART1_EN;       // вкл тактирование uart_1

    RCC->APB1ENR |= TIM2_EN;         // enable timer 2
    RCC->AHB1ENR |= GPIOA_EN;        // вкл тактирование PORTA
    RCC->AHB1ENR |= GPIOB_EN;        // вкл тактирование PORTB
    RCC->AHB1ENR |= GPIOD_EN;        // вкл тактирование PORTD
    RCC->AHB1ENR |= GPIOE_EN;        // вкл тактирование PORTD
    }

инициализация самого таймера

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

void init_TIM2()
    {
    RCC->APB1ENR |= TIM2_EN;         // enable timer 2

    TIM2->CR1 |= TIM_CR1_ARPE;//
    TIM2->DIER |= TIM_DIER_UIE; // interrupt enable

    TIM2->PSC = 8000 - 1; // по идее если у нас APB1 работает на 8Мгц, а я не ставил никаких делителей итп,
    TIM2->ARR = 200;        // то с данными настройками прерывание каждые 200мс

    NVIC_EnableIRQ (TIM2_IRQn);
    TIM2->CR1 |= CEN;   //enable timer
    }

сам обработчик:

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

void TIM2_IRQHandler(void)
   {
   if(!counter)
      {
      counter=1;
      add_task(red_on);
      }
   else
      {
      counter=0;
      add_task(red_off);
      }
   TIM2->SR &= ~TIM_SR_UIF;
   return;
   }
jazz393
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

Re: stm32f407 TIM2 ведёт себя некорректно

Сообщение jazz393 »

проблему решил, почему-то в RCC->CFGR в SW записывалась 0x3 вместо 0x1 ...
jazz393
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

Re: stm32f407 TIM2 ведёт себя некорректно

Сообщение jazz393 »

Но сначала таймер почему-то должен досчитать до 0xFFFFFFFF , после чего начинает работать как надо....o_0
настроил таймер 6 аналогично, она работает нормально сразу...
uk8amk
Поставщик валерьянки для Кота
Сообщения: 2222
Зарегистрирован: Вт ноя 27, 2007 11:32:06
Откуда: Tashkent

Re: stm32f407 TIM2 ведёт себя некорректно

Сообщение uk8amk »

почему-то в RCC->CFGR в SW записывалась 0x3

Потому что в SW[1:0] могут нахожиться какие-то значения.
Так должно быть правильней:

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

temp = RCC->CFGR;
temp &= ~(SW_1 | SW_0);
temp |= SW_0;
RCC->CFGR = temp;


Но сначала таймер почему-то должен досчитать до 0xFFFFFFFF

Потому что вы включили ARPE, но ещё не дали UEV или UGR.
Ответить

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