驱动补充:example_gptimer_pwm_N

2 min read 驱动使用

MCU驱动使用 > 驱动补充:example_gptimer_pwm_N

以下样例实现的功能:使用 gptimer4_ch0 的一路 channel 输出三路波形:

  • 第一路:PWM 输出
  • 第二路:反向 PWM 输出
  • 第三路:单向中断(IO toggle)输出

其中 PWM 占空比可调,频率可调,触发中断上下边可调,死区可调。

VE 文件映射

上述功能使用到 3 个 IO 引脚,需在 ve 文件中映射到 PIN:

GPTIMER4_CH0 PIN_7
GPTIMER4_CHN0 PIN_15
GPIO4_1 PIN_17

完整代码示例

// example_gptimer_pwm_N.c
#include "example.h"

void setTestGpio() // gpio init first
{
    SYS_EnableAPBClock(APB_MASK_GPIO4);
    GPIO_SetOutput(GPIO4, GPIO_BIT1);
}

void GPTIMER4_isr() // timer interrupt
{
    GPIO_Toggle(GPIO4, GPIO_BIT1);
    GPTIMER_ClearFlagCC0(GPTIMER4);
}

void TestGpTimerPwm2()
{
    setTestGpio(); // init io 用于中断函数中的IO翻转(第三路输出)

    SYS_EnableAPBClock(APB_MASK_GPTIMER4);

    GPTIMER_InitTypeDef tm_init;
    GPTIMER_StructInit(&tm_init);
    const uint32_t frequency = 10000; // In Hz
    const float pwm_ratio = 0.2;      // 占空比比例
    tm_init.Autoreload = SYS_GetPclkFreq() / frequency;
    tm_init.CounterMode = GPTIMER_COUNTERMODE_CENTER_UP; // 触发中断的方式,仅上升时触发。
    GPTIMER_Init(GPTIMER4, &tm_init);

    // OC正向,OCN反向
    GPTIMER_OC_InitTypeDef oc_init;
    oc_init.OCState = GPTIMER_OCSTATE_ENABLE;
    oc_init.OCNState = GPTIMER_OCSTATE_ENABLE;
    oc_init.OCPolarity = GPTIMER_OC_POLARITY_INVERTED;
    oc_init.OCNPolarity = GPTIMER_OC_POLARITY_INVERTED;
    oc_init.OCIdleState = GPTIMER_OCIDLESTATE_LOW;
    oc_init.OCNIdleState = GPTIMER_OCIDLESTATE_LOW;

    oc_init.OCMode = GPTIMER_OCMODE_PWM1;
    oc_init.CompareValue = tm_init.Autoreload * pwm_ratio; // 设置比较值,用于比较中断
    GPTIMER_OC_Init(GPTIMER4, GPTIMER_CHANNEL_CH0, &oc_init);

    GPIO_AF_ENABLE(GPTIMER4_CH0);  // 输出IO
    GPIO_AF_ENABLE(GPTIMER4_CHN0); // 输出IO2(反向)

    GPTIMER_SetDeadTimeGenerator(GPTIMER4, 30); // 死区时间宽度
    GPTIMER_SetBreakState(GPTIMER4, GPTIMER_BREAK_ENABLE);
    GPTIMER_ConfigBreak(GPTIMER4, GPTIMER_BREAK_POLARITY_HIGH, GPTIMER_BREAK_FILTER_FDIV1_N2);

    INT_EnableIRQ(GPTIMER4_IRQn, TIMER_PRIORITY); // 开中断
    GPTIMER_EnableIntCC0(GPTIMER4);              // 使能channal0的比较中断

    GPTIMER_EnableAllOutputs(GPTIMER4);
    GPTIMER_EnableCounter(GPTIMER4); // 打开timer4

    while (1)
        ;
}
这篇文档有帮助吗?