PWM+GDMA

该示例通过使用 ENHTIM 的 PWM 功能和 GDMA 功能,实现输出占空比连续变化的 PWM 波形。

用户可以根据需求指定占空比数据,GDMA 会将数据传输到 ENHTIM 的 CCR FIFO( ENHTIM_CCR_FIFO_ENTRY )中,生成预期的 PWM 波形。

用户可以通过不同的宏配置来修改引脚信息,PWM 的输出频率等。具体宏配置详见 配置选项

环境需求

该示例的环境需求,可参考 环境需求

硬件连线

连接 P0_0(PWM_P)和 P0_1(PWM_N)至逻辑分析仪。

配置选项

  1. 可配置如下宏修改输出 PWM 波的引脚。

    #define PWM_OUT_P_PIN                     P0_0
    #define PWM_OUT_N_PIN                     P0_1
    
  2. 可配置如下宏修改 PWM 的频率。

    #define PWM_MAXCNT                        100                   /*< Setting this macro to 100 means the PWM period is 100 * 25ns. */
    
  3. 可配置如下数组修改 PWM 的占空比值。

    static uint32_t ccr_fifo_buf[] = {0x0A, 0x14, 0x1E, 0x32};     /*< Setting the array values to modify the duty cycle. The PWM Compare values are 10 * 25ns, 20 * 25ns, 30 * 25ns, and 50 * 25ns. */
    

编译和下载

该示例的编译和下载流程,可参考 编译和下载

测试验证

当 EVB 启动后,输出周期为 2.5 us、占空比依次为 90% 80% 70% 50% 的 PWM 波形,通过逻辑分析仪看 P0_0 和 P0_1 输出的 PWM 波形。

这里应该是enhtim输出pwm的图片

PWM 输出波形

代码介绍

该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。

源码路径

工程文件和源码路径如下:

  • 工程路径: sdk\samples\peripheral\enhtimer\pwm+gdma\proj

  • 源码路径: sdk\samples\peripheral\enhtimer\pwm+gdma\src

初始化

外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。

  1. 调用 Pad_Config()Pinmux_Config(),配置对应引脚的 PAD 和 PINMUX 。

    void board_enhance_pwm_init(void)
    {
        Pad_Config(PWM_OUT_P_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_LOW);
        Pad_Config(PWM_OUT_N_PIN, PAD_PINMUX_MODE, PAD_IS_PWRON, PAD_PULL_NONE, PAD_OUT_DISABLE, PAD_OUT_LOW);
    
        Pinmux_Config(PWM_OUT_P_PIN, PWM_PINMUX_OUT_P);
        Pinmux_Config(PWM_OUT_N_PIN, PWM_PINMUX_OUT_N);
    }
    
  2. 调用 RCC_PeriphClockCmd() ,开启 GDMA 时钟。

  3. 对 GDMA 外设进行初始化:

    1. 定义 GDMA_InitTypeDef 类型 GDMA_InitStruct ,调用 GDMA_StructInit()GDMA_InitStruct 预填默认值。

    2. 根据需求修改 GDMA_InitStruct 参数,GDMA 的初始化参数配置如下表。调用 GDMA_Init(),初始化 GDMA 外设。

GDMA 初始化参数

GDMA Hardware Parameters

Setting in the GDMA_InitStruct

GDMA

Channel Num

GDMA_InitTypeDef::GDMA_ChannelNum

GDMA_CH_NUM0

Source Data Size

GDMA_InitTypeDef::GDMA_SourceDataSize

GDMA_DataSize_Word

Destination Data Size

GDMA_InitTypeDef::GDMA_DestinationDataSize

GDMA_DataSize_Word

Source Burst Transaction Length

GDMA_InitTypeDef::GDMA_SourceMsize

GDMA_Msize_1

Destination Burst Transaction Length

GDMA_InitTypeDef::GDMA_DestinationMsize

GDMA_Msize_1

Destination Handshake

GDMA_InitTypeDef::GDMA_DestHandshake

GDMA_Handshake_ENH_TIM0

Transfer Direction

GDMA_InitTypeDef::GDMA_DIR

GDMA_DIR_MemoryToPeripheral

Source Address Increment or Decrement

GDMA_InitTypeDef::GDMA_SourceInc

DMA_SourceInc_Inc

Destination Address Increment or Decrement

GDMA_InitTypeDef::GDMA_DestinationInc

DMA_DestinationInc_Fix

Source Address

GDMA_InitTypeDef::GDMA_SourceAddr

ccr_fifo_buf

Buffer Size

GDMA_InitTypeDef::GDMA_BufferSize

4

Destination Address

GDMA_InitTypeDef::GDMA_DestinationAddr

& (Enhance_Timer->ENHTIM_CCR_FIFO_ENTRY)

Secure function enable

GDMA_InitTypeDef::GDMA_Secure_En

ENABLE

  1. 调用 RCC_PeriphClockCmd() ,开启 ENHTIM 时钟。

  2. 对 ENHTIM 外设进行初始化:

    1. 定义 ENHTIM_InitTypeDef 类型 ENHTIM_InitStruct ,调用 ENHTIM_StructInit()ENHTIM_InitStruct 预填默认值。

    2. 根据需求修改 ENHTIM_InitStruct 参数,ENHTIM 的初始化参数配置如下表。调用 ENHTIM_Init(),初始化 ENHTIM 外设。

ENHTIM 初始化参数

ENHTIM Hardware Parameters

Setting in the ENHTIM_InitStruct

ENHTIM

Counter mode

ENHTIM_InitTypeDef::ENHTIM_Mode

ENHTIM_MODE_PWM_AUTO

PWM mode

ENHTIM_InitTypeDef::ENHTIM_PWMOutputEn

ENABLE

Toggle output polarity

ENHTIM_InitTypeDef::ENHTIM_PWMStartPolarity

ENHTIM_PWM_START_WITH_HIGH

Count value

ENHTIM_InitTypeDef::ENHTIM_MaxCount

PWM_MAXCNT

PWM deadzone clock source

ENHTIM_InitTypeDef::ENHTIM_PWMDeadZoneClockSource

ENHTIM_PWM_DZCLKSRCE_32K

PWM deadzone function enable

ENHTIM_InitTypeDef::ENHTIM_PWMDeadZoneEn

ENABLE

PWM P stop state

ENHTIM_InitTypeDef::ENHTIM_PWMStopStateP

ENHTIM_PWM_STOP_AT_HIGH

PWM N stop state

ENHTIM_InitTypeDef::ENHTIM_PWMStopStateN

ENHTIM_PWM_STOP_AT_LOW

Size of deadzone time

ENHTIM_InitTypeDef::ENHTIM_DeadZoneSize

0x0

GDMA function enable

ENHTIM_InitTypeDef::ENHTIM_DmaEn

ENABLE

GDMA target

ENHTIM_InitTypeDef::ENHTIM_DmaTragget

ENHTIM_DMA_CCR_FIFO

  1. 调用 GDMA_Cmd() 使能 GDMA 外设,调用 ENHTIM_Cmd() 使能 ENHTIM 外设。

功能实现

为了更好的说明用户可以通过修改哪些参数得到想要的波形,以下示例说明如何得到下图所示的波形:

这里应该是 pwm duty cycle variation flow

PWM 波形图

  1. 确定 PWM 周期:可以通过以下公式进行计算:PWM_Period = Clock_Period * PWM_MAXCNT 。其中 Clock_Period 为 25ns(基于 40 MHz 的时钟源),如图所示,如果需要输出周期为 100us 的 PWM 波形,应将 配置选项 中的 PWM_MAXCNT 宏定义设为 4000 。

  2. 确定占空比:可以根据需求,组织要填入 CCR FIFO 中的数据来确定占空比。例如希望输出周期为 100us、占空比依次为 100% 80% 60% 50% 30% 20% 10% 0% 的 PWM 波形,需要将 GDMA_InitTypeDef::GDMA_BufferSize 设置为 8 。以下是 ccr_fifo_buf 的设置,对于占空比 80% 的情况,需要设定 ccr_fifo_buf[1] = 800,高电平占空比的计算方法为:((PWM_MAXCNT - CCR) / PWM_MAXCNT) = ((4000 - 800) / 4000) = 80%。

    static uint32_t ccr_fifo_buf[8] = {0, 800, 1600, 2000, 2800, 3200, 3600, 4000};
    

See Also

相关 API Reference 请查看: