Страница 1 из 1

Опять таймер

Добавлено: Пн мар 02, 2026 17:41:20
С.Н.
День добрый.
Возникла необходимость необычного режима работы таймера. Пусть будет TIM4 stm32f303.
Плата разведена, изготовлена и работает в одном из штатных режимов таймера, но....

Очень хочется скрестить режим работы таймера "Output compare CH1" c программным управлением выхода CH1.
Пусть установлен режим "Active level on match" CH1 не далеко от предела, предписанного регистром ARR. Тут все по "букварю" - линия активируется там где надо.
Далее происходит событие UPLOAD и попадаем в программу обработки прерывания, где надо сделать определенные манипуляции и... как-то деактивировать линию выхода CH1 - к ней привязана микросхема и нужен спад...
Отмечу, что реализовать альтернативный способ управления с помощью других механизмов - нет проблем. Но хочется именно так.

Таким образом мои рассуждения по этому вопросу:
1. Прямое управление линией блокировано.
2. Флаг события TIM_FLAG_CC1 сбрасывал - не помогло.
3. Пытался "играться" с переключением выхода таймера в режим "Forced inactive" с последующим возвращением в режим "Active level on match". Тоже не хочет работать, наверное из-за какой-то защиты. Не понял как с ней справиться.
TIM4->CCMR1 &= ~TIM_CCMR1_OC1M; // Очистка битов режима
TIM4->CCMR1 |= TIM_OCMODE_FORCED_INACTIVE << 4; // Установка режима принудительного неактивного
и сразу
TIM4->CCMR1 &= ~TIM_CCMR1_OC1M; // Очистка битов режима
TIM4->CCMR1 |= TIM_OCMODE_ACTIVE << 4; // Установка режима OutputCompare

Вопрос - это можно реализовать или забыть и "ездить" на других способах?

Re: Опять таймер

Добавлено: Пн мар 02, 2026 18:16:56
u37
Всегда можно переключить этот порт из Alt в Output с установленным ODR=0, а потом вернуть в Alt.

Re: Опять таймер

Добавлено: Пн мар 02, 2026 18:25:37
С.Н.
[uquote="u37",url="/forum/viewtopic.php?p=4793957#p4793957"]Всегда можно переключить этот порт из Alt в Output с установленным ODR=0, а потом вернуть в Alt.[/uquote]
Пробовал.... Сейчас еще раз покручу..

Re: Опять таймер

Добавлено: Пн мар 02, 2026 18:28:03
Adrift
В режиме PWM разве не то же самое происходит? Тем более у TIM4 еще и One-pulse mode должен быть.

Re: Опять таймер

Добавлено: Пн мар 02, 2026 18:39:27
С.Н.
[uquote="Adrift",url="/forum/viewtopic.php?p=4793961#p4793961"]В режиме PWM разве не то же самое происходит? Тем более у TIM4 еще и One-pulse mode должен быть.[/uquote]
Этот режим сейчас и работает. Но поскольку спад, который мне нужен, всегда в фиксированном по времени месте относительно события UPDATE, то это меня поджимает по скорости выполнения программы между событиями UPDATE. Хотелось бы что-то более асинхронное по выполнению и синхронное по началу.


Добавлю. Проблема отпала. Вернулся к исходному режиму.

Re: Опять таймер

Добавлено: Ср мар 04, 2026 19:51:23
jcxz
[uquote="С.Н.",url="/forum/viewtopic.php?p=4793964#p4793964"]то это меня поджимает по скорости выполнения программы между событиями UPDATE.[/uquote]Может если писать код нормально, а не "отрезать хвост кошке по частям" как у вас:
[uquote="С.Н.",url="/forum/viewtopic.php?p=4793946#p4793946"]TIM4->CCMR1 &= ~TIM_CCMR1_OC1M; // Очистка битов режима
TIM4->CCMR1 |= TIM_OCMODE_FORCED_INACTIVE << 4; // Установка режима принудительного неактивного
и сразу
TIM4->CCMR1 &= ~TIM_CCMR1_OC1M; // Очистка битов режима
TIM4->CCMR1 |= TIM_OCMODE_ACTIVE << 4; // Установка режима OutputCompare[/uquote]то и "поджимать" не будет?

PS: Чтобы "скрестить какой-то режим работы выхода таймера c программным управлением выхода", достаточно переключать мультиплексор управления соответствующей ногой из состояния "GPIO" в "альтернативную функцию". И обратно.