1.首先在RT-thread Settings中打开PWM

然后点这个保存全部。(这个时候编译整个文件会报很多错)
2.打开Divers文件夹下的board.h文件
定义如上的两个。由于我开启的是定时器2的通道一(引脚是PA0),所以我定义了
#define BSP_USING_PWM2
#define BSP_USING_PWM2_CH1
3.打开位于dirvers文件夹下的stm32f1xx_hal_conf.h文件。

如图,把红圈部分的注释去掉。

可以看到,在宏定义了HAL_TIM_MODULE_ENABED后,包含了头文件tim.h。
4.打开stm32CubeMX软件,根据芯片新建工程。(我这里选择的是stm32f103c8t6)

开启外部高速时钟。

按自己需求配置TIMX。右侧将Clock Source设置为内部时钟,通道按自己需求,设置为PWM Generation CHX。
紧接着在下方

pwm波的频率=系统时钟频率/(arr+1)/(psc+1),UP即为向上计数。其实这三个参数配置没有什么讲究,按图中即可。如果系统时钟频率为72MHZ的话,那么该PWM波的一个周期为0.5毫秒。
紧接着滑动到最下方

模式为1即可,表示向上计数时,低于比较值的部分输出有效电平。
Pulse先设置为0。它可以理解为有效电平的宽度。它的范围为0到周期。
第三行第四行按默认即可。
第五行就是用来设置有效电平的。LOW即低电平为有效电平。
5.系统时钟配置

这里并不一定要按图中配置。图中是利于外部时钟开启PLL时钟。
接下来

第一行:自己起名。
第二行:自己选择生成的工程的位置
第三行(红线部分):选择工具。我用的是keil5,所以选择MDK-ARM V5。
接下来:

红线部分打√后点右上角生成代码。
打开生成好的工程。

先行编译一遍。然后

打开tim.c。
将上述代码粘贴到rt-thread studio中的 board.c下。

同样粘贴这一段代码到board.c下。粘贴完后将函数名中的Base改为PWM。
效果如下:

。。。。。

在rt-thread studio中的pwm.c文件中给出了pwm的初始化函数。但是我们已经用CubeMX初始化好pwm了,用它的函数还得再配置一遍,所以我们直接将CubeMX中的MX_TIM2_Init函数拷贝过来吧。之后可以进入这个函数来修改psc,arr,有效电平等的值。(更正一下,这里的MX_TIM2_Init不需要拷贝过来。rt-thread做的优秀很多,如果我们想改周期也不需要操作底层修改arr,psc等值。)

函数位于tim.c中,将其复制到rt-thread studio的main.c中(位于int main函数之后)。

在int main前加上这三句。(一个月后更正:一二句多余,MX_TIM2_Init多余)
6.最后一步,来到int main中
先加入MX_TIM2_Init();

“pwm2”因为我开启的是TIM2的1通道。划红线的1就是指通道1.画蓝线的499就是arr了。化黄线的0就是有效电平宽度了,修改这个值来输出不同占空比的pwm波。
(更正:画蓝线的是周期。周期是有一个公式的,它的值依赖psc,arr等的值。但这里呢,我们想让周期为多少就在蓝线部分填多少就可以了,rt-thread会自动将周期值配置成你想让的。周期以纳秒为单位,例如可以填为500000,就代表周期是500000纳秒,即0.5毫秒。当然也有可能你设置的周期过于大了,那么rt-thread会将周期配置成最大值。再说呢,其实pwm最重要的是占空比,周期设置多少无所谓,填500000就行)
按上图配置的话,PA0就会一直输出高电平。(因为低电平为有效电平,可有效电平的宽度为0,所以就会输出高电平了)。
至此就大功告成了!
本文详细介绍了如何在STM32单片机上使用RT-Thread和CubeMX配置PWM,包括设置定时器、时钟配置、HAL库启用及CubeMX中的参数调整,适合初学者和嵌入式开发者参考。
4290





