STM32-定时器系统原理

发布者:梦幻之光最新更新时间:2022-04-21 来源: eefocus关键字:STM32  计时功能 手机看文章 扫描二维码
随时随地手机看文章

STM32的定时器概述

STM32F1有TIME1和TIME8 等高级定时器,也有TIME2~TIME5等通用定时器,还有TIME6和TIME7等基本定时器。


关于高级定时器、通用定时器、基本定时器的区别:


基本定时器:具有最基本的计时功能,与通用和高级定时器的16位自动重装载计数器不同,他的计数器是一个累加计数器!基本定时器独有一个其他定时器没有的DAC的同步电路!


通用定时器:能满足大部分使用需求的定时器。


高级定时器:高级的骚操作比较多的定时器,但是一般不常用到,用到的时候可以再根据参考手册深入研究。

我们一般常用到的就是通用定时器。


通用定时器

通用定时器简介

主要功能

16位向上、向下、向上/向下自动装载计数器

16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意数值

4个独立通道:

输入捕获

输出比较

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

单脉冲模式输出

使用外部信号控制定时器和定时器互连的同步电路

如下事件发生时产生中断/DMA:

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

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

输入捕获

输出比较

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

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

加色处理的功能都是非常重要的常用功能!


模块框图

通用定时器框图如下所示,红色框是计数器部分,当仅使用计数器模式的时候,只涉及这部分。在定时器的基础上,还有下方的捕获/比较通道,输入通道可用于输入捕获(蓝色部分)和输出通道可用于输出PWM(绿色部分),与上面主要功能的颜色对应。本文只涉及到红色部分,也就是定时器的计数单元!输入捕获、PWM和DMA在后文写。

时钟来源

通用定时器的时钟来源有四个,具体选择哪个可以通过 TIMx_SMCR 寄存器的相关位来设置。


内部时钟(CK_INT)

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

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

内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器

不过,一般我们使用内部时钟。


在时钟树可以看到,定时器2~7的内部时钟源是APB1。库函数版本默认使用SystemInit函数初始化系统该时钟的情况下:


SYSCLK=72M

AHB=72M

APB1=36M


也就是说APB1的分频系数为2,所以定时器2~7(包括通用定时器)时钟内部时钟频率为2*36M=72M。

另外需要注意的是定时器1和定时器8的时钟源是APB2!


当使用外部时钟的时候,其框图如下

通用定时器寄存器

通用定时器的寄存器有,包括


控制寄存器 1(TIMx_CR1)

控制寄存器 2(TIMx_CR2)

从模式控制寄存器(TIMx_SMCR)

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

状态寄存器(TIMx_SR)

事件产生寄存器(TIMx_EGR)

捕获/比较模式寄存器 1(TIMx_CCMR1)

捕获/比较模式寄存器 2(TIMx_CCMR2)

捕获/比较使能寄存器(TIMx_CCER)

计数器(TIMx_CNT)

预分频器(TIMx_PSC)

自动重装载寄存器(TIMx_ARR)

捕获/比较寄存器 1~4(TIMx_CCR1~4)

DMA控制寄存器(TIMx_DCR)

连续模式的DMA地址(TIMx_DMAR)

加黑的几个寄存器是使用定时器基本功能的必须了解的几个寄存器!这里也只叙述这几个寄存器。


控制寄存器 1(TIMx_CR1)

DIR:计数方向

0:计数器向上计数

1:计数器向下计数

当计数器配置为中央对齐模式或编码器模式时,该位为只读。


CEN:使能计数器

0:禁止计数器;

1:使能计数器。


CMS[1:0]:选择中央对齐模式

00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。

01:中央对齐模式1。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器

中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。

10:中央对齐模式2。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器

中CCxS=00)的输出比较中断标志位,只在计数器向上计数时被设置。

11:中央对齐模式3。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器

中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。

当在计数器开启时(CEN=1),不允许从边沿对齐模式转换到中央对齐模式。


其他的位,请查看《STM32中/英文参考手册》


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

UIE:允许更新中断

0:禁止更新中断

1:允许更新中断,计数寄存器中的数据更新时触发中断请求。


CCxIE:允许捕获/比较x中断 (Capture/Compare 1 interrupt enable) 

0:禁止捕获/比较x中断;

1:允许捕获/比较x中断。

这个寄存器用于使能捕获中断(后面会写)


时基单元寄存器

时基单元包含:


预分频器寄存器 (TIMx_PSC)

自动装载寄存器 (TIMx_ARR)

计数器寄存器 (TIMx_CNT) 

预分频器寄存器(TIMx_PSC)


PSC[15:0]:预分频器的值


该寄存器存放的是预分频器的值。预分频器对定时器的时钟源进行分频,然后提供给计数器。前文已经提到,通用定时器的时钟源有四个,可以通过TIMx_SMCR 寄存器的的相关为进行设置。


