STM32之四:TIM定时器(1-基本定时器)

目录

[1. STM32有哪些定时器](#1. STM32有哪些定时器)

[2. 基本定时器](#2. 基本定时器)

[2.1 基本定时器主要功能](#2.1 基本定时器主要功能)

[2.2 基本定时器的框图](#2.2 基本定时器的框图)

[2.2.1 时钟输入](#2.2.1 时钟输入)

[2.2.2 至DAC](#2.2.2 至DAC)

[2.2.3 至时基单元(重点)](#2.2.3 至时基单元(重点))

[2.2.4 影子寄存器](#2.2.4 影子寄存器)

[2.2.5 基本定时器寄存器说明](#2.2.5 基本定时器寄存器说明)

[2.2.5.1 控制寄存器1(TIMx_CR1)](#2.2.5.1 控制寄存器1(TIMx_CR1))

[2.2.5.2 TIMx_DIER、TIMx_SR、TIMx_EGR](#2.2.5.2 TIMx_DIER、TIMx_SR、TIMx_EGR)

[2.3 如何在STM32中进行基本定时器定时](#2.3 如何在STM32中进行基本定时器定时)


1. STM32有哪些定时器

STM32定时器分为三种类型:高级定时器、通用定时器、基本定时器。

作为接触定时器的第一章节,本节介绍基本定时器,需要掌握如何通过定时器来产生指定时间的中断,其余影子寄存器等概念做了解。
STM32定时器分类(来源:B站江协科技---课件)

2. 基本定时器

2.1 基本定时器主要功能

  1. 提供基本定时中断功能

  2. 触发DAC同步电路

2.2 基本定时器的框图

基本定时器框图

2.2.1 时钟输入

首先从框图左上部分看,基本定时器的时钟输入只有一个,即:来自RCC的TIMxCLK,我们翻看下时钟树部分的框图STM32之二:时钟树,定时器2-7在APB1总线上,且对其频率有要求。"如果APB1预分频系数=1,则频率不变,否则频率*2",我们知道,由于APB1最大频率为36MHz,SYSCLK时钟为72MHz,所以,APB1预分频器的系数=2,因此此处频率*2,即,至TIMxCLK的时钟为72MHz。因此,内部时钟CK_INT为72MHz
基本定时器时钟来源

2.2.2 至DAC

CK_INT输入的矩形兵分两路,一路触发控制器至DAC。

基本定时器在芯片内部直接连接到DAC,并通过触发输出直接驱动DAC。

本节主要探讨定时器的基本定时中断作用,此功能不做过多介绍。

2.2.3 至时基单元(重点)

红框框到的地方为时基单元,时基单位由预分频器 (PSC)、计数器 (CNT)和自动重装载寄存器(ARR)组成。

**预分频器(PSC):**PSC是16bit的预分频器,可以对定时时钟进行1~65536之间的任何一个数进行分频。分频过后的时 。PSC+1是因为实际PSC寄存器从0开始计数,PSC=0即代表不分频(或1分频),PSC=1即代表2分频,因此此处PSC需+1。

**计数器(CNT):**CNT是一个16bit的只向上计数的计数器,最大值为65535。当计数器中的数值达到自动重装载寄存器的值时产生更新时间,并清零从头开始计数。

**自动重装载寄存器(ARR):**ARR是一个16bit的寄存器,里面装着计数器能计数的最大值,当CNT中的值和ARR中的值一致时,如果使能中断,定时器会溢出中断。

那么,如果要定义1ms中断的时钟,PSC和ARR该如何取值呢?

定时器的时钟CK_CNT=CK_INT/(PSC+1),则计数器计数一次的时间=1/CK_CNT,当计数器计数数值达到ARR时候,产生一次中断。因此产生中断的时间可以计时为=(PSC+1)/ CK_INT*ARR

则PSC可以取值为71,ARR取值为1000,则(71+1)/72000000*1000 = 1ms

PS:PSC和ARR的取值不固定,满足公式即可

至此,即可给寄存器赋值来进行定时器中断。

2.2.4 影子寄存器

在基本定时器的框图中我们看到,标绿色的框框带有阴影。且时基单元中,自动重装载寄存器和预分频器也有阴影。这部分带有阴影的寄存器表示在物理上这个寄存器对应2个寄存器,其中一个是程序员可以写入或读出的寄存器,称为预装载寄存器,另一个是程序员看不见,但在操作中真正起作用的寄存器,称为影子寄存器。

我们观察STM32F10xx参考手册可以看到,影子寄存器被描述为缓冲。至于下句"可以在运行过程中改变它的数值,新的预分频数值将在下一个更新事件时起作用",在运行中改变的其实是预装载寄存器,用户随时可以更改预装载寄存器的值,但是影子寄存器的值会在下一个更新事件时起作用。
预分频器介绍

2.2.5 基本定时器寄存器说明

虽然基本定时器只有定时和触发DAC两个功能,但是观看其寄存器,很多的标志位还是让人有些搞不清楚,在此将这些寄存器梳理下。

2.2.5.1 控制寄存器1(TIMx_CR1)
  • CEN:

位0是一个标志位CEN,CEN意为计数器CNT使能位。

即CNT=1,使能计数器。CNT=0,关闭计数器,计数器不计数。因此可见,如果要进行定时器中断功能,必须要使CNT=1.

  • UDIS:

位1为UDIS,表示禁止更新位。由软件设置和清除,以使能或禁止UEV事件的产生。

UDIS=0,UEV使能。更新事件UEV可以由下列事件产生:

-计数器CNT上溢或下溢。

-设置UG位(UG位为事件产生寄存器TIMx_EGR的0位,置1表示由软件产生更新事件)

-通过从模式控制器产生的更新(高级定时器功能,此处可以不看)

UDIS=1

不产生UEV更新事件。

  • URS和OPM

位2为URS,URS表示UEV事件的请求源。

为3为OPM,OPM表示单脉冲模式。

  • ARPE :自动重装载预装载使能。

ARPE即ARR自动重装载寄存器是否开启影子寄存器,也叫做缓冲。

ARPE=1:TIMx_ARR寄存器没有缓冲;即关闭影子寄存器,预装载寄存器的内容直接传送到影子寄存器。

APPE=0:TIMx_ARR寄存器具有缓冲;即开启影子寄存器。当ARR被重新赋值之后,必须在下一次更新事件UEV发生后才能更新影子寄存器的值。(如果想更改完立即同步到影子寄存器,可以通过软件设置UG位产生更新事件)

可以看到图151中ARPE=0时,修改了TIMx_ARR的值为0x36,则计数器在0x36时已产生动作。而在图152中,ARPE=1,在计数器还未达到0x36时,将ARR的修改为0x36,但是在计数器=0x36时却为产生更新,在计数器达到上次ARR的值0xF5产生更新事件之后,ARR的值(影子寄存器)才更新为0x36。

2.2.5.2 TIMx_DIER、TIMx_SR、TIMx_EGR

这些寄存器的标志位有些多且易混杂,在此统一列出,方便分辨。

  • UDE 跟新DMA请求使能;UDE=0,禁止更新DMA请求;UDE=1,使能更新DMA请求。
  • UIE 更新中断使能;UIE=0,禁止更新中断;UIE=1,使能更新中断。
  • UIF 更新中断标志位;UIF=1表示产生更新中断,UIF=0表示未产生更新中断。
  • UG 是否开启软件产生更新事件。UG=1表示由软件产生更新中断。

这么多标志位,除了时基单元的寄存器,实际在我们定时器定时的时候,只需要用到:

TIMx_CR1->CEN :计数器使能

TIMx_DIER->UIE:允许中断

TIMx_SR->UIF:是否产生中断;清除中断标志位

2.3 如何在STM32中进行基本定时器定时

例如若使用TIM6定时器定时1ms产生中断,则需要以下几个步骤

  1. TIM6时钟使能
  2. 初始化定时器参数(自动装载值、预分频系数、计数方式等)
  3. 设置TIM6允许中断(TIMx_DIER->UIE)
  4. 设置NVIC中断优先级
  5. 使能TIM6(TIMx_CR1->CEN )
  6. 编写中断服务函数(判断中断标志位和清楚中断标志位:TIMx_SR->UIF)

通过这几个步骤,就能实现使用基本定时器来定时产生更新中断。

相关推荐
网易独家音乐人Mike Zhou3 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
zy张起灵3 小时前
48v72v-100v转12v 10A大功率转换电源方案CSM3100SK
经验分享·嵌入式硬件·硬件工程
PegasusYu5 小时前
STM32CUBEIDE FreeRTOS操作教程(九):eventgroup事件标志组
stm32·教程·rtos·stm32cubeide·free-rtos·eventgroup·时间标志组
lantiandianzi10 小时前
基于单片机的多功能跑步机控制系统
单片机·嵌入式硬件
文弱书生65610 小时前
输出比较简介
stm32
哔哥哔特商务网10 小时前
高集成的MCU方案已成电机应用趋势?
单片机·嵌入式硬件
跟着杰哥学嵌入式10 小时前
单片机进阶硬件部分_day2_项目实践
单片机·嵌入式硬件
电子科技圈11 小时前
IAR与鸿轩科技共同推进汽车未来
科技·嵌入式硬件·mcu·汽车
东芝、铠侠总代1361006839312 小时前
浅谈TLP184小型平面光耦
单片机·嵌入式硬件·物联网·平面
lantiandianzi12 小时前
基于单片机中医药柜管理系统的设计
单片机·嵌入式硬件