QUOTE (AHTOXA @ Apr 8 2018, 18:08)

Что-то мне смутно припоминается, что после CRC->CR = CRC_CR_RESET надо 3 nop-а. (Как раз Сергей это и раскопал, кстати).
Не, в тот раз мне понадобилось __DSB(); между включением тактирования и RESET. А дальше у меня ПДП настраивалось и этого времени, вероятно, хватало.
А вот сегодня напаролся на такое (ARPE = 1):
CODE
Timer->ARR = DELAY1_TICKS; // cache
Timer->EGR = TIM_EGR_UG; // write cache to ARR
Timer->ARR = DELAY2_TICKS; // cache
Ожидаю прерывание через DELAY1_TICKS (ну плюс-минус), а получаю через DELAY2_TICKS. И пока методом тыка не сделал вот так, ничего не работало:
CODE
Timer->ARR = DELAY1_TICKS; // cache
Timer->EGR = TIM_EGR_UG; // write cache to ARR
__DSB();
Timer->ARR = DELAY2_TICKS; // cache
Кто-нибудь может это объяснить?