为什么要进行分频?


答:因为一般时钟源太快了。以系统时钟源为例,72M的频率,如果不分频的话,那16位定时器的计时周期就65536/72M秒,约等于0.91ms,时间太短了。


自动重装载寄存器(TIMx_ARR)


ARR[15:0]: 自动重装载的值


ARR包含了将要传送至实际的自动重装载寄存器的数值。


计数寄存器(TIMx_CNT)


CNT[15:0]:计数器的值


计数器模式

向上计数模式

计数器从0计数到自动加载值(TIMx_ARR计数器的内容),然后重新从0开始计数并且产生一个计数器溢出事件。


向下计数模式

计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。


定时周期的计算

定时周期与时基单元密切相关,首先确定定时器时钟源的频率Tclk(使用内部时钟源,一般是72M),通过设定分频器的值PSC可以确定最大计时周期,然后通过设定自动重装载寄存器的值ARR,可以确定具体的溢出时间!计算公式如下:


Tout(溢出时间)= (ARR+1)(PSC+1)/Tclk


比如,要定时500ms,Tclk为72M,令PSC=7199,ARR=4999,即可。


库函数代码配置定时器

配置步骤

使能定时器时钟

要明确定时器使用的时钟源!如果使用内部时钟,通用定时器和基本定时器是在APB1下!应该调用

void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

高级定时器是在APB2下,调用

void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);

初始化定时器

void TIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct)

开启定时器更新中断,配置NVIC中断控制器

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);//开启定时器更新中断

void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);//中断优先级配置

使能定时器

void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);

编写中断服务函数

根据使用的定时器,开启相应的中断函数,注意在中断函数中判断和清除中断标志位!

状态查看函数

FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);

ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);

void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);

代码范例

timer.c


 void Tim3_Init(u16 arr,u16 psc)

 {

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstructure;

NVIC_InitTypeDef NVIC_Initstructure;

 

/*************************定时器时钟源使能*********************************/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

 

/*************************定时器基本配置*********************************/

TIM_TimeBaseInitstructure.TIM_Prescaler = psc;//预分频系数

TIM_TimeBaseInitstructure.TIM_Period = arr;//自动装在值

TIM_TimeBaseInitstructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数

TIM_TimeBaseInitstructure.TIM_ClockDivision = TIM_CKD_DIV1;//不知道是什么

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstructure);

 

/*************************定时器中断配置使能*********************************/

TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);

 

/*************************中断号、优先级配置*********************************/

NVIC_Initstructure.NVIC_IRQChannel = TIM3_IRQn;

NVIC_Initstructure.NVIC_IRQChannelCmd = ENABLE; 

NVIC_Initstructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_Initstructure.NVIC_IRQChannelSubPriority = 1;

NVIC_Init(&NVIC_Initstructure);

 

/*************************使能TIM3计数器*********************************/

TIM_Cmd(TIM3,ENABLE);

 }

 

 

 void TIM3_IRQHandler(void)

 {

if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET)

{

LED0 = !LED0;

TIM_ClearITPendingBit(TIM3,TIM_IT_Update);

}

 }


main.c


 int main(void)

 {

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

LED_Init(); 

Tim3_Init(TIM3_CRR,TIM3_PSC);

while(1)

{

//其他操作

}

 }

————————————————

版权声明:本文为CSDN博主「BUG从入门到精通」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/wei348144881/article/details/109076390


关键字:STM32  计时功能 引用地址:STM32-定时器系统原理

上一篇:STM32-一文搞懂通用定时器捕获/比较通道
下一篇:STM32-一个例子搞懂EXTI外部中断/事件系统

推荐阅读最新更新时间:2024-11-09 19:57

