此文档作为对洋桃电子STM32F407单片机视频的整理,B站链接:第18集)定时器功能_哔哩哔哩_bilibili
1. 定时器介绍
STM32F407单片机内置了14个定时器TIM1~14,其中TIM1和TIM8是性能强大的高级定时器,TIM2~5是通用定时器,TIM9~14是性能有所不同的通用定时器,TIM6~7是功能较少的基本定时器。
1.1 各定时器与总线的连接关系
其中TIM1 TIM8~11挂接在APB2总线上,每个定时器都有对外部的独立通道,通道数量和实现的功能有所不同。另一侧TIM2~5、TIM12~14挂接在APB1总线上,每个定时器也有对外部的独立通道,TIM6~7也挂接在APB1总线上,但由于它们是基本定时器,没有外部通道。APB2总线的最大速度是84MHz,APB1总线最大速度是42MHZ,挂在其上的定时器会受到总线速度的限制。
1.2 定时器的基本工作原理
定时器的本质是一个16位计数器,TIM2和TIM5比较特殊是32位计数器。我们在启动定时器之前需要设置一个结束数值也就是溢出值,定时器开启时内部的计数器每过一个时钟周期将计数值加1,当数值加到溢出值时表示计数完成触发定时器中断,我们只要知道单片机一个时钟周期是多长时间,再乘以计数数量就能得出定时器从开启到触发中断的总时长,定时器的效果等同于延时函数,定时器的目的是延时,只要设置好溢出数值就能精确定时。
普通定时器(基本定时器) 是先设置一个溢出值,溢出后产生中断达到延时一段时间的效果。相比于延时函数,定时器在计时的过程中不会占用ARM内核,只有在溢出后才需要ARM内核处理中断程序,用定时器控制LED闪烁时主函数可以做其他工作,LED闪烁的计时与电平切换都由定时器功能完成。
1.3 定时时间计算公式
其中输入时钟频率是指RCC时钟分配给定时器功能的时钟频率,CubeMX时钟树视图的APB1 Timer clocks,是定时器TIM2~7、TIM12~14的时钟频率输入。APB2 Timer clocks是定时器TIM1、TIM8~11的时钟频率输入,如下图所示。
例如:使用TIM2达到1秒钟的溢出时间,通过公式计算得到多种参数组合,考虑到计数周期和分频系数是16位参数,最大值为65535,参数没有其他限制。
这里将计数周期设置为7199,分频系数设置为9999,当前HCLK频率是72MHz,最终计算结果是100万微秒即1秒钟。
2. 在CubeMX中设置TIM2定时器
2.1 设置TIM2中断允许
2.2 使用到的库函数
2.3 定时器程序
第98行CubeMX自动生成了TIM2定时器的初始化函数,执行完此函数后CubeMX设置的模式和参数将被写入TIM2定时器的寄存器,但此时定时器还没有启动,第100行调用的HAL_TIM_Base_start_IT函数,是开启定时器并允许中断的函数。
第63行是判断当前中断是不是TIM2产生的中断,“&htim2”表示定时器2功能句柄所在的地址。
3. PWM输出介绍
普通定时器虽然可以自动重装初值,但当定时器溢出时还是需要ARM内核来处理反转LED的电平状态,PWM脉宽调制器和输出比较器都可实现自动控制GPIO端口的电平输出。
PWM脉宽调制器可以向一个端口自动输出固定长度的高电平和低电平其中有效的电平占整个周期的比值叫做“占空比”,PWM功能可以在初始化时设定一个固定周期然后在PWM向端口输出的过程中修改占空比的值。PWM可用于控制舵机、步进电机。
3.1 在CubeMX中设置PWM功能
使PB1端口变成定时器3的通道4输出端
通道极性是指占空比中的有效电平,也就是占空比的“占”是高电平还是低电平。
3.2 PWM程序
第57行自动生成了TIM3定时器的初始化函数MX_TIM3_Init。
在第211~239得是MX TM3 Int函数的具体内容,在CubeMX中设置的参数都体现在这里。在单片机启动时就会执行这些程序从而完成TIM3的初始化设置。
在main.c文件的第79行定义变量a,用于存放不断累加的占空比数值,设置变量初始值为499。
在主循环之前的第104行,调用开启PWM通道输出的HAL_TIM_PWM_Start函数,函数的第一个参数是定时器句柄,第二个参数是通道编号。这里的参数是开启定时器3的PWM通道4。执行此函数后定时器开始输出固定占空比的PWM波形。
但要实现呼吸灯效果还需要连续不断地修改占空比,在主循环程序中第111行调用HAL _TIM_SetCompare函数,作用是修改占空比值,函数有3个参数 第一个参数是定时器句柄,第二个参数是PWM输出通道号,第三个参数是占空比的数值,占空比数值最小为0,最大是CubeMX中设置的计数周期499。所以第三个参数的取值范围是0~ 499。