oleg110592 писал(а):моя твоя не понимай(с), наверное это очень секретная разработка - клещами вытягивать нужно
Так оно и не принципиально в контексте обсуждаемого вопроса. Я заостряюсь на самой аппаратной проблеме, а не на прикладном программном алгоритме.
хотелось бы тоже разобраться - непонятно для чего именно используется этот код - если просто "запуститься, досчитать до конца и остановиться", то какова же польза от этого кода - можно просто заменить, например четырьмя NOPами и вопросов бы не было (NOPы у стмов, думаю корректно работают).
Как избежать проблемы с запуском таймера я описывал в самом первом сообщении по этому вопросу.
А если логически рассуждать для чего может нужен "режим единичного прогона таймера", кроме как для организации задержки, в голову не приходит других вариантов.
А мне приходит.

Представьте, что в линию надо выдать управляющий сигнал в виде установки уровней в точной временной последовательности (единицу держим столько-то, ноль потом столько-то и т.п.). Можно задержками от импульса к импульсу время отсчитывать, а можно повесить это дело на разные каналы таймера, где по событию переполнения счетчика соответствующего канала будет выставляться нужный уровень. Второе решение и точнее и проще в описании. Запуск таймера в "однопроходном" режиме удобен тем, что не надо отвлекаться на остановку таймера и возврат его к исходному состоянию. По окончанию счета он сам себя "восстанавливает". Это позволяет упростить процедуру многократного перезапуска с минимальными временными издержками.
А по коду непонятно почему TIM2_CR1_OPM = 1; вначале, логичнее было бы перезапустить таймер а уж потом... указать какой режим и запустить.
Как-то я не очень догоняю глубинный смысл этой фразы. Перезапустить, а потом запустить?... Не хватает только "подпустить" и "надпустить" в качестве последовательных шагов дальнейшего развития сценария.

Зачем нужен TIM2_CR1_URS = 1;? Вроде для прерываний используется.
Эта команда запрещает поднятие флагов TIM2_SR1_*IF, которые при "ручном" сбросе счетчиков никому не интересны.
Где загрузка ARR?
На бороде.

Так может попробовать:
Да ни к чему мне пробовать. Мне не понравилось, что железный таймер позволяет себе одним и тем же кодом, то запускаться, то нет. Такого не должно быть в принципе. Оно должно либо работать всегда, либо никогда, чего бы там ни утверждали мифологические чудовища.