stm32通过hal库使用定时器
文章目录
实验目的
设置定时器,每隔5秒向串口助手发送Hello World,每隔两秒闪烁LED灯。
实验材料
硬件
软件
原理
在STM32芯片中不同数量的定时器,分为系统定时器,高级定时器,通用定时器以及基本定时器。
本实验使用到的是通用定时器。通用定时器 TIM2/3/4/5 是一个 16 位的可以向上/下计数的定时器,可
以定时,可以输出比较,可以输入捕捉。
下面是野火的零基础玩转STM32中的资料,介绍了定时器的原理:
项目制作
CubeMX配置
1、时钟配置
点击SystemCore -> RCC,配置HSE。
再点击Clock Configuration,按下图进行操作,将APB2频率配置为72MHz。
2、配置GPIO
根据实验要求,需要使用定时器控制LED灯,因此要使用一个GPIO口来控制LED灯。
按下图进行配置即可,有什么不懂的可以看看这篇文章。
3、配置定时器
C8T6板子里面有高级定时器TIM1以及通用定时器TIM2-4,这里使用基本定时器即可。
因为既要控制LED,又要发数据,为了区分功能,我使用两个定时器来实现。
点击Timers -> TIM2,将Clock Source设定为Internal Source。
下面Prescaler设定为71,计数设置为2000,启动自动重载。
分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,记一次数是0.001ms,这里写成2000就是2ms触发一次中断。软件层面再通过代码,每触发1000次中断闪烁一次LED灯,也就是2s。
记得点击NVIC Setting开启中断,以及点击SystemCore -> NVIC ->Code Generation生成优先级函数,这里忘了截图。
再用同样的方法配置Tim3用于串口通信,因为频率是5s,所以计数要设置为5000,也是每触发1000次中断才发送数据。
4、配置串口
按图配置即可,有不懂的可以看看这里。
5、按图配置好路径,生成项目
代码编写
1、开启定时器
HAL_TIM_Base_Start_IT(&htim2);
HAL_TIM_Base_Start_IT(&htim3);
2、编写中断函数
无论是哪个定时器触发中断都会执行HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)函数,这个函数的参数表示是哪一个定时器触发了中断。
写两个静态变量记录两个定时器触发中断的次数。前面已经说过,TIM2每2ms触发一次中断,因为LED闪烁时间间隔要求是2s;TIM3是5ms触发一次中断,因为发送数据的时间间隔是5s。每触发一次中断,根据定时器的不同来把不同的变量+1。
当某个变量达到1000时,就执行对应的操作。
实验现象
烧录到单片机后,LED每2s闪烁一次,串口助手每5s收到数据:
总结
定时器在被启动后,会根据设置的计数个数开始计数,并且计数完毕后触发中断。用户可以在中断内编写想要执行的操作。
最经典的定时器案例,其实应该是控制蜂鸣器播放音乐。笔者以前使用51单片机实现过,但是实现过程比较复杂,要考虑音调的频率,延音与抬手,以及bpm设置。因此在stm32还没有尝试过。日后笔者会尝试。
参考资料
《零基础玩转STM32F103指南者》
http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/