Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Чт май 31, 2018 12:16:50

Добрый день. У меня контроллер 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?

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

Чт май 31, 2018 13:19:05

Чем компилируете ? Случайно не Keil ?

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

Чт май 31, 2018 13:20:03

Чем компилируете ? Случайно не Keil ?

Нет, IAR

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

Чт май 31, 2018 13:34:12

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

Код:
timer.TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
Ответить