STM32处理器定时器分析(实现一个定时中断)

最新更新时间:2021-11-29来源: eefocus关键字:STM32  处理器  定时器  定时中断 手机看文章 扫描二维码
随时随地手机看文章

前言:

1.本博文基于STM32F103ZET6芯片和ST官方提供的3.5.0库函数;

2.学习过51单片机学习STM32定时器会容易理解一些,但是两个定时器的实力有很大的距离;

3.定时器是难点也是重点;本博文以通用定时器TIM2~TIM5来说明;例程是TIM3

6.定时器结构稍复杂,寄存器较多,本博文根据一个简单的定时器中断实验展开,所列出的相关寄存器是专门针对本次实验来说的,其他不相关定时器不再列出;


一 STM32定时器的分类

1.高级定时器: TIM1和TIM8

2.通用定时器: TIM2,3,4,5;

3.基本定时器: TIM6和TIM7;


二 通用定时器的功能

(1)16位向上,向下,向上/向下自动装载寄存器(TIMx_CNT)(向上/向下模式也就是中间对齐模式)

(2)16位可编程逻辑预分频器(TIMx_PSC),计数器时钟频率的分频系数为1~65535之间的任意值;

(3)4个独立通道(TIMx_CH1~4),这些通道可以用来作为:

① 输入捕获 比如:测量输入信号的脉冲宽度

② 输出比较

③ PWM生成(边缘或中间对齐模式)

④ 单脉冲模式输出

(4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用1个定时器控制另一个定时器)的同步电路

(5)如果以下事件发生时产生中断/DMA:

A.更新:计数器向上或向下溢出,计数器初始化(通过软件或内部/外部触发)

B.触发事件(计数器启动,停止,初始化或者内部/外部触发计数)

C.输入捕获

D.输出比较

E.支持针对定位的增量(正交)编码器和霍尔传感器电路

F.触发输入作为外部时钟或者按周期的电流管理;


三 定时器时钟系统以及时钟源

因为时钟是计算定时器周期的关键因素,所以时钟源的大小和属性必须要熟悉;

(1) 首先看相对应的时钟图

在这里插入图片描述

需知1:

基于3.5.0库开发的基础上,程序在运行到main函数之前会调用SystemInit()函数,此函数会配置STM32时钟系统作为初始化,初始化的结果就是:

SYSCLK 72MHz

AHB 72MHz

PLCK1 36MHz

PLCK2 72MHz

PLL 72MHz

APB1 36MHz

需知2:

三种定时器的时钟源(下表中的时钟是基于库函数的配置的)

这里写图片描述

定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。

下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2到5的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。

有人会问,既然需要TIM2到7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2到7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。

再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。


需知3: 定时器的时钟源有4个

(1)内部时钟(CK_INT)

本实验采用CK_INT,CK_INT的来源如下图

在这里插入图片描述

(2)外部时钟模式1:外部输入引脚(TIx)

(3)外部时钟模式2:外部触发输入(ETR)

(4)内部触发输入(ITRx):使用定时器A作为定时器B的预分频器(A为B提供时钟源);


时钟源的选择取决于从模式控制寄存器TIMx_SMCR;


四 涉及到的相关寄存器

(1)控制寄存器1 TIMx_CR1

这里写图片描述
这里写图片描述
这里写图片描述

符号解释:Tdts 采样频率基准 ; Tck_int 定时器输入频率;

时钟分频因子:这个在介绍定时器输入捕获的时候会经常用到;这里先简单介绍,后来再详细介绍:

对于定时器时钟分频因子需要控制寄存器1TIMx_CR1的CKD[1:0]位和从模式寄存器TIMx_SMCR的ETF[3:0]位的配合;

栗子:当Fck_int = 72MHz时,选择Fdts = Fck_int/2 = 36MHz,采样频率Fsampling = Fdts/2 = 18MHz且N=6,则频率高于3MHz的信号将会被滤波器滤除,有效的屏蔽于高于3MHz的干扰;

(2)计数器 TIMx_CNT

在这里插入图片描述

(3)预分频器 TIMx_PSC

在这里插入图片描述

