目录
1、前言
本文目的:在RT Thread Studio中 PWM使用之呼吸灯
RT Thread Studio 版本:2.1.0
原理图:
2、PWM代码
关于RT thread 的pwm介绍可以参考官网的手册:https://www.rt-thread.org/document/site/programming-manual/device/pwm/pwm/#pwm_1
大部分RT Thread设备的驱动在工程的drivers文件夹下board.h中可以找到它的调用说明,然后我们找到pwm的按照操作一步一步来。这里我led灯引脚为PA6,对应的是TIM3时钟的通道1,因此代码中设备名称"pwm3"对应的就是“TIM3”。
step1.在RT-Thread Settings中打开PWM设备驱动支持
step2.在board.h中定义#define BSP_USING_PWM3,同时这里还需要定义#define BSP_USING_PWM3_CH1(为什么要加,可以看drv_pwm.c文件中stm32_pwm_init函数中的pwm_get_channel,这里是向PWM结构体中添加TIM的通道 )
step3.在Cubmx中生成TIM3相应的代码,然后添加到board.c中
在生成的代码函数中找不到官方给的说明中的HAL_TIM_Base_MspInit函数,估计这里官方搞错了,我添加了如下两个函数HAL_TIM_PWM_MspInit和HAL_TIM_MspPostInit
step4.在drivers文件夹下的stm32f1xx_hal_config.h中添加#define HAL_TIM_MODULE_ENABLED
到这里基本上就完成50%了,新建一个.c文件,单独开一个线程来点灯,这里的代码可以参考官网给的,下面是我参考之后改了一下。
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2021-05-09 35166 the first version
*/
#include <rtthread.h>
#include "board.h"
#include <rtdevice.h>
#define DBG_TAG "BLED"
#define DBG_LVL DBG_LOG
#include <rtdbg.h>
/**********线程优先级*********/
#define BLED_THREAD_PRIORITY 12
/**********PWM定义*********/
#define PWM_DEV_NAME "pwm3" /* PWM设备名称 */
#define PWM_DEV_CHANNEL 1 /* PWM通道 */
struct rt_device_pwm *pwm_dev; /* PWM设备句柄 */
static void BLED_thread_entry(void *parameter)
{
rt_uint32_t period, pulse, dir;
period = 500000; /* 周期为500000ns,频率为2kHz, 单位为纳秒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(10);
if (dir)
{
pulse += 1000; /* 从0值开始每次增加1000 */
}
else
{
pulse -= 1000; /* 从最大值开始每次减少1000 */
}
if (pulse >= period)
{
dir = 0;
}
if (0 >= pulse)
{
dir = 1;
}
/* 设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
}
}
static int BLED_Priority_temp(void)
{
rt_thread_t BLED_thread;
BLED_thread = rt_thread_create("BLED_thread",
BLED_thread_entry,
"BLED_thread",
1024,
BLED_THREAD_PRIORITY,
20);
if (BLED_thread != RT_NULL)
{
rt_thread_startup(BLED_thread);
}
return RT_EOK;
}
INIT_APP_EXPORT(BLED_Priority_temp);
3、结论