当前位置:   article > 正文

STM32定时器控制LED闪烁_stm32定时器控制led灯闪烁

stm32定时器控制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);
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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

四、展示效果

QQ视频20221028223203

五、总结

通过本次实验了解到了定时器的概念,原理,以及如何使用,并在STM32CUBEMAX让其与led闪烁搭配一起使用,收获良多。

六、参考资料

http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/
https://blog.csdn.net/weixin_66578482/article/details/126322102
https://blog.csdn.net/qq_44016222/article/details/123507270

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/565728
推荐阅读
相关标签
  

闽ICP备14008679号