stm32 外部中断库函数实现全程分析
前题:   闭门造车,两周了,经过各种的思考和求问,反复阅读了 M3权威指南 和 stm32不完全手册 的相关章节,以及开发板厂商的实验例程,对stm32这块中断终有所悟,是以记之。   至于中断的什么优先级,什么优先级分组,使能之类的原理,就不再赘述。这里主要是记载以下如何使用中断,以及中断配置函数的实现过程,其中并叙述我曾经的疑惑和感悟。   我的开发板里的中断例程是用按键控制一个灯亮和灭的两个状态。   这个例程的实现过程如下描述: 第一步,将一个I/O口配置成中断输入模式。      这里需要注意的是,GPIO本身是没有中断功能神马的。如果硬要使他产生中断输入方式,就得将相应的端口映射到相应的外部事件上去。而
[单片机]
<font color='red'>stm32</font> 外部中断库函数实现全程分析
STM32基础8--通用定时器(PWM控制LED)
从STM32基础7--通用定时器,STM32通用定时器可以产生PWM波形,从而控制LED亮度。下面我们更加详细的了解一下,PWM对LED的控制。 PWM控制LED硬件电路 在下面的原理图中,可以看到LED0与LED1连接到STMF407的PF9与PF10引脚上。在电路中,当PF9,PF10分别为低电平的时候,LED0与LED分别导通,也就是这个电路中,PWM周期的低电平周期,LED会被导通。 PWM周期与LED闪烁 在STM32F407中,当我们使用PWM1模式时,进行如下的设置。 当我们使用逻辑分析仪(LA)抓取,可以得到如波形,也就是说Pulse设置的为低电平的时间长度。当我们下载程序进开发板时,发现LED
[单片机]
<font color='red'>STM32</font>基础8--通用<font color='red'>定时器</font>(PWM控制LED)
基于STM32设计的酒精检测仪
一、需求分析 随着社会的发展和生活水平的提高,人们对于行车安全、家庭安全的要求越来越高,而酒驾等问题也日渐突出,为此,开发一款基于STM32的酒精检测仪,通过检测酒精浓度,实时显示结果并进行报警,可以有效避免因酒后驾车带来的安全隐患。 二、设计思路 2.1 硬件设计 1、主控芯片采用STM32F103RCT6,该芯片具有较高的性能和稳定性,能够满足本设计的各项需求。 2、酒精传感器采用MQ-3模块,该模块具有高精度、响应速度快等特点,能够准确检测酒精浓度。 3、OLED显示屏,用于实时显示酒精浓度等信息。 4、蜂鸣器,用于进行声音报警。 5、按键,用于设定报警阈值。 2.2 软件设计 1、IO口配置:将相应
[单片机]
一篇很简单,有必要了解的文章 - STM32复位来源(寄存器版)
最近项目遇到了一个问题:一个子系统,具有IAP升级的功能,Bootloader位于0x08000000,也就是说系统在运行过程允许复位。但是,该子系统需要在上电的过程中处理某项任务(而且只需要上电的那一次)。 问题来了:我们如何判断系统是第一次上电复位? 解决的办法有很多种,但是最简单的办法就是获取系统复位来源,详情请看文章。 其实,这篇文章的内容也能回答之前一位网友的问题,不知你会不会阅读本文。 Ⅰ RCC复位和时钟控制 RCC:Reset and Clock Control 相信大家都知道RCC是什么,主要就是讲述复位和时钟的章节。先来讲述一下复位种类。 STM32的复位大概分为三类:系统复
[单片机]
一篇很简单,有必要了解的文章 - <font color='red'>STM32</font>复位来源(寄存器版)
如何通过STM32定时器输出PWM?
本文将介绍通过STM32的定时器输出PWM,如果对定时器不太熟悉的同学可以看下之前的文章《STM32基础定时器详解》,关于定时器的基础功能不再详解。 01 PWM介绍 PWM定义:脉冲宽度调制(PulseWidthModulation,PWM)简称脉宽调制。通俗讲,PWM是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电
[单片机]
如何通过<font color='red'>STM32</font>的<font color='red'>定时器</font>输出PWM?
STM32 CRC ST库3.0.0
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 使能或者失能AHB外设时钟 Enables or disables the AHB peripheral clock. 例如: 使能CRC硬件校验 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_CRC, ENABLE); ============================================================================ uint32_t CRC_CalcBlockCRC(uint32_t p
[单片机]
STM32学习历程之IO口输出方式
推挽输出(PUSH-Pull Output):在功率放大器电路中大量采用推挽放大器电路,这种电路中用两只三极管构成一级放大器电路,两只三极管分别放大输入信号的正半周和负半周,即用一只三极管放大信号的正半周,用另一只三极管放大信号的负半周,两只三极管输出的半周信号在放大器负载上合并后得到一个完整周期的输出信号。推挽放大器电路中,一只三极管工作在导通、放大状态时,另一只三极管处于截止状态 ,当输入信号变化到另一个半周后,原先导通、放大的三极管进入截止,而原先截止的三极管进入导通、放大状态,两只三极管在不断地交替导通放大和截止变化,所以称为推挽放大器。 这种电路只要用于低功耗情况下能输出较大功率的交流信号,通常用于低频放大电路设计中,可
[单片机]
STM32学习笔记之DS18B20
我买得STM32开发小板儿上的外设实在少,连个数码管都没有,显示都得通过串口在超级终端上完成。我又特别懒,就挑了个比较方便的器件DS18B20来玩儿。 DS18B20应该说是学习嵌入式开发的入门级的器件,也是各种开发板的标准配置。因为它所需附加器件少(最多需要一个几K的电阻),而且操作简单方便(主要是IO口的控制时序),非常适合初学者练手。虽然之前学过8位机,但是却没有用8位机控制过DS18B20,心里一直感觉有些遗憾。现在趁着学32位机的机会好好研究研究它。 第一个要说的时GPIO口的配置问题。读写DS18B20要求GPIO是双向的,51单片机没有问题,但是STM32的GPIO口貌似是单向的,不过即使设置为输出口,也可以通过读取
[单片机]

推荐帖子

深入解析电池充电状态 (SOC) 和运行状态 (SOH) 估计技术
基于锂离子(Li-ion)电池单元的电池组广泛用于各种应用,例如:混合动力汽车(HEV)、电动汽车(EV)、可供日后使用的再生能源储存以及用于各种目的(电网稳定性、调峰和再生能源时移等)的电网能源储存。在这些应用中,测量电池单元的充电状态(SOC)非常重要。SOC定义为可用容量(单位为Ah),以额定容量的百分比表示。SOC参数可看作一个热力学量,利用它可评估电池的潜在电能。估计电池的运行状态(SOH)也很重要;SOH以新电池为比较标准,衡量电池储存和输送电能的能力。ADI公司的功
qwqwqw2088 模拟与混合信号
为什么液晶显示亮度不够?
采用430f449的液晶驱动模块,段式液晶,但液晶显示发虚,亮度不够,为什么?为什么液晶显示亮度不够?仔细看看液晶的供电电压是否合乎标准。有个可以调对比度的电阻,你改小点我用的液晶标准驱动电压应该是3V,但板子上给出的是2.8V,只相差0.2V将R13、R23、R33选为330k看看。实在不行,就将VCC直接接到R33端。多谢我在看449的时钟时,在FLL_CTL0中,有一个位OscCap是选择振荡器电容,选择的标准是什麽?不胜感激有关449的时钟是不是数据更
huangruihua 微控制器 MCU
配备多个传感器的智能商店如何让购物变得轻而易举
某一个周五的傍晚你决定做墨西哥鱼肉卷,所以你在下班回家的路上,匆匆走进一家当地的超市。只需要几分钟就可以找到香菜,或者,更准确地说,定位到应该放香菜的空货架。然后在只有一名工作人员的收银处排了10分钟的队后,你最终到家了,但发现你忘买了玉米薄馅饼。那么你就只能在周五的晚上吃吃剩菜砂锅了。数据几乎以光速移动,但杂货店却不能。随着高速互联网的普及,信息传输速度越来越快,但买卖商品所必需的实物交易的效率有所落后。这种情况即将有所改变。我们公司的一名系统工程师GustavoMar
alan000345 TI技术论坛
超低功耗蓝牙控制的高性价比可调光智能照明方案
物联网正高速增长,在其细分领域智能家居和楼宇自动化应用中,智能照明发挥着举足轻重的作用,实现节能省电,降低用电成本,并方便人们的生活。要设计出具竞争优势的智能照明方案,需从LED驱动、通信、能效等多方面考量。  物联网正高速增长,在其细分领域智能家居和楼宇自动化应用中,智能照明发挥着举足轻重的作用,实现节能省电,降低用电成本,并方便人们的生活。要设计出具竞争优势的智能照明方案,需从LED驱动、通信、能效等多方面考量。安森美半导体提供基于蓝牙低功耗的智能照明方案,集成可扩展功率的线性L
灞波儿奔 无线连接
外部尖峰干扰的频率问题
问题是这样的,电磁阀由一个开关控制通断,串联到24V开关电源供电,这是电磁阀的一路,简单的开关控制电磁阀打开和关闭,另外一路也是同一个插排供电,接反激式开关电源将220V降到12V给控制板供电,通电后按下电磁阀开关,用示波器检测控制板这边电源纹波,看看电磁阀和开关的工作对控制板供电的影响,结果是按下开关和断开开关都会使得另外一路电源有尖峰出现,尖峰的频率大小不等,有可能几赫兹,大部分几百兆赫兹,尖峰峰峰值几百毫伏不等,然后我在控制板前级加了三级EMI滤波电路,EMI后面还大小电容并联,磁珠都加
负电荷 开关电源学习小组
防反电路设计
防反电路设计做电路的时候有没有因为电源接反而烧毁电路板的经历?所以板子的防反电路设计有那么点重要,所以就聊聊防反电路的设计,但我首先推荐使用连接器去做防反,连接器国内的厂家用的顺手的科发.他们比较好玩的是弹簧,但是防反就有正反就可以了.如下图1所示.顺带看下图2他们弹簧针我超爱,因为不用焊接线.图1:科发插拔接线端图2:科发弹簧针注意,科发弹簧针的是没有防反的,就是给大家推荐下,好用,(没有拿到广告费).在demo板上注意到有的电源上并联了一个二极管,那个二
xutong 电源技术
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved