RT-Thread+STM32L475VET6实现呼吸灯


文章目录

  • 前言
  • 一、板载资源资源说明
  • 二、具体步骤
    • 1.新建rt_thread项目
    • [2. 打开PWM设备驱动](#2. 打开PWM设备驱动)
    • [3. 在Stm32CubeMX配置定时器](#3. 在Stm32CubeMX配置定时器)
    • [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


至此,实验完成

实验结果

相关推荐
李兴球16 分钟前
这个来自五线城市的C++兴趣班的程序可不一般
c++
White_Can43 分钟前
《C++11:智能指针》
c++·c++11·智能指针
无限进步_44 分钟前
【数据结构&C语言】对称二叉树的递归之美:镜像世界的探索
c语言·开发语言·数据结构·c++·算法·github·visual studio
im_AMBER1 小时前
Leetcode 98 从链表中移除在数组中存在的节点
c++·笔记·学习·算法·leetcode·链表
CSDN_RTKLIB1 小时前
C++取模与取余
开发语言·c++
星河耀银海1 小时前
C++开发入门——环境搭建与第一个程序
开发语言·c++·策略模式
_OP_CHEN2 小时前
【算法基础篇】(四十四)数论之欧拉定理与扩展欧拉定理深度解析:从降幂到超大规模幂运算
c++·算法·蓝桥杯·算法竞赛·欧拉定理·扩展欧拉定理·acm/icpc
liulilittle2 小时前
DeepWiki: OPENPPP2 工程价值
网络·c++·网络协议·ai·信息与通信·通信
星河耀银海2 小时前
C++面向对象编程:从基础到实战
开发语言·c++
Ccjf酷儿3 小时前
C++语言程序设计 (郑莉)第三章 函数
开发语言·c++