Опять таймер
Добавлено: Пн мар 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
Вопрос - это можно реализовать или забыть и "ездить" на других способах?
Возникла необходимость необычного режима работы таймера. Пусть будет 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
Вопрос - это можно реализовать или забыть и "ездить" на других способах?