Опять таймер

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
С.Н.
Потрогал лапой паяльник
Сообщения: 306
Зарегистрирован: Пн окт 26, 2020 08:37:51
Откуда: г.Волгоград

Опять таймер

Сообщение С.Н. »

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

Вопрос - это можно реализовать или забыть и "ездить" на других способах?
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
u37
Сверлит текстолит когтями
Сообщения: 1192
Зарегистрирован: Пн май 01, 2017 20:01:45

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

Сообщение u37 »

Всегда можно переключить этот порт из Alt в Output с установленным ODR=0, а потом вернуть в Alt.
С.Н.
Потрогал лапой паяльник
Сообщения: 306
Зарегистрирован: Пн окт 26, 2020 08:37:51
Откуда: г.Волгоград

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

Сообщение С.Н. »

[uquote="u37",url="/forum/viewtopic.php?p=4793957#p4793957"]Всегда можно переключить этот порт из Alt в Output с установленным ODR=0, а потом вернуть в Alt.[/uquote]
Пробовал.... Сейчас еще раз покручу..
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
Adrift
Вымогатель припоя
Сообщения: 539
Зарегистрирован: Вт окт 01, 2024 15:22:33

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

Сообщение Adrift »

В режиме PWM разве не то же самое происходит? Тем более у TIM4 еще и One-pulse mode должен быть.
С.Н.
Потрогал лапой паяльник
Сообщения: 306
Зарегистрирован: Пн окт 26, 2020 08:37:51
Откуда: г.Волгоград

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

Сообщение С.Н. »

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


Добавлю. Проблема отпала. Вернулся к исходному режиму.
ФУОЗ на платформе Ардуино: https://radiokot.ru/forum/viewtopic.php ... 6#p4366626
ВК - "ФУОЗ на микроконтроллере Atmega328P (МПСЗ)"
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

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

Сообщение 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" в "альтернативную функцию". И обратно.
Ответить

Вернуться в «ARM»