通过定时器Timer方式实现串口通信及led灯闪烁

一.TIMER定时器介绍

1.stm32定时器

在这里插入图片描述

STM32f103系列一共有8个16位的定时器;
其中TIM6TIM7是基本定时器,TIM2、3、4、5是通用定时器,TIM1、8是高级定时器;
这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,适用于工业控制领域。

2.定时器工作分析

基本定时器:只具备最基本的定时功能,就是累加的时钟脉冲数超过预定值时,能触发中断或触发DMA请求;
芯片内部与DAC外设相连,可通过触发输出驱动DAC,也可以作为其他通用定时器的时钟基准;
使用的时钟源都是TIMxCLK,时钟源经过预分频器输入至脉冲计数器TIMx_CNT,基本定时器只能工作在向上计数模式,在重载寄存器TIMx_ARR中保存的是定时器的溢出值;
工作时,脉冲计数器TIMx_CNT由时钟触发进行计数,当计数器的值x等于重载寄存器中保存的数值N时,产生溢出事件,可触发中断或DMA请求,然后计数器重新置0,重新向上计数;
如下图所示:
在这里插入图片描述

通用定时器
通用定时器除了基本的定时,它主要用在测量输入脉冲的频率、脉宽与输出PEM脉冲的场合,还具有编码器的接口,如下图所示:
在这里插入图片描述
(图片源自网络,如有侵权,请联系删除)
1.捕获/比较寄存器
它在输入时被用于捕获(存储)输入脉冲在电平发生翻转时脉冲计数器的当前计数值,从而实现脉冲的频率测量;
在输出时被用来存储一个脉冲数值,把这个数值用于与脉冲计数器的当前计数值进行比较,根据比较结果进行不同的电平输出。
2.PWM输出过程分析
若配置脉冲计数器为向上计数,而重载寄存器被配置为N,即计数器的当前值x在时钟源的驱动下不断累加,当计数器的值大于N时,回充值计数器的数值为0并重新计数;
在计数器计数的同时,计数器的计数值x会与比较寄存器TIMx_CCR预先存储的数值A进行比较。当计数器的值小于A时,输出高电平(或低电平),相反则反之;
循环下去即得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉宽则为比较寄存器的值A乘以触发脉冲的时钟周期,即输出PEM的占空比为A/(N+1).
3.PWM输入过程分析
当定时器被配置为输入功能时,可以用于检测输入到GPIO引脚的信号,此时捕获/比较寄存器TIMx_CRR被用作捕获功能,简称捕获寄存器。
4.定时器的时钟源
通用定时器可以使用外部脉冲作为定时器的时钟源;
使用外部时钟源时,要使用寄存器进行触发边沿、滤波器带宽的配置。
下图为PWM输入时的脉冲宽度检测时序图;
在这里插入图片描述
工作过程:要测量的PWM脉冲通过GPIO引脚输入到定时器的脉冲检测通道,为图中的TI1;
在输入脉冲TI1的上升沿到达时,触发IC1和IC2输入捕获中断,这时把脉冲计数器的计数值复位为0,于是计数器的计数值X在时钟源的驱动下从0开始不断累加,直到TI1出现下降沿,触发IC2捕获事件,此时TIMx_CCR2把计数器的当前值2存储起来,计数器继续累加,直到TI1出现第二个上升沿,出发了IC1捕获事件,得到的当前计数值被保存到TIMX_CCR1中。
根据保存的数值很容易得到占空比和周期。
高级定时器
此类定时器除了具有基本、通用定时器的所有功能外,还具有三相6步电机的接口、刹车功能及用于PWM驱动电路的死区时间控制,使其非常使用于电机控制。

高级定时器结构如下图所示:
在这里插入图片描述

  • 相比较另外两种定时器,主要多出了BRK、DTG两个结构,具有了控制死区时间的控制功能;
  • 死区时间:在三相桥的PWM驱动电路中,上下两个桥臂的PWM驱动信号是互补的,即上下桥臂轮流导通,但实际上为了防止出现上下两个臂同时导通(会造成短路),在上下两臂切换时留一小段时间,上下臂都施加关断信号。
  • 在保证不出现短路的情况下,死区时间越短越好,时间太长会导致OCx或OCxN输出不正常

3.定时器中断应用

