Enhance Timer PWM
该示例通过使用ENHTIM,实现输出周期为100us、占空比为50%的PWM波形。
如果选用ENHTIM_PWM_MANUAL_MODE,占空比可调,可以输出周期为100us,占空比可调节的波形。
环境需求
该示例支持以下开发套件:
Hardware Platforms |
Board Name |
---|---|
RTL87x2G HDK |
RTL87x2G EVB |
更多信息请参考 快速入门
硬件连线
连接P0_0和P0_1至逻辑分析仪。
编译和下载
该示例的工程路径如下:
Project file: samples\peripheral\enhtimer\enhtim_pwm\proj\rtl87x2g\mdk
Project file: samples\peripheral\enhtimer\enhtim_pwm\proj\rtl87x2g\gcc
请按照以下步骤操作构建并运行该示例:
打开工程文件。
按照 Quick Start 中 Generating App Image 给出的步骤构建目标文件。
编译成功后,在路径
mdk\bin
或gcc\bin
下会生成 app binapp_MP_xxx.bin
文件。按照 Quick Start 中 MPTool Download 给出的步骤将app bin烧录至EVB内。
按下复位按键,开始运行。
测试验证
通过逻辑分析仪看P0_0和P0_1输出的PWM波形。
当ENHTIM选择输出为manual模式时,P0_0输出周期为100us,占空比为50%的PWM波,P0_1输出与P0_0反相的相同周期和占空比的PWM波。
代码介绍
该章节分为以下几个部分:
源码路径
工程路径:
sdk\samples\peripheral\enhtimer\enhtim_pwm\proj
源码路径:
sdk\samples\peripheral\enhtimer\enhtim_pwm\src
该工程的工程文件代码结构如下:
└── Project: input_interrupt
└── secure_only_app
└── Device includes startup code
├── startup_rtl.c
└── system_rtl.c
├── CMSIS includes CMSIS header files
├── CMSE Library Non-secure callable lib
├── Lib includes all binary symbol files that user application is built on
└── rtl87x2g_io.lib
├── Peripheral includes all peripheral drivers and module code used by the application
├── rtl_rcc.c
├── rtl_pinmux.c
└── rtl_enh_tim.c
└── APP includes the ble_peripheral user application implementation
├── main_ns.c
└── io_enhtimer_pwm.c
初始化
初始化流程包括了 board_enhance_pwm_init
和 enhance_timer_init
。
board_enhance_pwm_init
中包含了PAD与PINMUX设置。
配置PAD:设置引脚、PINMUX模式、PowerOn、无内部上拉。
配置PINMUX:分配引脚分别为PWM_P、PWN_N功能。
enhance_timer_init
包含了对ENHTIM外设的初始化。
使能PCC时钟。
设置
ENHTIM_ClockDiv
为1分频。如果选择
ENHTIM_Mode
为ENHTIM_PWM_AUTO_MODE:设置
ENHTIM_PWMOutputEn
为ENABLE,开启ENHTIM的PWM功能。设置
ENHTIM_PWMStartPolarity
为ENHTIM_PWM_START_WITH_HIGH,即PWM初始输出电平为高。设置
ENHTIM_MaxCount
为4000,即PWM的输出周期为100us。
如果选择
ENHTIM_Mode
为ENHTIM_PWM_MANUAL_MODE:设置
ENHTIM_PWMOutputEn
为ENABLE,开启ENHTIM的PWM功能。设置
ENHTIM_PWMStartPolarity
为ENHTIM_PWM_START_WITH_HIGH,即PWM初始输出电平为高。设置
ENHTIM_MaxCount
为4000,即PWM的输出周期100us。设置
ENHTIM_CCValue
为2000,即PWM的占空比为50% (2000/4000)。如果需要改变PWM输出的占空比,可以调用
ENHTIM_WriteCCFIFO()
函数进行更改,最多支持连续更改8次。
设置
ENHTIM_PWMDeadZoneClockSource
为ENHTIM_PWM_DZCLKSRCE_32K,即PWM死区的时钟源为32k。设置
ENHTIM_PWMDeadZoneEn
为ENABLE,即开启PWM的死区功能。设置
ENHTIM_PWMStopStateP
为ENHTIM_PWM_STOP_AT_HIGH,即PWM_P输出的初始电平为高。设置
ENHTIM_PWMStopStateN
为ENHTIM_PWM_STOP_AT_LOW,即PWM_N的初始电平为低。设置
ENHTIM_DeadZoneSize
为0x0。
RCC_PeriphClockCmd(APBPeriph_ENHTIMER, APBPeriph_ENHTIMER_CLOCK, ENABLE);
...
ENHTIM_InitStruct.ENHTIM_ClockDiv = ENHTIM_CLOCK_DIVIDER_1;
#if ENHTIM_PWM_AUTO_MODE
ENHTIM_InitStruct.ENHTIM_Mode = ENHTIM_MODE_PWM_AUTO;
ENHTIM_InitStruct.ENHTIM_PWMOutputEn = ENABLE;
ENHTIM_InitStruct.ENHTIM_PWMStartPolarity = ENHTIM_PWM_START_WITH_HIGH;
ENHTIM_InitStruct.ENHTIM_MaxCount = 4000;
#endif
#if ENHTIM_PWM_MANUAL_MODE
ENHTIM_InitStruct.ENHTIM_Mode = ENHTIM_MODE_PWM_MANUAL;
ENHTIM_InitStruct.ENHTIM_PWMOutputEn = ENABLE;
ENHTIM_InitStruct.ENHTIM_PWMStartPolarity = ENHTIM_PWM_START_WITH_HIGH;
ENHTIM_InitStruct.ENHTIM_MaxCount = 4000;
ENHTIM_InitStruct.ENHTIM_CCValue = 2000;
#endif
ENHTIM_InitStruct.ENHTIM_PWMDeadZoneClockSource = ENHTIM_PWM_DZCLKSRCE_32K;
ENHTIM_InitStruct.ENHTIM_PWMDeadZoneEn = ENABLE;
ENHTIM_InitStruct.ENHTIM_PWMStopStateP = ENHTIM_PWM_STOP_AT_HIGH;
ENHTIM_InitStruct.ENHTIM_PWMStopStateN = ENHTIM_PWM_STOP_AT_LOW;
ENHTIM_InitStruct.ENHTIM_DeadZoneSize = 0x0;
ENHTIM_Init(Enhance_Timer, &ENHTIM_InitStruct);
#if ENHTIM_PWM_AUTO_MODE
/* After the waveform is transformed 8 times,
the PWM maintains the last change and continues to output */
ENHTIM_WriteCCFIFO(Enhance_Timer, 0); //Output high level with a duty cycle of 100%
ENHTIM_WriteCCFIFO(Enhance_Timer, 20); //Output high level with a duty cycle of 80%
ENHTIM_WriteCCFIFO(Enhance_Timer, 40); //Output high level with a duty cycle of 60%
ENHTIM_WriteCCFIFO(Enhance_Timer, 50); //Output high level with a duty cycle of 50%
ENHTIM_WriteCCFIFO(Enhance_Timer, 70); //Output high level with a duty cycle of 30%
ENHTIM_WriteCCFIFO(Enhance_Timer, 80); //Output high level with a duty cycle of 20%
ENHTIM_WriteCCFIFO(Enhance_Timer, 90); //Output high level with a duty cycle of 10%
ENHTIM_WriteCCFIFO(Enhance_Timer, 100); //Output low level with a duty cycle of 100%
#endif
ENHTIM_Cmd(Enhance_Timer, ENABLE);