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。
接下来:
红线部分打√后点右上角生成代码。
打开生成好的工程。
先行编译一遍。然后
将上述代码粘贴到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,所以就会输出高电平了)。
至此就大功告成了!