Пример кода конечно ужасен, но меня поразил советчик.
Цитата:
URS регистра TIM_CR1 чтобы данные вступили в силу
Что за бред то. URS пропускает прерывание только от переполнения счетчика.
"This is to avoid generating both update and capture interrupts when clearing the counter on the capture event".
Что он в этом примере будет установлен, что нет, на что это может повлиять?
Я думаю это будет многим интересно, но я не претендую на истину

. И для STM8 и STM32.
PSC и ARR это не просто регистры. У них есть предварительные регистры, в которые мы и пишем значения, и есть рабочие (теневые) регистры, в которые данные загружаются из предварительных. И эта загрузка происходит по событию обновления UEV, которое вызывается переполнением счетчика.
То есть автор записал в предварительные регистры свои значения, а в реальных остались (после старта) значения по умолчанию, что сразу и привело к переполнению счетчика и к UEV, где значения PSC и ARR автора и загрузились в рабочие регистры.
И если в рабочий ARR можно сразу записать, если не устанавливать ARPE, то рабочий PSC можно обновить только по UEV!
Если нужно сразу обновить рабочие PSC и ARR, а не когда уже переполнится счетчик, то нужно программно вызвать UEV. Это и делается установкой UG в EGR. Принудительный программный вызов UEV. Что автор темы в конце концов и сделал, но никому не объяснил почему так. Только UIF еще после этого нужно сбросить.
Ну и до кучи,
формула расчета таймера стр. 11-12, а то какие варианты только не увидишь.
Update_event = TIM_CLK/((PSC + 1)*(ARR + 1)*(RCR + 1))
То есть загружать в счетчики PSC и ARR нужно рассчитанные значения - 1.
Исключение регистр PSCR у STM8 со степень двойки, тут просто степень двойки как есть.