Как происходит сброс сигнала OCxREF по внешнему событию при использовании бита OCxCE в регистре TIMx->CCMRx?

Как работает функция сброса сигнала OCx_REF в низкий уровень подачей высокого уровня на вход ETRF (External Trigger) в контексте микроконтроллера STM32F103C8T6? Как эту функцию правильно настроить, чтобы сигнал от соседнего порта глушил ШИМ на первом порту? Можете ли вы предоставить пример реализации программы с использованием этой функции?
Изображение к вопросу
Изображение к вопросу
  • 28 января 2024 г. 0:38
Ответы на вопрос 1
В микроконтроллерах STM32 бит OCxCE в регистре TIMx->CCMRx используется для настройки функции "clear enable". Эта функция позволяет сбросить выход OCxREF (Output Compare x REF) в низкий уровень при обнаружении активного события на внешнем входе ETR (External Trigger).

Вот как обычно происходит настройка сброса сигнала OCxREF:

1. Конфигурируется таймер (например, TIM1 или TIM2), который генерирует ШИМ-сигнал. Для этого задаются предделитель, период таймера, режим сравнения и соответствующие значения для сравнения.

2. В регистре CCMR (Capture/Compare Mode Register) соответствующего канала (например, CCMR1 для канала 1) настраивается бит OCxCE, который позволяет сбрасывать сигнал OCxREF в низкий уровень при появлении активного уровня на входе ETR.

3. Конфигурируется источник для внешнего триггера ETRF. Это может быть вход GPIO, который устанавливается на высокий уровень для сброса ШИМ-сигнала. Нужно убедиться, что ЭТОТ GPIO вход подключен к ETR источнику внешнего сигнала.

4. Включается таймер, и начинается генерация ШИМ-сигнала.

В контексте микроконтроллера STM32F103C8T6 реализация может выглядеть следующим образом (пример кода на языке Си):

```c
#include "stm32f10x.h"

void TIM_Config(void)
{
    // Системная инициализация периферии...
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
    
    // Настройка TIM1...
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_TimeBaseStructure.TIM_Period = 65535;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
    
    // Настройка канала TIM1 для генерации ШИМ...
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OCInitStructure.TIM_Pulse = 32768; // 50% duty cycle
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);
    
    // Включение функции OC1CE (сброс сигнала OC1REF)...
    TIM1->CCMR1 |= TIM_CCMR1_OC1CE;
    
    // Конфигурирование внешнего триггера (ETRF)...
    TIM_ETRClockMode2Config(TIM1, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0);
    
    // Запуск TIM1...
    TIM_Cmd(TIM1, ENABLE);
    TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

void GPIO_Config(void)
{
    // Системная инициализация GPIO...
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOx, ENABLE); // Замените GPIOx соответствующим портом
    
    // Настройка пина ETR, например GPIO_Pin_x...
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_x; // Замените GPIO_Pin_x соответствующим пином
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; // или GPIO_Mode_IPD/IPU
Похожие вопросы