简介
基于 BearPi Std 板从入门到放弃 - 先天神魂篇(1)(RT-Thread 指令点亮LED) 创建的项目, 添加PWM驱动LED的方式实现呼吸灯功能, 电路板及相关使用到的配件说明
开发板 : Bearpi Std(小熊派标准板)
主芯片: STM32L431RCT6
E53_ST1扩展板/E53_IA1扩展板: 因为这两块扩张板都有LED灯接到
PA0 : PA0/TIM2_CH1 的PWM输出引脚
项目在Keil中进行编程使用
步骤
-
打开 CubeMX_Config.ioc
双击项目目录下的 stm32l431-BearPi\board\CubeMX_Config\CubeMX_Config.ioc
配置PA0 引脚为 TIM2_CH1 及 设置 TIM2
参考 : BearPi Std 板从入门到放弃 - 引气入体篇(10)(PWM) -
RT-Thread 开启PWM支持
a. stm32l431-BearPi/rtconfig.h 添加
/* 开启RT-RThread PWM模块功能 /
#define RT_USING_PWM
/ 注册PWM2设备 */
#define BSP_USING_PWM
#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1
b. 打开env 并 输入 scons --target=mdk5 -s 重新生成项目,pwm的相关库才会添加到Keil工程配置文件中
c. board/board.h 添加
#define BSP_USING_PWM
#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1
d. 双击打开 board/CubeMX_Config\CubeMX_Config.ioc, 配置 PA0 口
PA0 口设置
TIM2 设置
e. 生成代码
3. 编译烧录
打开串口软件并连接上设备 输入指令 list device
4. 添加用户代码
a. 在 applications 目录下创建led_pwm.c文件, 并添加到项目中
led_pwm.c文件
#include <board.h>
#include <rtthread.h>
#include <drv_gpio.h>
#include <rtdevice.h>
#define PWM_DEV_NAME "pwm2" /* PWM设备名称 */
#define PWM_DEV_CHANNEL 1 /* PWM通道 */
struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
static void led_entry(void *parameter)
{
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;
}
/* 设置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);
}
}
//static int pwm_led(int argc, char *argv[])
static int pwm_led(void)
{
rt_thread_t tid = RT_NULL;
rt_err_t ret = RT_EOK;
tid = rt_thread_create("pwm_led",
led_entry,
RT_NULL,
512,
RT_THREAD_PRIORITY_MAX / 3,
20);
if (tid != RT_NULL)
{
rt_thread_startup(tid);
}
else
{
ret = RT_ERROR;
}
return ret;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(pwm_led, pwm led test);
- 编译烧录
- 测试
list device # 可以看到pwm2设备
help # 可以看到pwm_led 的指令
pwm_led # 可以看到E53_IA1 扩展板上的LED灯 有呼吸效果
list thread # 可以看到pwm_led的线程在执行
项目代码
参考:
RT-Thread 内核 - 线管管理
RT-Thread PWM 设备
BearPi Std 板从入门到放弃 - 引气入体篇(10)(PWM)
RT-Thread 工程创建