Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
PWM
手把手教你基于RT-Thread Studio 使用STM32单片机的PWM外设
发布于 2022-03-14 12:30:32 浏览:5894
订阅该版
[tocm] # 一、使用说明 目前我使用的是STM32L475系列单片机,是ali当时在PDD 50块钱卖的一个开发板,其他STM32单片机参考即可,这里会手把手教大家基于RTT Studio 来使用PWM。 工程链接奉上,[Gitee链接](https://gitee.com/lele_0101/rt-thread-pwm---demo) # 二、创建工程 ## 1. 创建工程 首先大家打开RT-Thread Studio 来基于单片机创建工程。点击左上角文件,新建 RT-Thread项目 Project name就是项目名称,如果大家想自定义路径保存,就取消掉缺省位置然后自定义路径。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/5a537f4a6aecf9646bc6f36e340a587d.png.webp) ## 2. 芯片参数设置 选择基于芯片,下面的参数需要大家根据自己的主板来选择,我这个板子 使用LPUART作为CMD输出,单片机型号,下载器比如JLINK或者STLINK等等都需要自己适配开发板。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/d8d413eb1c6c546cfd61c1b593ec8409.png) ## 3. 下载设置 创建项目完成后大家可以先编译后下载进开发板测试一下 CMD的输出。 这里可以开启下载后自动软件复位。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/518e0edb732f1bf7b2c2cb0394400a41.png.webp) ## 4. 编译 下载 大家在编译后就可以尝试下载。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/59a1991a8a601323a4c3be200abe4a51.png.webp) 我使用的工具是XShell,可以看到复位后有启动log输出,就正常啦。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/3ff9eec9d1ab05ab3e141399553a2fc1.png.webp) # 三、修改时钟并配置串口 在创建工程的时候,RT-Thread Studio 默认使用的是内部低俗时钟,我们需要更改到外部高速时钟来提高MCU工作性能,后面PWM 的时钟外设也使用的是外部高速时钟。 ## 1. 打开CUBEMX 双击工程中的CUBEMX图标,可以打开cubemx,如果没有安装请自行安装。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/04d63bae76f86adfb7a45eb98917abf7.png.webp) ## 2. 打开高速时钟 打开CUBEmx的 System Core,选择RCC配置,将**HSE**与**LSE**均设置为**Crystal/Ceramic Resonator**,然后点击左上角文件保存。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/d245e57bcd9493d9ed4ee53b1a6184b6.png.webp) ## 3. 配置时钟树 打开 Clock Configuration ![image.png](https://oss-club.rt-thread.org/uploads/20220314/5232dad560b12fbe5235e80e7790a5ea.png.webp) 锁相环PLL选择HSE,然后Clock Mux选择PLLCLK,PLLM数值选择合适的数值,这个一般都有参考,每种单片机时钟频率不同,大家可以搜索对应的时钟树设置。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/1488c4013850f9673255abb8a7819408.png.webp) ## 4. 打开LPUART 因为在创建工程时,默认打开了LPUART,但是使用cubemx获取代码后,LPUART是关闭的,我们需要重新打开LPUART。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/4458c7d7edfe07ec9e797303ed6d5bae.png.webp) 首先在右侧选择 PB10与PB11 为LPUART外设,然后在左侧 Connectivity -LPUART外设中将Mode选择为**Asynchronous** 模式,就已经成功打开了。 ## 5. 获取代码 首先点击左上角文件 选择Save Project,然后点击右上角 Generate Code,代码获取完成后就可以关闭CubeMX了。 ## 6. 修改时钟定义 刚才Cubemx已经帮我们生成了时钟代码,但是代码需要我们手动加入到 BSP中,找到cubemx 里的src 然后打开main.c文件。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/c477c535dce25b52350e2cda02653f47.png.webp) 然后将 **void SystemClock_Config(void)** 这个函数内容复制到 drivers里的 drv_clk.c 文件中 **void system_clock_config(void)**。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/4cb0ea951909f810afb633e8fed4a1fd.png.webp) ## 7. 编译下载 这时候时钟已经修改完成了,可以编译下载应该是没有错误的。 有一个reboot的调用警告,这是因为目前FINSH_FUNCTION_EXPORT_ALIAS 这个函数已经没有调用了, ![image.png](https://oss-club.rt-thread.org/uploads/20220314/0115577a90262a84a83e6813e508fa1f.png) ``` MSH_CMD_EXPORT(reboot, Reboot System); ``` 将这句代码替换掉上面的 FINSH_FUNCTION_EXPORT_ALIAS 即可。 # 四、配置PWM ## 1. 使能PWM 首先打开RT-Thread Settings 打开PWM驱动。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/220f0a97e417fa269f29760162b1160f.png.webp) 选择组件,设备驱动程序,使能PWM,然后点击左上角保存。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/0a23fd352c9d9df5691548d41d6e0fcc.png) ![image.png](https://oss-club.rt-thread.org/uploads/20220314/29056f32149edf334d5a306918c6acd8.png) ## 2. 配置时钟 配置时钟我们仍然需要使用CUBEMX工具,我目前要使用的PWM是A0引脚,将A0设置为TIM2的通道1 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/cd7f162258b6005088c6fc29e437793f.png.webp) 然后选择Timers 的TIM2 将通道1 设置为 比较输出模式。然后点击左上角保存,右上角获取代码。 ## 3. 修改驱动 这时候 CUBEMX已经帮我们生成了需要使用的代码,我们还需要将它修改到BSP里。 打开 cubemx的src文件夹,打开stm32l4xx_hal_msp.c,将以下三个函数的实现全部剪贴到drivers的board.c的最下面 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/f6c73e548d639a9577c3402a60f48993.png.webp) ``` 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) ``` ![image.png](https://oss-club.rt-thread.org/uploads/20220314/9630ed2d73d6988108e467f2acd86d48.png.webp) ## 4. 修改调用 打开drivers 里的 drv_pwm.c 找到 **stm32_hw_pwm_init**这个函数,在TIM初始化之前初始化以下时钟引脚。 在图里所示的位置调用这个函数。 ``` HAL_TIM_OC_MspInit(tim); ``` ![image.png](https://oss-club.rt-thread.org/uploads/20220314/5a3ff1b47d99f89cd0d9ad67b9e7ecc2.png.webp) ## 5. 配置PWM通道 这时候PWM的驱动就已经做好了,打开board.h ,打开需要使用的PWM通道 比如你使用的是TIM1,就是 pwm1, 通道同理。 ``` #define BSP_USING_PWM2 #define BSP_USING_PWM2_CH1 ``` ![image.png](https://oss-club.rt-thread.org/uploads/20220314/19343603694e8e8f490a593058fb24ea.png.webp) ## 6. 保存编译 这时候我们需要使用的驱动已经全部构建完成了,接下来就使用RT-Thread的接口来完成用户代码吧。 # 五、用户代码 ## 1. 新建一个.c文件来存放用户代码,名字随便起,我放在了applications里,文件格式一定要加.c ![image.png](https://oss-club.rt-thread.org/uploads/20220314/ad5fc770b07c37f8851ace53fb7c1755.png.webp) ## 2. PWM相关API ### 1. 查找设备 ``` rt_device_t rt_device_find(const char* name); ``` 这个API会返回设备句柄 ### 2. 设置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 \t\n"); 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 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/88d554d358f5ffe53b7c2e43fafeccc5.png) 可以看到help 显示的命令, pwm_test就是我们刚才用户代码的命令, ![image.png](https://oss-club.rt-thread.org/uploads/20220314/e4be8e00c13d0f5d6fb5759ba90f9b0f.png) 输入命令后LOG会提示 PWM Init is ok ![image.png](https://oss-club.rt-thread.org/uploads/20220314/7a95213d2cc39628a17b7d0af016801c.png) 然后我用逻辑分析仪抓一下 PWM波形,应该是50%占空比。 ![image.png](https://oss-club.rt-thread.org/uploads/20220314/d2aa65af474256e8b97822a7c13f06d2.png.webp) # 六、总结 RT-Thread的驱动代码框架用起来非常简单,比标准库开发起来好用很多,外设学习完就继续学习内核,手把手系列教程也会继续更新呦。
4
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
乐乐爱学习
这家伙很懒,什么也没写!
文章
8
回答
3
被采纳
0
关注TA
发私信
相关文章
1
玩iot camera笔记之3测试试用3路pwm
2
[已解决]PWM输出异常分析
3
给RT-Thread添加PWM驱动框架
4
关于rt-thread-3.1.0 pwm
5
关于rt-thread的PWM框架在stm32f103vf应用的疑问
6
rt-thread stm32 bsp adc pwm 外设适配好了吗
7
stm32f103ze 添加pwm 设备失败
8
【正点原子】潘多拉IoT-STM32L475开发板 用menuconfig 看不到PWM....
9
关于rtthread 4.0.0版本中pwm的初始化定时器寄存器读写问题
10
RT-Thread正点原子战舰V3使用PWM设备驱动没有输出
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
USB
DMA
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
FAL
rt-smart
ESP8266
I2C_IIC
UART
WIZnet_W5500
ota在线升级
PWM
cubemx
flash
freemodbus
BSP
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
中断
编译报错
Debug
rt_mq_消息队列_msg_queue
SFUD
keil_MDK
msh
ulog
MicroPython
C++_cpp
本月问答贡献
出出啊
1517
个答案
342
次被采纳
小小李sunny
1444
个答案
290
次被采纳
张世争
812
个答案
177
次被采纳
crystal266
547
个答案
161
次被采纳
whj467467222
1222
个答案
148
次被采纳
本月文章贡献
出出啊
1
篇文章
2
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
1
篇文章
2
次点赞
crystal266
2
篇文章
2
次点赞
whj467467222
2
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部