【嵌入式系统基础第八周作业a】---定时器

a.定时器和delay函数

delay函数和定时器可以实现一样的效果,但是这种方式,相当于让CPU一直在做无用功,还不能做别的事情。通过定时器的方式实现时间的精准控制,相当于给CPU上了一个闹钟,CPU平时处理其它任务,当定时时间到了以后,处理定时相关的任务

1.STM32CUBEMX_定时器控制LED闪烁

1.1 选择芯片,新建项目

1.2配置RCC(打开外部时钟),SYS(选择调试接口)

在这里插入图片描述

在这里插入图片描述

1.3配置GPIO

在这里插入图片描述

1.4配置时钟

在这里插入图片描述

1.5配置定时器

这里我们使用定时器2来实现定时的功能。分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。分频系数那里虽然写的是71,但系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟我们配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断
在这里插入图片描述

1.6配置中断

开启定时器2的中断

在这里插入图片描述
在这里插入图片描述

1.7保存项目,生成工程文件

1.8修改工程

在main.c文件中添加如下代码

代码1:
在这里插入图片描述

HAL_TIM_Base_Start_IT(&htim2);

该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2

代码2:
在这里插入图片描述

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秒,所以100次中断的时间是0.005*400=2秒。也就是说每隔2秒,LED的状态翻转一次。

1.9编译后烧录测试

效果展示:

在这里插入图片描述

2.M32CUBEMX_定时器控制串口发送

2.1 选择芯片,新建项目

2.2配置RCC(打开外部时钟),SYS(选择调试接口)

步骤同上1.2处

2.3配置串口

在这里插入图片描述

2.4配置时钟

步骤同上1.4处

2.5配置定时器

步骤同上1.5处

2.6配置中断

步骤同上1.6处

2.7保存项目,生成工程文件

2.8修改工程

在main.c文件中添加如下代码

代码1:

在这里插入图片描述

HAL_TIM_Base_Start_IT(&htim2);

该函数表示启动相应的定时器,“h”表示HAL库,“tim2”表示定时器2。所以这行代码的意思就是启动定时器2

代码2:
在这里插入图片描述

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

	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 1000)
		{
			time_cnt =0;
			HAL_UART_Transmit(&huart1, (uint8_t *)"hello windows!\r\n", 16 , 0xffff);
		}
	}
}
  

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

2.9编译后烧录测试

效果展示:
请添加图片描述

3.总结

相对于延迟函数而言 ,掌握了定时器这种更为高效和精确的延时控制方式,可以让写得代码更有实际意义

4.参考

http://www.mcublog.cn/stm32/2021_01/stm32cubemx-dingshiqi-led/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值