基于STM32利用定时器进行串口通信和点灯同时操作

一、简述定时器

1.定时器的定义

系统定时器是属于 CM3 内核中的一个外设,内嵌在 NVIC 中。系统定时器是一个 24bit 的向下递减的计数器,计数器每计数一次的时间为 1/SYSCLK,一般我们设置系统时钟 SYSCLK 等于 72M。当重装载数值寄存器的值递减到 0 的时候,系统定时器就产生一次中断,以此循环往复。
因为 SysTick 是属于 CM3内核的外设,所以所有基于 CM3 内核的单片机都具有这个系统定时器,使得软件在 CM3 单片机中可以很容易的移植。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。定时器实际上就是Soc当中的一个内部外设。

2.定时器与计数器的关系

定时器常与计数器扯到一起,计数器也是soc当中的一个内部外设,计数器顾名思义是用来计数的,就和我们的秒表一样,秒表实际上就是一个计数器,每隔一个单位走一个格(就是计一个数),因为计数器的计数时间周期是固定的,因此到了一定时间只要用计数值*计数时间周期,就能得到一个时间段,这个时间段就是我们定的时间(这就是定时器了)。计数器和定时器其实是同一个东西。

3.定时器的作用

(1)定时器可以让SoC在执行主程序的同时,可以(通过定时器)具有计时功能,到了一定时间(计时结束)后,定时器会产生中断提醒CPU,CPU会去处理中断并执行定时器的ISR。从而去执行预先设定好的事件。
(2)定时器就好像是CPU的一个秘书一样,这个秘书专门管帮CPU来计时,并到时间后提醒CPU要做某件事情。所以CPU有了定时器之后,只需要预先把自己XX时间之后必须要做的事情绑定到定时器中断ISR即可,到了时间之后定时器就会以中断的方式提醒CPU来处理这个事情。

4.定时器的分类

在这里插入图片描述
这里我们选用通用定时器。

5.定时器的模式

定时器:

  1. 16/32位 向上 向下 上下 计数模式, 自动重装载计数器 TIMx_CNT
  2. 16位可编程(实时修改) 预分频器(TIMx_PSC)
  3. 4个独立通道(TIMx_CH1 ~ 4):输入捕获;输出比较; PWM生成;单脉冲模式
  4. 可以和外部定时器集联

6.基本定时器的功能框图

在这里插入图片描述

二、用cubemx创建工程

创建新项目:ACCEE TO MCU SELECTOR
在这里插入图片描述
选择芯片
在这里插入图片描述
配置RCC
在这里插入图片描述
配置SYS
在这里插入图片描述以PA1作为LED灯的输出,选GPIO_Output
在这里插入图片描述
配置TIM2 位置1,选中定时器2;位置2,配置定时器2的时钟源为内部时钟;位置3,分频系数为71,向上计数模式,计数周期为5000,使能自动重载模式。在这里插入图片描述
配置TIM3在这里插入图片描述
配置NVIC的TIM2 global interrupt | TIM3 global interrupt
在这里插入图片描述
设置定时器2和定时器3的中断优先级
在这里插入图片描述
Connectivity–USART1–Asynchronous
在这里插入图片描述
配置时钟
在这里插入图片描述
生成项目-GENRATE CODE
在这里插入图片描述

三、代码的编译

将main.c中如下图中位置替换,启动定时器2和定时器3

	HAL_TIM_Base_Start_IT(&htim2);
	HAL_TIM_Base_Start_IT(&htim3);

在这里插入图片描述
在main.c中写给上位机需要发送的消息,如以下代码
uint8_t hello[20]="hello windows!\r\n";
在这里插入图片描述
利用定时器的中断回调函数进行串口通信

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	static uint32_t time_cnt =0;
	static uint32_t time_cnt3 =0;
	if(htim->Instance == TIM2)
	{
		if(++time_cnt >= 400)
		{
			time_cnt =0;
			HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
		}
	}
	if(htim->Instance == TIM3)
	{
		if(++time_cnt3 >= 1000)
		{
			time_cnt3 =0;
    HAL_UART_Transmit(&huart1,hello,20,100000);
		}
			
	}
}

在这里插入图片描述

四、电路的连接

led灯长引脚接3v3
led灯短引脚接A1

在这里插入图片描述

五、代码的实现(结果演示)

串口通信与点灯同时进行

六、总结

在之前的练习中,实现串口通信或led灯闪烁时,我们都是基于中断实现的,实际上利用中断实现比较浪费资源,用定时器实现就会很好的利用资源,在利用HEL库的基础上提高了效率,省去了自写函数易出错的问题,对定时器的理解更加深入,希望能够帮助到你!!

参考文献

定时器详解
STM32 Timer定时器分类和框图
STM32 定时器原理

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值