RT-Thread系列04——PWM设备

文章目录

PWM设备 在 RT-Thread 中提供有驱动,根据具体的BSP稍微进行修改或者添加些宏定义就可以用的。需要配置的相关步骤在 board.h 中都有写,但实际配置过程和文件中写的有一点点差异。

在配置之前,先修改系统时钟,===>>> 修改系统时钟 <<<===。

第一步:在 RT-Thread Settings 中打开PWM驱动。
RT-Thread系列04——PWM设备_第1张图片

第二步:打开PWM声明

  • BSP_USING_PWM2:表示使用定时器2产生PWM
  • BSP_USING_PWM2_CH1:表示使用定时器2的通道1
  • 如果使用其他的定时器,也是一样的,换掉数字即可。

RT-Thread系列04——PWM设备_第2张图片


这里穿插一点分析,说一下,定义这两个东西之后都改变了什么东西。

第一个:声明了BSP_USING_PWM2之后,在drivers 文件夹中,会打开如下内容的声明。即声明了PWM2_CONFIG
RT-Thread系列04——PWM设备_第3张图片
而有了BSP_USING_PWM2PWM2_CONFIG这两个声明,就会在drivers -> include -> config文件夹中,打开如下内容的声明。可以看到,就是在这里把 定时器和PWM设备联系在一起的。

RT-Thread系列04——PWM设备_第4张图片

第二个:声明了BSP_USING_PWM2_CH1之后,在drivers 文件夹中,会打开如下内容的声明。即声明了PWM2_INDEX
RT-Thread系列04——PWM设备_第5张图片
而有了BSP_USING_PWM2_CH1PWM2_INDEX这两个声明,还是在这个文件夹中,会打开如下内容的声明。就是在这里设置的定时器的通道。
RT-Thread系列04——PWM设备_第6张图片

穿插结束。


第三步:复制初始化文件。

在 CubeMX 中配置定时器2 通道1 为PWM输出模式,定时器参数全都不用管,默认即可,反正设置了也不用你的。

然后配置生成的工程为 MDK-ARM。其余的时钟啥的都不用管,生成的工程只需要复制他两个初始化函数。
RT-Thread系列04——PWM设备_第7张图片
打开生成的工程,在stm32f1xx_hal_msp.c文件中,复制void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)两个函数到 drivers文件夹下board.c文件的末尾。

如果是利用 Studio 中的 cubemx生成的工程,生成之后需要刷新目录才看得到;复制完成之后可以直接把生成的工程删掉,否则编译会报错。

复制完成之后,把void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) 的函数名改为void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_base)

复制完成之后是这样。
RT-Thread系列04——PWM设备_第8张图片

第四步:把 drivers -> stm32f1xx_hal_config.h 文件中的定时器的注释取消掉。
RT-Thread系列04——PWM设备_第9张图片
第五步:写代码(案例代码)

#include 
#include 

#define PWM_DEV_NAME        "pwm2"  /* PWM设备名称 */
#define PWM_DEV_CHANNEL     1       /* PWM通道 */

struct rt_device_pwm *pwm_dev;      /* PWM设备句柄 */

static int pwm_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;
    }
    else {
        rt_kprintf("pwm sample %s is running \n", PWM_DEV_NAME);
    }

    /* 设置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_sample, pwm sample);

在PA0引脚接个LED,就是个呼吸灯的效果了。

另外:

  1. 其属于设备行列,使用时需要包含头文件:#include
  2. PWM设备的相关函数声明在 rt-thread -> components -> drivers -> include -> drivers -> rt_drv_pwm.h 中;
  3. PWM设备相关函数定义在 rt-thread -> components -> drivers -> include -> drivers -> misc -> rt_drv_pwm.c中。

你可能感兴趣的:(RTOS,#,RT-Thread,java,开发语言)