PWM+GDMA
该示例通过使用 ENHTIM 的 PWM 功能和 GDMA 功能,实现输出占空比连续变化的 PWM 波形。
用户可以根据需求指定占空比数据,GDMA 会将数据传输到 ENHTIM 的 CCR FIFO( ENHTIM_CCR_FIFO_ENTRY
)中,生成预期的 PWM 波形。
用户可以通过不同的宏配置来修改引脚信息,PWM 的输出频率等。具体宏配置详见 配置选项。
环境需求
该示例的环境需求,可参考 环境需求。
硬件连线
连接 P0_0(PWM_P)和 P0_1(PWM_N)至逻辑分析仪。
配置选项
-
可配置如下宏修改输出 PWM 波的引脚。
#define PWM_OUT_P_PIN P0_0 #define PWM_OUT_N_PIN P0_1
-
可配置如下宏修改 PWM 的频率。
#define PWM_MAXCNT 100 /*< Setting this macro to 100 means the PWM period is 100 * 25ns. */
-
可配置如下数组修改 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 波形。

PWM 输出波形
代码介绍
该章节主要介绍示例中的初始化和相应功能实现的代码和流程说明。
源码路径
工程文件和源码路径如下:
工程路径:
sdk\samples\peripheral\enhtimer\pwm+gdma\proj
源码路径:
sdk\samples\peripheral\enhtimer\pwm+gdma\src
初始化
外设的初始化流程可参考 General Introduction 中的 初始化流程 部分。
-
调用
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); }
调用
RCC_PeriphClockCmd()
,开启 GDMA 时钟。-
对 GDMA 外设进行初始化:
定义
GDMA_InitTypeDef
类型GDMA_InitStruct
,调用GDMA_StructInit()
将GDMA_InitStruct
预填默认值。根据需求修改
GDMA_InitStruct
参数,GDMA 的初始化参数配置如下表。调用GDMA_Init()
,初始化 GDMA 外设。
GDMA Hardware Parameters |
Setting in the |
GDMA |
---|---|---|
Channel Num |
||
Source Data Size |
||
Destination Data Size |
||
Source Burst Transaction Length |
||
Destination Burst Transaction Length |
||
Destination Handshake |
||
Transfer Direction |
||
Source Address Increment or Decrement |
||
Destination Address Increment or Decrement |
||
Source Address |
|
|
Buffer Size |
4 |
|
Destination Address |
|
|
Secure function enable |
调用
RCC_PeriphClockCmd()
,开启 ENHTIM 时钟。-
对 ENHTIM 外设进行初始化:
定义
ENHTIM_InitTypeDef
类型ENHTIM_InitStruct
,调用ENHTIM_StructInit()
将ENHTIM_InitStruct
预填默认值。根据需求修改
ENHTIM_InitStruct
参数,ENHTIM 的初始化参数配置如下表。调用ENHTIM_Init()
,初始化 ENHTIM 外设。
ENHTIM Hardware Parameters |
Setting in the |
ENHTIM |
---|---|---|
Counter mode |
||
PWM mode |
||
Toggle output polarity |
||
Count value |
|
|
PWM deadzone clock source |
||
PWM deadzone function enable |
||
PWM P stop state |
||
PWM N stop state |
||
Size of deadzone time |
0x0 |
|
GDMA function enable |
||
GDMA target |
调用
GDMA_Cmd()
使能 GDMA 外设,调用ENHTIM_Cmd()
使能 ENHTIM 外设。
功能实现
为了更好的说明用户可以通过修改哪些参数得到想要的波形,以下示例说明如何得到下图所示的波形:

PWM 波形图
确定 PWM 周期:可以通过以下公式进行计算:PWM_Period = Clock_Period * PWM_MAXCNT 。其中 Clock_Period 为 25ns(基于 40 MHz 的时钟源),如图所示,如果需要输出周期为 100us 的 PWM 波形,应将 配置选项 中的
PWM_MAXCNT
宏定义设为 4000 。-
确定占空比:可以根据需求,组织要填入 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 请查看: