Auratos 0 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба Добрый день. У меня контроллер 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 11 31 мая, 2018 Опубликовано 31 мая, 2018 · Жалоба в чем может быть косяк? Может, в этом? TIM_OCMode_Toggle Рекомендую TIM_OCMode_PWM1 или TIM_OCMode_PWM2, но и CCR1 нужно будет определить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 31 мая, 2018 Опубликовано 31 мая, 2018 (изменено) · Жалоба ... в чем может быть косяк? Считаем. Входная синхронизация 72МГц. Предделитель 8, то есть на вход счетчика подается частота 9МГц. Чтобы возникло событие сравнения, нужно, чтобы сравнялись значения счетного регистра и регистра сравнения, а это значит, что частота событий этих совпадений будет равна 9МГц/18000 = 500Гц. Но полный период сигнала, который Вы видите на осциллографе, равен сумме двух таких событий совпадения таймера. 1/500 = 0,002с, 0,002*2 = 0,004. Отсюда 1/0,004 = 250Гц. Все верно. Ну а насчет счетчика повторений Repetition Counter - он при каждом событии переполнения декрементируется. И как только он равен 0 и возникло событие переполнения - выставляется флаг Update и формируется прерывание (если разрешено). В режиме ШИМ используется для кратного ограничения частоты ШИМ. В мануале ж четко все написано... Изменено 31 мая, 2018 пользователем Arlleex Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться