RT -Thread Studio开发环境下使用PWM设备驱动

双击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输出正常。

猜你喜欢

转载自blog.csdn.net/qq_25186745/article/details/112885020