#创作灵感#
1.从大二做智能车的时候就知道RT_Thread了,但是当时由于知识基础不够,根本无法理解操作系统的概念,在大三期间断断续续学习了一段时间的RTT,但是当时因为看不懂驱动框架,也无法配置外设,所以当时只学习了Nano版。
2.在之前的学习中,发现许多东西在网上搜到跟配置一遍后过后还是忘,所以这个系列以后就更新关于我自己学习RTT的内容。
3.准备用RTT做个毕设。
基于RT-Thread Studio 2.2.6 版本开发,开发板为中正点原子STM32精英板,CHIIP:STM32F103ZET6
1.配置PWM以及PIN驱动
1.1配置PWM驱动
打开RT—Thread Setting界面,打开组件中的设备驱动程序,选择PIN和PWM设备。
打开rtconfig.h文件后发现刚才配置的选项已经被定义
1.2打开stm32f1xx_hal_conf.h 头文件查看是否已宏定义HAL_TIM_MODULE_ENABLED 和 HAL_PWR_MODULE_ENABLED,如果没有自动配置则手动取消相关注释打开
3.1编辑board.h文件,编写打开BSP相关宏定义
在本次实验中,我们只需要定义(我的开发板对应的引脚PB5)
#define BSP_USING_PWM3
#define BSP_USING_PWM3_CH2
#define BSP_USING_TIM3(实测好像不需要定义)
上面的提示有四步进行外设初始化配置
1.打开RTTread Setting进行配置
2.定义相关的宏定义如:
#define BSP_USING_PWM3 以及
#define BSP_USING_PWM3_CH2(定时器几就用PWM几,一定要定义通道,不然在void pwm_get_channel(void)处无法进行通道选择,导致无法输出)
3.将stm32cubemx生成的stm32xxx_hal_msp.c(路径cubemx->src->stm32xxx_hal_msp.c)中的PWM定时器init复制到board.c文件的末尾中如:
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
(这一步实际我没有做也成功了。。)
4.修改stm32xxx_hal_config.h文件,使其支持pwm外设。定义与外设相关的宏如:
#define HAL_TIM_MODULE_ENABLED(路径cubemx->inc->stm32xxx_hal_config.h)
通过这四部之后,可以先进行编译,发现会有报错产生。
我们发现报错的原因是因为没有配置对应的函数,所以下一步我们要进行用cubemx配置PWM相关函数。
2.使用内置cubemx配置PWM
2.1配置TIM3_CH2即PB5引脚作为输出
2.2配置时钟
选择外部高速时钟配置单片机主频为最高的72mhz。
2.3生成代码
再次进行编译发现错误已经消失了。
3.使用官方代码进行验证
#include <rtthread.h>
#include <rtdevice.h>
#include <rtdbg.h>
#define PWM_DEV_NAME "pwm3" /* PWM设备名称 */
#define PWM_DEV_CHANNEL 2 /* PWM通道 */
struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
int main(void)
{
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 += 7000; /* 从0值开始每次增加5000ns */
}
else
{
pulse -= 7000; /* 从最大值开始每次减少5000ns */
}
if (pulse >= period)
{
dir = 0;
}
if (0 == pulse)
{
dir = 1;
}
/* 设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
}
return RT_EOK;
}
编译烧写代码到开发板上发现已经实现了呼吸灯功能。
(文章参考大佬乘风破浪HH 。不同的是在移植完代码后我没有把代码移植到drv_pwm.c中,也可以正常运行,个人认为是IDE更新后把头文件包含进去了,可以直接调用相关的函数。)