0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

手把手教你基于RT-Thread Studio使用STM32单片机的PWM外设

冬至配饺子 来源:乐乐爱学习 作者:乐乐爱学习 2023-09-28 15:12 次阅读

一、使用说明

目前我使用的是STM32L475系列单片机,是ali当时在PDD 50块钱卖的一个开发板,其他STM32单片机参考即可,这里会手把手教大家基于RTT Studio 来使用PWM。

二、创建工程

1.创建工程

首先大家打开RT-Thread Studio 来基于单片机创建工程。点击左上角文件,新建 RT-Thread项目
Project name就是项目名称,如果大家想自定义路径保存,就取消掉缺省位置然后自定义路径。

1.jpg

2.芯片参数设置

选择基于芯片,下面的参数需要大家根据自己的主板来选择,我这个板子 使用LPUART作为CMD输出,单片机型号,下载器比如JLINK或者STLINK等等都需要自己适配开发板。

1.jpg

3.下载设置

创建项目完成后大家可以先编译后下载进开发板测试一下 CMD的输出。
这里可以开启下载后自动软件复位。

1.jpg

4.编译 下载

大家在编译后就可以尝试下载。

1.jpg

我使用的工具是XShell,可以看到复位后有启动log输出,就正常啦。

1.jpg

三、修改时钟并配置串口

在创建工程的时候,RT-Thread Studio 默认使用的是内部低俗时钟,我们需要更改到外部高速时钟来提高MCU工作性能,后面PWM 的时钟外设也使用的是外部高速时钟。

1.打开CUBEMX

双击工程中的CUBEMX图标,可以打开cubemx,如果没有安装请自行安装。

1.jpg

2.打开高速时钟

打开CUBEmx的 System Core,选择RCC配置,将HSE与LSE均设置为Crystal/Ceramic Resonator,然后点击左上角文件保存。

1.jpg

3.配置时钟树

打开 Clock Configuration

1.jpg

锁相环PLL选择HSE,然后Clock Mux选择PLLCLK,PLLM数值选择合适的数值,这个一般都有参考,每种单片机时钟频率不同,大家可以搜索对应的时钟树设置。

1.jpg

4.打开LPUART

因为在创建工程时,默认打开了LPUART,但是使用cubemx获取代码后,LPUART是关闭的,我们需要重新打开LPUART。

1.jpg

首先在右侧选择 PB10与PB11 为LPUART外设,然后在左侧 Connectivity -LPUART外设中将Mode选择为Asynchronous 模式,就已经成功打开了。

5.获取代码

首先点击左上角文件 选择Save Project,然后点击右上角 Generate Code,代码获取完成后就可以关闭CubeMX了。

6.修改时钟定义

刚才Cubemx已经帮我们生成了时钟代码,但是代码需要我们手动加入到 BSP中,找到cubemx 里的src 然后打开main.c文件。

1.jpg

然后将 void SystemClock_Config(void) 这个函数内容复制到 drivers里的 drv_clk.c 文件中 void system_clock_config(void)。

1.jpg

7.编译下载

这时候时钟已经修改完成了,可以编译下载应该是没有错误的。
有一个reboot的调用警告,这是因为目前FINSH_FUNCTION_EXPORT_ALIAS 这个函数已经没有调用了,

1.jpg

MSH_CMD_EXPORT(reboot, Reboot System);
将这句代码替换掉上面的 FINSH_FUNCTION_EXPORT_ALIAS 即可。

四、配置PWM

1.使能PWM

首先打开RT-Thread Settings 打开PWM驱动。

1.jpg

选择组件,设备驱动程序,使能PWM,然后点击左上角保存。

1.jpg

2.配置时钟

配置时钟我们仍然需要使用CUBEMX工具,我目前要使用的PWM是A0引脚,将A0设置为TIM2的通道1

1.jpg

然后选择Timers 的TIM2 将通道1 设置为 比较输出模式。然后点击左上角保存,右上角获取代码。

3.修改驱动

这时候 CUBEMX已经帮我们生成了需要使用的代码,我们还需要将它修改到BSP里。
打开 cubemx的src文件夹,打开stm32l4xx_hal_msp.c,将以下三个函数的实现全部剪贴到drivers的board.c的最下面

1.jpg

void HAL_TIM_OC_MspInit(TIM_HandleTypeDef* htim_oc)
void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
void HAL_TIM_OC_MspDeInit(TIM_HandleTypeDef* htim_oc)

1.jpg

4.修改调用

打开drivers 里的 drv_pwm.c 找到 stm32_hw_pwm_init这个函数,在TIM初始化之前初始化以下时钟引脚。

在图里所示的位置调用这个函数。

HAL_TIM_OC_MspInit(tim);

1.jpg

5.配置PWM通道

这时候PWM的驱动就已经做好了,打开board.h ,打开需要使用的PWM通道
比如你使用的是TIM1,就是 pwm1, 通道同理。

#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1

1.jpg

6.保存编译

这时候我们需要使用的驱动已经全部构建完成了,接下来就使用RT-Thread的接口来完成用户代码吧。

五、用户代码

1.新建一个.c文件来存放用户代码,名字随便起,我放在了applications里,文件格式一定要加.c

1.jpg

2.PWM相关API
3.查找设备
rt_device_t rt_device_find(const char* name);
这个API会返回设备句柄
4.设置PWM参数
rt_err_t rt_pwm_set(struct rt_device_pwm *device,
int channel,rt_uint32_t period,rt_uint32_t pulse);
struct rt_device_pwm *device PWM设备句柄

int channel PWM通道数

rt_uint32_t period PWM周期,单位ns

rt_uint32_t pulse PWM脉冲宽度,单位ns

