Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Поведение таймеров в STM32.
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
KnightIgor
Вопросов нет. Хочу указать на замаскированные грабли в STM32.

Таймеры в них имеют предварительный делитель частоты Prescaler (PSC). Как честно и описано в доках, этот регистр имеет скрытый буфер, доступный для программы, а собственно действующий регистр загружается новым значением из того буфера только в момент выработки события переполнения (ну, когда счетчик CNT достигнет ARR). Из этого логически следует, что при начальной инициализации в программе, если в PSC требуется что-то отличное от 0, то оно будет действовать только после первого прохода счетика! И это оказалось для меня граблями, т.к. при первом проходе первое событие выработалось у меня значительно раньше, что оказалось критично в некотором приложении.

Короче, work around вполне прост и организуется штатными средствами: после записи требуемого значения в PSC надо программно сгенерировать событие переполнения/обновления установкой бита UG в регистре EGR таймера. Это пропишет рабочий регистр PSC значением из буферного.
AHTOXA
Цитата(KnightIgor @ Sep 12 2013, 18:40) *
Хочу указать на замаскированные грабли в STM32.

Грабли сии уже неоднократно замечены и заботливо огорожены sm.gif
jcxz
Да ужж.... Однако - сколько таких грабель в STM32!... И за что его местный народ так любит? не пойму... wacko.gif
Rash
почему бы просто не заинлайнить ф-цию из StdLib TIM_PrescalerConfig и не иметь проблем
Код
// Конфигурация предделителя таймера TIMx (TIMx Prescaler)
// [TIMx]              - где 'х' может быть от 1 до 14.  Выбор таймера TIM
// [Prescaler]         - Значение предделителя
// [TIM_PSCReloadMode] - определяет тип перезагрузки предделителя таймера
//                       TIM_PSCReloadMode_Update     - Предделитель будет изменён при событии обновления
//                       TIM_PSCReloadMode_Immediate  - Предделитель будет изменён сразу
static inline void TIM_PrescalerConfig(TIM_TypeDef* TIMx, uint16_t Prescaler, uint16_t TIM_PSCReloadMode)
{
  // Установить значение предделителя
  TIMx->PSC = Prescaler;
  // Установить или Сбросить UG бит
  TIMx->EGR = TIM_PSCReloadMode;
}
MK2
Цитата(jcxz @ Sep 13 2013, 05:33) *
Да ужж.... Однако - сколько таких грабель в STM32!... И за что его местный народ так любит? не пойму... wacko.gif

ну наверно за то что они известны и разжеваны
pitt
Цитата(jcxz @ Sep 12 2013, 22:33) *
Да ужж.... Однако - сколько таких грабель в STM32!... И за что его местный народ так любит? не пойму... wacko.gif

Грабли, а точнее errata, есть у всех кристаллов, а вот заставить, в конце концов, делать именно то, что надо, STM32 позволяет, а другие не всегда.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.