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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация