简介
基于 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 工程创建



