1.内部时钟的选择
在这里插入图片描述
如果APB1的分频系数非1,则通用定时器的时钟等于APB1时钟的2倍。
默认调用SystemInit函数情况下:
SYSCLK=72M
AHB时钟=72M
APB1时钟=36M
所以APB1的分频系数=AHB/APB1时钟=2
所以,通用定时器时钟CK_INT=2*36M=72M
2.计数模式

  • 向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器向上溢出事件。

  • 在这里插入图片描述

  • 向下计数模式:计数器从自动装载值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,产生一个计数器向下溢出的时间。

  • 在这里插入图片描述

  • 中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
    在这里插入图片描述
    3.定时器中断实验相关寄存器
    计数器当前值寄存器CNT
    在这里插入图片描述

预分频寄存器TIMx_PSC
在这里插入图片描述

自动重装载寄存器(TIMx_ARR)
在这里插入图片描述

控制寄存器1(TIMx_CR1)
在这里插入图片描述

DMA中断使能寄存器(TIMx_DIER)
在这里插入图片描述

4.定时器中断实现步骤:

1.使能定时器时钟(和之前的内容一样调用APB1的使能函数)
2.初始化定时器,配置ARR(重装载寄存器),PSC(预分频系数)
3.开启定时器中断,配置NVIC(调用中断使能函数和NVIC初始化)
4.使能定时器
5.编写中断服务函数(TIMx_IRQHandler())

二.stm32建立工程

1.配置RCC与SYS

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

2.配置GPIO

选择PB14作为LED灯的输出,将其选为GPIO-OUT,并命名为LD1
在这里插入图片描述

3.配置定时器

使用定时器2和定时器3来实现定时的功能。
选中定时器2;配置定时器2的时钟源为内部时钟;
设置分频系数为71,向上计数模式,计数周期为5000:
在这里插入图片描述
TIM3同理:
在这里插入图片描述
分频系数那里写的是71(72-1),因为系统处理的时候会自动加上1,所以实际进行的是72分频。由于时钟一般配置为72MHZ,所以72分频后得到1MHZ的时钟。1MHZ的时钟,计数5000次,得到时间5000/1000000=0.005秒。也就是每隔0.005秒定时器2会产生一次定时中断

4.配置USART1

选择Connectivity,点开USART1,Mode选择异步通信Asynchronous
在这里插入图片描述

5.配置中断

开启定时器2、定时器3及USART1的中断:
在这里插入图片描述

6.配置时钟树

在这里插入图片描述

7.生成keil文件

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

三.添加代码

1.启动相应的定时器

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

“h”表示HAL库,“tim2”表示定时器2,所以第一行代码的意思就是启动定时器2。第二行同理。
在这里插入图片描述

2.串口输出

uint8_t hello[20]="hello windows!\r\n";

在这里插入图片描述

3.定时器中断回调函数

在这里插入图片描述

四.线路连接

  • USB to TTL连线(不再过多赘述)
  • LED灯与stm32连接
    LED灯短脚 —> A5
    LED灯长脚 —> 3V3

1.编译烧录

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

2.结果显示

在这里插入图片描述

定时器实现led灯闪烁及串口通信

3.输出波形显示

如图进行对相关引脚的观察
我设置的LED输出端为PB14,串口输出为usart1
注意选择显示类型为bit

在这里插入图片描述
勾选图中所示相关参数
setup选择对应输出
左上角箭头所指为运行
即可得到所需波形
在这里插入图片描述
由下面两张图可以看出,通过放大波形后,串口端高电平持续时间约为91.05ns,低电平持续时间约为9.67us
在这里插入图片描述
在这里插入图片描述
由下面两张图可以看出,LED灯输出端高电平维持时间约为0.23s,低电平维持时间约为0.22s
在这里插入图片描述
在这里插入图片描述

五.总结

本次实验增加了定时器这个新的知识点,并且与之前所学的串口通信的知识以及led灯亮灭的知识相结合起来,使得端口输出的时间更加精确,刚开始有点迷糊,不知道如何把定时器与串口及led灯联系起来,通过查看以前实验的做法,以及参考学长学姐源于定时器设置的资料,把两者相连接,最终顺利完成了实验,同时因为使用了HAL来进行编程,使得许多相关函数都是写好的,大大减少了不必要的麻烦,需要注意的是应该多多理解基本知识,要先搞懂基础内容(比如这节我们学习的是定时器,那就要搞懂定时器的相关概念)实验基于理论,只有知道是怎么来的,才能清楚实验过程,更好的完成实验。

六.参考博客

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值