RT-Thread 之 PWM 设备驱动调试

一、新建工程

在这里插入图片描述

二、配置PWM设备驱动以及相关宏定义

1.打开PWM和TIM驱动

第1步

第2步
在这里插入图片描述
第3步 在 rtconfig.h 中可以查看刚刚配置的 RT_USING_HWTIMER 和 RT_USING_PWM 的设备驱动宏定义
在这里插入图片描述

2.打开宏定义以及配置宏定义

第1步 stm32f1xx_hal_conf.h 头文件查看是否已宏定义HAL_TIM_MODULE_ENABLED 和 HAL_PWR_MODULE_ENABLED,如果没有自动配置则手动取消相关注释打开
在这里插入图片描述
第2步 在board.h 修改时钟为外部时钟
在这里插入图片描述
第3步 在board.h 增加 #define BSP_USING_PWM3和 #define BSP_USING_PWM3_CH2 宏定义
在这里插入图片描述
第4步 在board.h 增加 #define BSP_USING_TIM3 宏定义
在这里插入图片描述

三、Cubemx生成TIM和PWM驱动

第1步 在工程中打开cubemx
在这里插入图片描述
第2步 cubemx配置PWM(PA7)

在这里插入图片描述
第3步 cubemx选择MDK-ARM版本的工程文件生成代码。
在这里插入图片描述
第4步 cubemx选择MDK-ARM版本的工程文件生成代码,并且复制这两个函数。

在这里插入图片描述
第5步将第4步复制的两个函数放在board.c的尾部并且修改函数名称 ,最后编译代码无错误无警告。
在这里插入图片描述

四、创建线程,编写PWM驱动用户层代码

1.具体线程测试代码如下


#include <rtthread.h>
#include <board.h>
#define PWM_DEV_NAME        "pwm3" /* PWM设 备 名 称 */
#define PWM_DEV_CHANNEL       2   /* PWM通 道 */

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

static void pwm_led_thread_entry(void *parameter)
{
    rt_uint32_t period, pulse, dir;
    period = 20000000; /* 周 期 为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;
    }
    rt_kprintf("pwm sample run ! find %s device!\n", PWM_DEV_NAME);
    /* 使 能 设 备 */
      rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
    /* 设 置PWM周 期 和 脉 冲 宽 度 默 认 值 */
    rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 1000000);

    while (1)
    {

               /* 设 置PWM周 期 和 脉 冲 宽 度 */
               rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 1000000);
               rt_thread_mdelay(1000);
               /* 设 置PWM周 期 和 脉 冲 宽 度 */
               rt_kprintf("pwm sample run ...\n");
               rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, 2000000);
               rt_thread_mdelay(1000);

    }
}

static int pwm_led_init(void)
{
    static rt_thread_t tid_pwmled = RT_NULL;

    rt_err_t ret = RT_EOK;

/* 创建 serial 线程 */
    tid_pwmled = rt_thread_create("t_pwmled",pwm_led_thread_entry, RT_NULL, 512, 24, 10);
   /* 创建成功则启动线程 */
   if (tid_pwmled != RT_NULL)
   {
       rt_thread_startup(tid_pwmled);
   }
   else
   {
       ret = RT_ERROR;
   }

   return ret;

}

INIT_APP_EXPORT(pwm_led_init);

2.舵机验证效果视频

pwm视频

总结

对于PWM设备的移植踩了一路的坑,也遇到了许多的问题,一步步的排查,一步步的总结,写出了这篇文章,最大的坑也是最难找的坑就是cubemx生成代码,复制后的代码需要对函数进行重新命名,不然得不到pwm输出。

  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值