首先要知道定时器的原理,我用的是通用定时器,简单说一下,就是把握两个寄存器的值,自动重载寄存器ARR和比较寄存器CCR,ARR决定PWM方波的频率,CCR决定占空比,方波什么时候翻转。要是原理一点不懂,建议先看看课。
Cubemx配置
首先根据自己选用的芯片手册,看定时器挂载在哪个总线下,我使用的是正点原子mini板,选择通用定时器,可以看到通用定时器都挂载在APB1总线下
打开cubMX,选择芯片
先配置RCC,选择外部高速时钟源
配置时钟树为最大频率
配置TIM3,根据实际需求配置,我需要50Hz,占空比5.5%或者9.5%,首先选择TIM3的时钟源,这个Internal Clock就是APB1总线,因为我就需要一路pwm,所以只配置一路为PWM输出模式,具体选择哪个通道根据自己需求即可,不同的通道IO引脚不一样
下面说频率,前面说过通用定时器都挂载在APB1总线上,看时钟树可知总线频率为72MHz
我需要频率为50Hz ,PRescaler和Counter Period两个数值决定了频率,这两个数值根据需要自己选择,没有固定值,只要能凑出你需要的频率即可
公式:APB1频率/Prescaler/Counter Period=所需频率
也就是 72Mhz/7200/200=50
频率完成,接下来就是占空比,占空比由Pulse决定,公式:占空比=Pulse/Counter Period
我需要占空比为5.5%,9.5%,Pulse就是200*5.5%=11和19,根据自己的需求在pulse位置太难如所需的占空比,即可。我这里选择零,不板子一上电就输出方波。
选择MDK
分文件编程
点击generate code生成代码即可
最后一步,在工程文件下,打开keil工程,在main.c里添加打开PWM的代码,选择好定时器和通道就能输出所需的方波了。
如果需要改占空比,则需要用到_HAL_TIM_SET_COMPARE这个函数
我这里做了额外的处理,在接收到串口的消息以后,根据消息不同,输出不同的占空比,需要用到串口,可以看zigbee那块的笔记。
只需要在main.c 调用中断回调函数即可,代码如下
连接示波器,就能看到现象