一、新建工程
二、配置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输出。