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

发布者:平安幸福最新更新时间:2024-09-23 来源: elecfans关键字:RT-Thread  Studio  STM32  单片机  PWM外设 手机看文章 扫描二维码
随时随地手机看文章

一、使用说明

目前我使用的是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


关键字:RT-Thread  Studio  STM32  单片机  PWM外设 引用地址:手把手教你基于RT-Thread Studio使用STM32单片机的PWM外设

上一篇:如何将ThreadX移植到STM32H7平台
下一篇:MAVLink学习之路04_MAVLink移植到STM32具体步骤

推荐阅读最新更新时间:2024-11-12 10:54

STM32中断优先级的理解与使用
一、中断的分类: 全局中断就是在运行程序的任何一部分都可以立即执行中断服务,如果是在程序的中断才添加开放中断指令就是说有条件满足中断的时候,也只能在执行允许中断的指令后才执行中断服务。   外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备 的中断请求。   内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算 溢出、单步中断等)所引起的中断。 STM32F10的每个IO口都可以设为外部中断,最多可设19个,16+3=19 在设计硬件的时候要注意,不要将外部中断连接到PA 、PB1]、PC 等,这样的话处理器只能选择一个作为中断源。 另外: EXTI线
[单片机]
STM32串口的问题
今天在使用USART模块,遇到了一些问题并解决了,于是发贴共享。 问题描述: 在使用USART做串口通讯时,我只把接收中断打开,并设置抢占优先级为最低一个级别,而接收中断上一个优先级处理事情比较多,可能占用了2ms时间。当我使用9600波特率往下位机发送数据,速度非常快,就是一直按回车发!问题就出来,不到1分钟时间,通讯没有反应了。USART配置代码如下: void uart_config(void) { USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = UART_GetBaud(BaudRate); USART_
[单片机]
STM32硬件复位后无法启动
最近遇到一个很奇怪的问题,把STM32的reset脚拉低后再拉高,也就是所谓的硬件复位,按道理来说,STM32应该重启才对,可是并没有,连main函数都没进去,然后再反复做几次硬件复位,有时又可以重启,奇怪。我把代码里的其他业务逻辑去掉,仅仅初始化串口打日志。然后再硬件复位,可以重启。大致推断,硬件复位后,应该是卡死在了串口中断,我把串口中断都禁止掉,再硬件复位,可以正常重启。 后来参考了网友的博客,在串口中断里清除掉一些标志位,就不会卡死在串口中断了。具体代码如下: void USART3_IRQHandler(void)// ; USART3 { u8 data; if(USART_GetITStat
[单片机]
MSP430单片机实践篇---数字型LCD-1602显示
/************************************************** * * LCD1602显示 * cpu:AVRmega16 * * 描述:4线数据宽度,操作Lcd1602 * 在LCD1602屏幕上第一行显示  www.goodmcu.cn * 第二行显示 13652037001 * 如果没有显示请按复位键,并多试几次 * * 调试成功(出现问题主要是因为LCD第3脚V0的2K接地电阻没有接好) * * 硬件电路:MSP430F135核心实验板-I型 * 硬件连接: * * MSP430与LCD连接信息 * LCD1602,4位接口,即使用D4-D7数据口,D0-D3不接入MCU * PI
[单片机]
stm32学习笔记(八)中断服务函数与函数调用的区别
在《微机原理》和《计算机组成》等课程 教学中(本文以MCS-51单片机为例),中断过程既是教学难点又是教学重点,它与主程序调用子程序过程有一定相似性,但又有很大区别,调用子程序过程相对比较容易掌握,通过把两过程结合起来,采用比较教学方法,能收到了很好的教学效果。 1、两过程定义与作用 子程序是微机基本程序结构中的1种,基本程序结构包括顺序(简单)、分支(判断)、循环、子程序和查表等5种。 子程序是一组可以公用的指令序列,只要给出子程序的入口地址就能从主程序转入子程序。子程序在功能上具有相对的独立性,在执行主程序的过程中往往被多次调用,甚至被不同的程序所调用。一般微机首先执行主程序,碰到调用指令就转去执行子程序,
[单片机]
基于单片机C805lF040的水温遥控遥测系统的设计
引言 温度遥控遥测是远程实现对温度的测量与控制,特别适合那些环境恶劣,测量人员不容易接近的场合,近年来在工农业生产中应用广泛。根据遥控遥测系统的特点,提出了对水温遥控遥测的设计方案。 温度遥控遥测系统主要由微处理器系统、测温模块、加热模块、通信模块、液位模块以及上位机软件等组成。系统构成如图1所示。 测温模块测量液体温度后,把温度数值发送给微处理器,当温度变化达到一定值后,加热模块开始加热,首先可以在设定的时间内,加热到设定的温度并稳定在该温度一段时间。系统通过两个通信模块实现遥测遥控,上位机设好温度参数后,通过通信模块传给远处的微处理器,微处理器按照上位机设定好的温度控制加热模块进行加
[单片机]
基于<font color='red'>单片机</font>C805lF040的水温遥控遥测系统的设计
开发STM8单片机,需要哪些开发工具?
使用STM8单片机开发自己的系统,在硬件开发工具方面,一般需要:仿真器、编程器,对于新手来说可能还需要开发板、学习板。软件方面需要对应的开发软件。 STM8的开发软件下载地址 STM8仿真器,编程器的介绍网址(点击查看),STM8开发板、学习板的介绍网址(点击查看) 下面先介绍一些与STM8开发工具相关的关键述语,在后面的使用中,您将会接触到。 问:STM8的仿真方式有哪些? 答:一般来说,STM8所有系列的单片机都是通过SWIM接口仿真。 问:STM8的编程方式有哪些? 答:一般来说,STM8所有系列的单片机都是通过SWIM接口编程。 问:什么是SWIM接口? 答:SWIM接口是STM8的调试系统的调试和
[单片机]
在Mac OSX中开发STM32程序
在Mac OSX下编写STM32程序: 1、下载stm32的gcc软件包,参考下面URL: 2、安装moxa NPORT 5110在虚拟Windows中; 3、安装ST Flash Loader 软件; 需要注意的: 1、Mac OSX 需要10.5; 2、NPORT装完要关机重启;
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved