BearPi Std 板从入门到放弃 - 先天神魂篇(2)(RT-Thread LED PWM驱动)

2023-12-13 04:17:35

简介

基于 BearPi Std 板从入门到放弃 - 先天神魂篇(1)(RT-Thread 指令点亮LED) 创建的项目, 添加PWM驱动LED的方式实现呼吸灯功能, 电路板及相关使用到的配件说明
开发板 : Bearpi Std(小熊派标准板)
主芯片: STM32L431RCT6
E53_ST1扩展板/E53_IA1扩展板: 因为这两块扩张板都有LED灯接到
PA0 : PA0/TIM2_CH1 的PWM输出引脚
项目在Keil中进行编程使用

步骤

  1. 打开 CubeMX_Config.ioc
    双击项目目录下的 stm32l431-BearPi\board\CubeMX_Config\CubeMX_Config.ioc
    配置PA0 引脚为 TIM2_CH1 及 设置 TIM2
    参考 : BearPi Std 板从入门到放弃 - 引气入体篇(10)(PWM)

  2. 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);

  1. 编译烧录
  2. 测试
    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 工程创建

文章来源:https://blog.csdn.net/halo_hsuh/article/details/134952439
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。