双击RT -Thread Settings,使用PWM设备驱动程序打钩
我这里使用的是STM32F407VGT6,PWM接到PD12、PD13、PD14、PD15
也就是TIME4的4个通道
所以在drv_pwm.c文件中添加#define BSP_USING_PWM4的宏定义
然后在添加定时器4的4个通道的宏定义
然后打开Cube MX配置一下定时器4的输出
生成初始化代码
复制void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)和void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)到board.c文件
然后打开stm32f4xx_hal_config.h取消掉#define HAL_TIM_MODULE_ENABLED的屏蔽
然后在applications文件夹下新建my_pwm.c文件
然后复制rt-thread官网上PWM的例程,将#define PWM_DEV_NAME改成pwm4,PWM_DEV_CHANNEL改成1,如下,然后编译下载
#include <rtthread.h>
#include <rtdevice.h>
#define PWM_DEV_NAME "pwm4" /* PWM设备名称 */
#define PWM_DEV_CHANNEL 1 /* PWM通道 */
struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
static int pwm_led_sample(int argc, char *argv[])
{
rt_uint32_t period, pulse, dir;
period = 500000; /* 周期为0.5ms,单位为纳秒ns */
dir = 1; /* PWM脉冲宽度值的增减方向 */
pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
/* 查找设备 */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL)
{
rt_kprintf("pwm sample run failed! can't find %s device!\n", PWM_DEV_NAME);
return RT_ERROR;
}
/* 设置PWM周期和脉冲宽度默认值 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/* 使能设备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
while (1)
{
rt_thread_mdelay(50);
if (dir)
{
pulse += 5000; /* 从0值开始每次增加5000ns */
}
else
{
pulse -= 5000; /* 从最大值开始每次减少5000ns */
}
if (pulse >= period)
{
dir = 0;
}
if (0 == pulse)
{
dir = 1;
}
/* 设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pwm_led_sample, pwm sample);
然后在shell命令里输入pwm_led_sample
示波器测量定时器4的通道1,也就是PD12脚,PWM输出正常。