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

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

Сообщение 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;
	}
Реклама
Встал на лапы
Сообщения: 118
Зарегистрирован: Ср фев 05, 2014 18:54:39

Сообщение jazz393 »

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

Сообщение jazz393 »

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

Сообщение 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»