KnightIgor
Sep 12 2013, 12:40
Вопросов нет. Хочу указать на замаскированные грабли в STM32.
Таймеры в них имеют предварительный делитель частоты Prescaler (PSC). Как честно и описано в доках, этот регистр имеет скрытый буфер, доступный для программы, а собственно действующий регистр загружается новым значением из того буфера только в момент выработки события переполнения (ну, когда счетчик CNT достигнет ARR). Из этого логически следует, что при начальной инициализации в программе, если в PSC требуется что-то отличное от 0, то оно будет действовать только после первого прохода счетика! И это оказалось для меня граблями, т.к. при первом проходе первое событие выработалось у меня значительно раньше, что оказалось критично в некотором приложении.
Короче, work around вполне прост и организуется штатными средствами: после записи требуемого значения в PSC надо программно сгенерировать событие переполнения/обновления установкой бита UG в регистре EGR таймера. Это пропишет рабочий регистр PSC значением из буферного.
AHTOXA
Sep 12 2013, 16:15
Цитата(KnightIgor @ Sep 12 2013, 18:40)

Хочу указать на замаскированные грабли в STM32.
Грабли сии уже неоднократно замечены и
заботливо огорожены
Да ужж.... Однако - сколько таких грабель в STM32!... И за что его местный народ так любит? не пойму...
почему бы просто не заинлайнить ф-цию из 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;
}
Цитата(jcxz @ Sep 13 2013, 05:33)

Да ужж.... Однако - сколько таких грабель в STM32!... И за что его местный народ так любит? не пойму...

ну наверно за то что они известны и разжеваны
Цитата(jcxz @ Sep 12 2013, 22:33)

Да ужж.... Однако - сколько таких грабель в STM32!... И за что его местный народ так любит? не пойму...

Грабли, а точнее errata, есть у всех кристаллов, а вот заставить, в конце концов, делать именно то, что надо, STM32 позволяет, а другие не всегда.