Перейти к содержанию
    

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

Добрый день. У меня контроллер 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МГц. Причем частоту фиксирую непосредственно перед инициализацией таймеров.

8ca0c7a1a559.jpg

Из даташита на таймеры на STM32 я вижу формулу, по ней произвожу расчет выходной частоты

d07e6131dca7.jpg

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

в чем может быть косяк?

Может, в этом?

TIM_OCMode_Toggle

 

Рекомендую TIM_OCMode_PWM1 или TIM_OCMode_PWM2, но и CCR1 нужно будет определить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...

в чем может быть косяк?

Считаем. Входная синхронизация 72МГц. Предделитель 8, то есть на вход счетчика подается частота 9МГц. Чтобы возникло событие сравнения, нужно, чтобы сравнялись значения счетного регистра и регистра сравнения, а это значит, что частота событий этих совпадений будет равна 9МГц/18000 = 500Гц. Но полный период сигнала, который Вы видите на осциллографе, равен сумме двух таких событий совпадения таймера. 1/500 = 0,002с, 0,002*2 = 0,004. Отсюда 1/0,004 = 250Гц. Все верно.

Ну а насчет счетчика повторений Repetition Counter - он при каждом событии переполнения декрементируется. И как только он равен 0 и возникло событие переполнения - выставляется флаг Update и формируется прерывание (если разрешено). В режиме ШИМ используется для кратного ограничения частоты ШИМ. В мануале ж четко все написано...

Изменено пользователем Arlleex

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...