用定时器Timer方式实现LED周期性闪烁

一、环境配置

软件:STM32CubeMX:6.6.1
Keil 5.31
mcuisp
硬件:STM32F103C8T6

二、定时器简介

STM32F4 的定时器功能十分强大,有 TIME1 和 TIME8 等高级定时器,也有 TIME2TIME5,TIM9TIM14 等通用定时器,还有 TIME6 和 TIME7 等基本定时器,总共达 14 个定时器之多。
定时器分类
在这里插入图片描述
定时器功能介绍

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 不支持)

计时器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。

1.向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
2.向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
3.中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

三、用STM32CubeMX配置工程

1.点击“ACCESS TO MCU SELECTOR”来创建一个新的工程:
在这里插入图片描述
2.搜索型号,选择合适的型号进行工程建立
在这里插入图片描述

3.打开外部时钟,点击“System Core” ,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”
在这里插入图片描述

4.选择调试接口,点击“System Core”,选择SYS。,在右侧弹出的菜单栏中选择“Serial Wire”。
在这里插入图片描述

5.点击GPIO,配置管脚,将PC15设置为GPIO-OUT,并设置User Label为D1
在这里插入图片描述
6.配置定时器2。这里我们使用定时器2来实现定时的功能。如图所示,依次点击位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。
在这里插入图片描述
分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们一般会配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断。
7.配置中断。如下图所示,开启定时器2的中断。
在这里插入图片描述
如下图所示,生成定时器2中断优先级配置代码。
在这里插入图片描述

8.配置时钟。在这里插入图片描述

9.点击“Project Manager” ,再点击“Code Generator” ,进行配置
在这里插入图片描述
再点击“Project ”,进行配置后,点击“GENERATE CODE”,生成项目
在这里插入图片描述

四、用Keil配置代码

1.打开生成的工程,找到mian.c,将如下代码添加到如下图位置:

HAL_TIM_Base_Start_IT(&htim2);

在这里插入图片描述
该函数表示启动相应的定时器, “h”表示HAL库, “tim2”表示定时器2。所以这行代码的意思就是启动定时器2。
同样在main.c中找到如下位置写入代码:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    
    
	static uint32_t time_cnt =0;

	if(htim->Instance == TIM2)
	{
    
    
		if(++time_cnt >= 400)
		{
    
    
			time_cnt =0;
			HAL_GPIO_TogglePin(D1_GPIO_Port,D1_Pin);
		}
	}
}

在这里插入图片描述

该函数为定时器的中断回调函数,当产生定时中断的时候,会自动调用这个函数。在函数内部定义了一个静态变量:time_cnt。当它大于等于400的时候,才会执行if里面的代码。也就是说需要发生400次中断,才会让LED的状态翻转。前面已经算过了,一次定时中断的时间是0.005秒,所以400次中断的时间是0.005*400=2秒。也就是说每隔2秒,LED的状态翻转一次。

五、运行效果

TIMER_LED

六、总结

本次实验完成了用定时器Timer方式实现LED周期性闪烁,了解了定时器的相关知识,又多积累了一点知识。

七,参考资料

http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/
https://blog.csdn.net/weixin_66578482/article/details/126322102?ops_request_misc=&request_id=&biz_id=102&utm_term=STM32%E7%AC%94%E8%AE%B0%E4%B9%8B%20Timer&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-126322102.142v59pc_rank_34_1,201v3add_ask&spm=1018.2226.3001.4187

猜你喜欢

转载自blog.csdn.net/qq_55894922/article/details/127519318