STM32定时器控制LED闪烁的实现方法
文章目录
一、定时器介绍
上来说就是用来定时的机器,是存在于STM32单片机中的一个外设。STM32总共有8个定时器,分别是2个高级定时器(TIM1、TIM8),4个通用定时器(TIM2、TIM3、TIM4、TIM5)和2个基本定时器(TIM5、TIM6),如下图所示:
这三种定时器的区别如下:
STM3 的通用 TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:
1.16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。
2.16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~ 65535 之间的任意数值。
3.4 个独立通道(TIMx_CH14,TIM9TIM14 最多 2 个通道),这些通道可以用来作为:
A.输入捕获
B.输出比较
C.PWM 生成(边缘或中间对齐模式) ,注意:TIM9~TIM14 不支持中间对齐模式
D.单脉冲模式输出
4.可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
5.如下事件发生时产生中断/DMA(TIM9~TIM14 不支持 DMA):
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不支持)
F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持)
二、STM32C配置项目
1.新建工程
2.配置引脚
3.配置SYS
4.配置GPIO
5.配置定时器
这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。
注:分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。
6.配置中断
开启定时器2的中断
生成定时器2中断优先级配置代码
7.时钟配置
8.创建代码
三、修改keil代码
生成工程后,打开,添加中断响应之后所需的一些代码。在main.c文件中添加如下内容,位置1:
注:该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2。
HAL_TIM_Base_Start_IT(&htim2);
位置2:
代码如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static uint32_t time_cnt =0;
if(htim->Instance == TIM2)
{
if(++time_cnt >= 100)
{
time_cnt =0;
HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
}
}
}
该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于100的时候,才会执行if里面的代码。也就是说需要发生100次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以100次中断的时间是0.005*100=0.5秒。也就是说每隔0.5秒,LED的状态翻转一次。
修改后,保存,编译、下载,重新上电。可以看到LED1差不多每隔0.5秒翻转一次,实现了我们想要的效果。
四、实物连线
五、实验效果
VID_20221027_212402
六、总结
通过本次实验完成了利用定时器实现LED灯0.5秒周期闪烁,在学习定时器知识的同时也提高了动手能力。