如果设置成功,会返回RT_EOK,

频率= 1000000000/period
占空比 = pulse/period

3.使能PWM通道

rt_err_t rt_pwm_enable(struct rt_device_pwm *device, int channel);
struct rt_device_pwm *device 这是设备句柄

int channel PWM通道数

如果使能正常的话会返回RT_EOK,其他错误就是使能失败。

3.PWM用户Demo
/*

Copyright (c) 2006-2021, RT-Thread Development Team

SPDX-License-Identifier: Apache-2.0

Change Logs:
Date Author Notes
2022-03-13 desktop the first version
/
#include
#include
//设置log文件
#define DBG_TAG "pwm_test.c"
#define DBG_LVL DBG_LOG
#include
#define PWM_DEV_NAME "pwm2" /
PWM 设 备 名 称 */
#define PWM_DEV_CHANNEL 1
struct rt_device_pwm pwm_dev; / PWM 设 备 句 柄 /
static int pwm_test(void)
{
rt_uint32_t period , pulse;
//设置周期及 脉冲长度
period = 200000;
pulse = 100000;
pwm_dev = (struct rt_device_pwm
)rt_device_find(PWM_DEV_NAME); //查找PWM设备
//配置PWM
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse); //占空比应该是50%
if (rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL) == RT_EOK)
{
LOG_D("PWM Init is ok tn");
return RT_EOK;
}
return RT_EOK;
}
MSH_CMD_EXPORT(pwm_test, pwm device sample);

代码注释基本上已经写清楚啦,我用的是TIM2的通道1,就是pwm2的通道1,大家可以参考这个Demo。

4.命令行调用

完成了代码,我们编译下载进单片机,打开命令行 输入help命令,可以将main中的log日志代码删除掉,不然会一直弹 Hello RT-Thread

1.jpg

可以看到help 显示的命令, pwm_test就是我们刚才用户代码的命令,

1.jpg

然后我用逻辑分析仪抓一下 PWM波形,应该是50%占空比。

1.jpg

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • PWM
    PWM
    +关注

    关注

    114

    文章

    5181

    浏览量

    213809
  • RCC
    RCC
    +关注

    关注

    0

    文章

    93

    浏览量

    26933
  • PWM波
    +关注

    关注

    0

    文章

    99

    浏览量

    16854
  • STM32单片机
    +关注

    关注

    59

    文章

    549

    浏览量

    58702
  • STM32L4
    +关注

    关注

    1

    文章

    42

    浏览量

    9408
  • RTThread
    +关注

    关注

    8

    文章

    132

    浏览量

    40861
收藏 人收藏

    评论

    相关推荐

    手把手教你单片机之AVR入门视频教程

    `手把手教你单片机之AVR入门视频教程AVR单片机软硬件设计视频教程-入门篇本视频是 力天电子 尹延辉 录制的 详情请登 力天电子第01讲-单片机
    发表于 03-02 11:04

    手把手教你单片机c语言》视频教程

    `《手把手教你单片机C语言》视频教程电驴、优酷、迅雷等下载地址《手把手教你单片机c语言》视频
    发表于 10-26 14:14

    力天手把手教你单片机视频全集下载

    .rarhttp://115.com/file/e7fv6828#17.第九讲.输出型外设与51的IO口上--力天手把手教你单片机之实战篇.rarhttp://115.com/fil
    发表于 02-14 17:06

    手把手教你单片机

    小宋老师单片机教程手把手教你单片机 链接: http://pan.baidu.com/s/1kTvEOo3 密码: vzox
    发表于 12-07 17:59

    手把手教你学CPLD/FPGA与单片机联合设计》-周兴华

    作者从2009年1月起,在《电子世界》杂志上连载了《手把手教你学CPLD/FPGA设计》讲座。《手把手教你学CPLD/FPGA与单片机联合设
    发表于 12-29 17:10

    手把手教你实战RT-Thread Nano,不信都这样了你还不会

    手把手教你实战RT-Thread Nano,不信都这样了你还不会
    发表于 11-23 10:30

    手把手教你STM32单片机

    整理资料来源【正点原子】 手把手教你STM32单片机教学视频 嵌入式 之 F103-基于新战舰V]NANO_STM32F103开发指南-H
    发表于 08-19 07:08

    手把手教你学习FPGA—LED篇

    电子专业单片机相关知识学习教材资料——手把手教你学习FPGA—LED篇
    发表于 08-08 17:19 0次下载

    手把手教你学LabVIEW视觉设计

    手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视觉设计手把手教你学LabVIEW视
    发表于 03-06 01:41 3130次阅读

    手把手教你学会AVR单片机pdf.01

    手把手教你学会AVR单片机pdf.01
    发表于 09-30 17:33 0次下载

    手把手教你学会AVR单片机pdf.02

    手把手教你学会AVR单片机pdf.02
    发表于 09-30 17:34 0次下载

    手把手教你学会AVR单片机pdf.03

    手把手教你学会AVR单片机pdf.03
    发表于 09-30 17:36 0次下载

    手把手教你学会AVR单片机pdf.04

    手把手教你学会AVR单片机pdf.04
    发表于 09-30 17:37 0次下载

    手把手教你学会AVR单片机pdf.05

    手把手教你学会AVR单片机pdf.05
    发表于 09-30 18:19 0次下载

    手把手教你开发基于单片机的wifi通信的物联网项目(远程灯控制)

    手把手教你开发基于单片机的wifi通信的物联网项目(远程灯控制)
    发表于 11-12 19:36 18次下载
    <b class='flag-5'>手把手</b><b class='flag-5'>教你</b>开发基于<b class='flag-5'>单片机</b>的wifi通信的物联网项目(远程灯控制)