STM32F107RCT6 Настройки таймера

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Auratos
Родился
Сообщения: 16
Зарегистрирован: Пн окт 19, 2015 09:19:16

STM32F107RCT6 Настройки таймера

Сообщение Auratos »

Добрый день. У меня контроллер STM32F107RCT6. Настраиваю таймеры TIM1 и TIM2 для генерации частоты на выводах.

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

TIM_TimeBaseInitTypeDef timer;
TIM_OCInitTypeDef TIM_OCConfig;

void TIM1_Init(uint16_t presc, uint16_t period, uint16_t repCnt)
{
  TIM_TimeBaseInitTypeDef timer;
  TIM_OCInitTypeDef TIM_OCConfig;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  // тактирование таймера
  // выход TIM1_CH1 (F1)
  GPIO_mInit(GPIO_Speed_50MHz, GPIO_Mode_AF_PP, GPIOA, GPIO_Pin_8);

  TIM_TimeBaseStructInit(&timer);                       // заполнение поля структуры дефолтными значениями
  timer.TIM_Prescaler = presc;                          // предделитель
  timer.TIM_Period = period;                            // период
  timer.TIM_RepetitionCounter = repCnt;                 // счетчик повторений
  TIM_TimeBaseInit(TIM1, &timer);                       // инициализация TIM1
  TIM_ARRPreloadConfig(TIM1, ENABLE);
  
  TIM1->BDTR |= TIM_BDTR_MOE;                           // включение выхода таймера TIM1
  TIM_OCStructInit(&TIM_OCConfig);
  TIM_OCConfig.TIM_OCMode = TIM_OCMode_Toggle;
  TIM_OCConfig.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OC1Init(TIM1, &TIM_OCConfig);                     // включение канал1 таймера TIM1
  TIM_Cmd(TIM1, ENABLE);                                // включение таймера TIM1_CH1(F1) 
}

TIM1_Init(7, 17999, 1);
TIM2_Init(7, 17999);
Шина APB1 работает на частоте 36МГц, а APB2 - на 72МГц. Причем частоту фиксирую непосредственно перед инициализацией таймеров.
Изображение
Из даташита на таймеры на STM32 я вижу формулу, по ней произвожу расчет выходной частоты
Изображение

Взять, например, таймер TIM1: 72000000 / ((7 + 1) * (17999 + 1) * (0 + 1)) = 500Гц. Но фактически на осциллографе вижу частоту 249,9Гц, то есть делиться ровно в 2 раза. Пробовал на разных частотах - результат тот же. Подскажите, пожалуйста, в чем может быть косяк? И еще одна непонятная ситуация - изменения значения RepetitionCounter не влияет на выходную частоту. Пробовал и 1, и 2, и 170 - результат один. Как работает этот RepetitionCounter?
Реклама
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32F107RCT6 Настройки таймера

Сообщение Myp3ik »

Чем компилируете ? Случайно не Keil ?
Иван Сусанин - первый полупроводник :solder:
Реклама
Auratos
Родился
Сообщения: 16
Зарегистрирован: Пн окт 19, 2015 09:19:16

Re: STM32F107RCT6 Настройки таймера

Сообщение Auratos »

[uquote="Myp3ik",url="/forum/viewtopic.php?p=3389580#p3389580"]Чем компилируете ? Случайно не Keil ?[/uquote]
Нет, IAR
Аватара пользователя
Myp3ik
Мучитель микросхем
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Re: STM32F107RCT6 Настройки таймера

Сообщение Myp3ik »

Добавьте на всякий случай

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

timer.TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
Иван Сусанин - первый полупроводник :solder:
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

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