文章目录
- 前言
- 一、板载资源资源说明
- 二、具体步骤
-
- 1.新建rt_thread项目
- [2. 打开PWM设备驱动](#2. 打开PWM设备驱动)
- [3. 在Stm32CubeMX配置定时器](#3. 在Stm32CubeMX配置定时器)
-
- 3.1打开Stm32CubeMX
- [3.2 使用外部高速时钟,并修改时钟树](#3.2 使用外部高速时钟,并修改时钟树)
- 3.3打开定时器1,并配置通道一为PWM输出模式(定时器根据自己需求调整)
- [3.4 打开串口](#3.4 打开串口)
- [3.5 生成工程](#3.5 生成工程)
- [4. 修改时钟源](#4. 修改时钟源)
-
- [4.1 进入CubeMX生成的main.c,复制SystemClock_Config函数的函数体,粘贴到drivers文件下drv_clk.c的system_clock_config函数中,覆盖原内容](#4.1 进入CubeMX生成的main.c,复制SystemClock_Config函数的函数体,粘贴到drivers文件下drv_clk.c的system_clock_config函数中,覆盖原内容)
- [4.2 修改外部时钟](#4.2 修改外部时钟)
- [5. 配置PWM](#5. 配置PWM)
-
- 5.1声明PWM及其通道
- [5.2 剪切CubeMX生成的stm32l4xx_hal_msp.c中的两个函数,粘贴到driver文件下的board.c中,并修改名称](#5.2 剪切CubeMX生成的stm32l4xx_hal_msp.c中的两个函数,粘贴到driver文件下的board.c中,并修改名称)
- [6. 完成上述步骤后,编译下载](#6. 完成上述步骤后,编译下载)
前言
本文采用开发板为STM32L475VET6(潘多拉开发板),使用RT_Thread Studio基于芯片开发模式,完成PWM实验,实现板载呼吸灯效果

一、板载资源资源说明
PE9,对应开发板的板载RGB蓝灯,同时对应定时器1的通道1
二、具体步骤
1.新建rt_thread项目

2. 打开PWM设备驱动
在RT-Thread Setting的组件栏中
3. 在Stm32CubeMX配置定时器
3.1打开Stm32CubeMX

3.2 使用外部高速时钟,并修改时钟树
3.3打开定时器1,并配置通道一为PWM输出模式(定时器根据自己需求调整)
打开即可,参数可不设置
3.4 打开串口

3.5 生成工程

4. 修改时钟源
项目默认使用内部时钟源,这里改成外部时钟源,本步可选可不选
4.1 进入CubeMX生成的main.c,复制SystemClock_Config函数的函数体,粘贴到drivers文件下drv_clk.c的system_clock_config函数中,覆盖原内容
4.2 修改外部时钟

5. 配置PWM
官方给出配置步骤,第一步已在RT-Thread Setting中打开
5.1声明PWM及其通道

5.2 剪切CubeMX生成的stm32l4xx_hal_msp.c中的两个函数,粘贴到driver文件下的board.c中,并修改名称
6. 完成上述步骤后,编译下载
测试代码
cpp
/*
* 程序清单:这是一个 PWM 设备使用例程
* 例程导出了 pwm_led_sample 命令到控制终端
* 命令调用格式:pwm_led_sample
* 程序功能:通过 PWM 设备控制 LED 灯的亮度,可以看到LED不停的由暗变到亮,然后又从亮变到暗。
*/
#include <rtthread.h>
#include <rtdevice.h>
#define PWM_DEV_NAME "pwm1" /* PWM设备名称 */
#define PWM_DEV_CHANNEL 1 /* 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 += 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);
}
return 0;
}
下载后,打开终端,如果出现反复按重启键,程序无响应,则需要打开libc
至此,实验完成
实验结果