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