[15:0]:预分频的值可以在1~65536范围内任意选取;这个值就决定将定时器的输入时钟源频率(比如72MHz)分频为多少;

(4)自动重载寄存器TIMx_ARR

这里写图片描述

在物理层面上,ARR有两个,分别是程序员可以操作的ARR寄存器和影子寄存器(不能被直接操作的寄存器);实际上真正起作用的是影子寄存器;在TIMx_CR1寄存器中的ARPE = 1时(TIMx_ARR寄存器被装入缓冲器),在每次更新事件发生的时候,ARR内的值将会被装载到影子寄存器;

(5)中断/DMA中断使能寄存器 TIMx_DIER

这里写图片描述
这里写图片描述
这里写图片描述

[0]:即UIE位为更新中断允许位,控制所有更新中断的产生;

(6)状态寄存器 TIMx_SR

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

(5)事件产生寄存器TIMx_EGR

这里写图片描述
这里写图片描述
这里写图片描述

这里暂时只看[0]位;

[0]:如果置1将产生更新事件;


这里强调一个很重要的概念,加深一下对更新的理解:

(1)什么是更新?

顾名思义就是一个东西不再继续而回到了原点,比如定时器溢出(这里比如说是上溢出),就是一个更新事件,这件事情一旦发生,就会使得定时器清零,然后继续递增数值,直到下次溢出,然后往复循环;

(2)更新后会造成一些什么?

〇所有的寄存器都将被更新;

Ⅰ预分频器的计数器清零被清零(但是分频系数不变);

Ⅱ如果使能TIMx_DIER寄存器的第[0]位,则会产生产生更新中断,进入中断函数;

Ⅲ硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF)

Ⅳ重复计数器被重新加载为TIMx_RCR寄存器的值(TIMx_ARR)

(3)产生更新时间的方式

Ⅰ计数器上溢/下溢;

Ⅱ设置UG位;


五 中断周期的计算

T_out = (arr+1)(psc+1)/CK_INT;

T_out:中断产生周期;

arr:自动重装载的值;

psc:预分频寄存器的值;

CK_INT:内部时钟频率;


六 编程步骤

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;

//第一步:开启要使用的定时器的使能

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

//初始化定时器:配置定时器的时基单元(TIMx_CNT,TIMx_PSC,TIMx_ARR),计数模式,和分频系数;

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //设置TIMx_CR1寄存器的[9:8]位;这里设置成1分频,即不分频;定时器3的时钟频率等于APB1后的倍频来的值(这里是72MHz)


TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置TIMx_CR1寄存器的[6:5]位;这里设置为上升模式;

TIM_TimeBaseInitStructure.TIM_Period = 4999; //设置TIMx_ARR寄存器;也就是定时器溢出周期;

TIM_TimeBaseInitStructure.TIM_Prescaler = 7199; //设置TIMx_PSC寄存器;定时器的预分频值;(1~65536)


//这里计算一下:溢出周期T = (4999+1)*(7199+1)/72000000 = 0.5s;级每0.5s溢出一次;


TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure); //普通定时器初始化;


//第三步:开启定时器中断

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //配置TIMx_DIER寄存器的[0]位,使能定时器的更新中断;


//第四步:开启定时器;

TIM_Cmd(TIM3,ENABLE); //开启定时器


//第五步:相应中断函数

void TIM3_IRQHandler(void)

{

if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET) //检测TIMx_SR寄存器[0]位是否被置位(也即是更新中断是否发生)

{

//逻辑代码;

}

TIM_ClearITPendingBit(TIM3,TIM_IT_Update);    //清除TIMx_SR寄存器[0]位;

}

关键字:STM32  处理器  定时器  定时中断 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic555848.html

上一篇:STM32的USART分析
下一篇:STM32定时器输出比较(PWM)

推荐阅读

了解STM32标准库
CMSIS标准和库层次关系由于Cortex系列芯片采用相同的内核,区别在于核外的片上外设之间的差异,这些差异导致软件在同核不同外设的芯片上移植困难。为了解决这些兼容问题ARM 与芯片厂商建立了 CMSIS 标准(Cortex MicroController Software Interface Standard)。CMSIS架构图库目录文件的简介Libraries:驱动库的源代码和启动文件,使用的固件库也在其中Project:官方提供的利用驱动库写的例子和工程模板,特别是为每个外设写的例子Utilities:包含了基于 ST 官方实验板的例程,不需要用到,略过即可stm32f10x_stdperiph_lib_um.chm: 库帮助
发表于 2022-01-20
了解<font color='red'>STM32</font>标准库
stm32的注意事项
; 翻译过来的意思是 非void函数“key_scan”末尾缺少return语句。在最后添加 return 0 这个结尾语句stm32 中寄存器后缀缩写
发表于 2022-01-20
<font color='red'>stm32</font>的注意事项
11-固件库点亮LED
固件库点亮LED前提条件 建立一个固件库工程模板可以参考以下博客https://blog.csdn.net/cainaiolin/article/details/52012786硬件基础我的开发板上面一共有三个led灯 我选择点亮PB5这个灯话不多说看代码:新建一个文件名字为“bsp_led.h”BoardSupport Packet 的缩写(板级支持包) 多用在用户自己定义的文件中#ifndef __BSP_LED_H#define __BSP_LED_H//R红色的灯/*-----LED 灯的 GPIO 端口、GPIO 引脚号以及 GPIO 端口时钟----*/#define LED1_GPIO_PORT GPIOB#def
发表于 2022-01-20
11-固件库点亮LED
时钟树的讲解
系统时钟的来源:1 HSE振荡器时钟 、 2 HSI 振荡器时钟 、3 PLL振荡器时钟 。其中PLL是常用的系统时钟来源。时钟树上图中黄色的实线是系统时钟配置的流程。红色框框起来的是寄存器RCC的响应控制位。1:8M的初始时钟在经过PPLXTPRE选择的倍频因子/1得到的频率为8M /1 = 8M大小不变。2:这个时候来到PPLSRC该位控制的是选择HSI RC还是 HSE OSE作为时钟源,通过控制时钟配置寄存器(RCC_CFGR)设置PLLSRC的值选择 HSE OSE作为时钟源。频率大小还是8M3:下一步就是PLLMUL控制位选择的倍频因子为x9那么得到的频率大小为 8M x9 = 72M。4:
发表于 2022-01-20
时钟树的讲解
DMA传输实验
DMA简介DMA(Direct Memory Access)一种直接存储器存取,单片机的一个外设,它的主要功能就是用传输数据的,好处就是传输数据的时候不占用CPU。数据传输的方向有 外设到存储器,存储器到存储器,外设到外设这里的存储器包括SRAM和FLASH。DMA 的要素1.DMA请求如果外设想要通过DMA传输数据,必须先给DMA控制器发送DMA请求。DMA收到信号后控制器会给外设发送一个应答信号,当外设收到应答信号且DMA控制器收到应答信号之后,就会启动DMA传输,直到传输完毕2通道。DMA具有12个独立的可编程通道,每个通道对应不同的外设的DMA请求。虽然每个通道可以接收多个外设的请求,但是同一时间只能接收一个,不能同时接收一
发表于 2022-01-19
stm32固件库中GPIO的工作模式
固件库中GPIO的工作模式总结一下可分为三种工作模式输入模式、输出模式、复用模式1、输入模式1.1上拉输入:默认电平上拉1.2下拉输入:默认电平下拉1.3浮空输入:电平不确定完全由外部输入决定,多用于按键开关1.4模拟输入:用于ADC采集(模数转换Analog-to-digital conversion)在输入模式的时候,输出模式是被禁止的2、输出模式2.1推挽模式:双mos管轮流工作通过GPIOx_ODR可控制I/O输出高低电平2.2开漏输出:只有N-MOS管工作PMOS管保持关闭,GPIOx_ODR可控制I/O输出高电平(N-MOS导通)和高阻态(N-MOS不导通);一般只用于IIC ,SMBUS通信2.3输出速度可配置,有 2
发表于 2022-01-19
<font color='red'>stm32</font>固件库中GPIO的工作模式
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved