正点原子STM32学习笔记——通用定时器基本原理

发布者:笑脸猫最新更新时间:2021-12-06 来源: eefocus关键字:正点原子  STM32  通用定时器 手机看文章 扫描二维码
随时随地手机看文章

以下描述适用于整个STM32FM10xxx系列。

本文依据《STM32中文参考手册_V10》

STM32 通用定时器简介


STM32 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器(CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。


STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能包括:

1)16 位向上、向下、向上/向下自动装载计数器(TIMx_CNT)。

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

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

A.输入捕获

B.输出比较

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

D.单脉冲模式输出

4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外

一个定时器)的同步电路。

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

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

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

C.输入捕获

D.输出比较

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

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

在这里插入图片描述

从图中可以看出,定时器的框图是很复杂的,所以学习的时候应该分成几个部分来学。


第一部分,时钟生成:产生一个时钟,作为时基单元的输入(图中红线)

在这里插入图片描述

图中产生时钟的方式有四种:

①由内部时钟产生,如上图的“来自RCC的TIMxCLK”。此种应用的比较多。

②由外部引脚输入,上图的TIMx_ETR,可以从STM32F103RCT6.PDF中查找对应的引脚。这种方法只适用定时器2,3,4,定时器5没有这样的功能。

③来自ITR0~ITR1(内部触发输入口),定时器的级联,是来自其它的定时器,其它定时器的TRGO(如上图)连接到ITR0 ~ ITR1,自己的TRGO也可以连接到其它定时器的ITR0 ~ ITR1。

④来自TI1F_ED、TI1FP1、TI1FP2(见上图),这三个来自于下图中的“输入滤波器和边沿检测器”,而“输入滤波器和边沿检测器”来自于TI1,TI1来自于外部通道(TIMx_CH1等)。


第二部分,输入捕获(可用于计算脉宽,参考输入捕获实验):

在这里插入图片描述

第三部分,时基单元(定时器中断实验):

在这里插入图片描述

任何一个定时器都有一个时基单元,CK_PSC信号进行一个预分频(除法运算)产生CK_CNT时钟,这个时钟才是计数器(CNT)最终的时钟。CNT在时钟的控制下可以向上或向下计数(可以通过配置相应寄存器来决定是向上还是向下计数),如CNT从0向上计数到重装载值会产生一个溢出事件,事件可以触发中断或者DMA请求。


可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器(CNT)、自动装载寄存器(ARR)和预分频器寄存器(PSC)可以由软件读写,在计数器运行时仍可以读写。

时基单元包含:

● 计数器寄存器(TIMx_CNT)

● 预分频器寄存器 (TIMx_PSC)

● 自动装载寄存器 (TIMx_ARR)

自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在每次的更新事件UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当

TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。


在图中可以看到自动重装载寄存器有一个阴影,有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄存器,称为shadow register(影子寄存器)。

关于影子寄存器,可以参考网上的一名博主的博客:

首先转载: STM32定时器的预装载寄存器与影子寄存器之间的关系


计数器由预分频器的时钟输出CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使能位(CEN)时,CK_CNT才有效。

注:真正的计数器使能信号CNT_EN是在CEN的一个时钟周期后被设置。


预分频器描述 :

预分频器可以将计数器的时钟频率按1到65536之间的任意值分频。它是基于一个(在TIMx_PSC寄存器中的)16位寄存器控制的16位计数器。这个控制寄存器带有缓冲器,它能够在工作时被改变。新的预分频器参数在下一次更新事件到来时被采用。

在这里插入图片描述

第四部分,输出比较(PWM输出):

在这里插入图片描述

由于定时器的内容比较多,这里简单的介绍下基本原理。

关键字:正点原子  STM32  通用定时器 引用地址:正点原子STM32学习笔记——通用定时器基本原理

上一篇:正点原子STM32学习笔记——MPU6050介绍
下一篇:STM32学习笔记——GPIO工作原理(八种工作模式)

推荐阅读最新更新时间:2024-11-12 01:21

STM32——修改MCU步骤
在我们编写某个工程时,更换MCU,STM32工程修改几个地方即可使用,无须重新新建工程。 这里以STM32大容量更改为中容量为例: 1,将工程中 startup_stm32f10x_hd.s 更换为 startup_stm32f10x_md.s; 2,点击魔术棒(Options for target) A,点击Device 在选型串口选择更换的类型; B,点击C/C++,在Define:将STM32F10X_HD修改为STM32F10X_MD; C,若使用J-LINK下载,点击Debug - Settings - Flash Download,将Programming Algorithm下的stm32 flash更改为中容量的。
[单片机]
STM32】7—通用定时器 & 时钟树学习
0 实验预期效果 让LED闪烁(每秒钟内:亮0.5s,再暗0.5s)。 1 相关原理图 2 定时器TIM2与时钟树 2.1 TIM2 简介与特性 关于通用定时器TIM2,查STM32F407中文手册392页可知: ① TIM2 到 TIM5 简介: 通用定时器包含一个16 位或 32 位自动重载计数器,该计数器由可编程预分频器驱动。 它们可用于多种用途,包括测量输入信号的脉冲宽度(输入捕获)或生成输出波形(输出比较和 PWM)。 使用定时器预分频器和 RCC 时钟控制器预分频器,可将脉冲宽度和波形周期从几微秒调制到几毫秒。 这些定时器彼此完全独立,不共享任何资源
[单片机]
【<font color='red'>STM32</font>】7—<font color='red'>通用</font><font color='red'>定时器</font> & 时钟树学习
STM32串口在首次发送字符的时候,首字符丢失解决办法
网上关于发送字符的代码大多如下: USART_SendData(USART1, (uint8_t)ch); while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); 其实咋一看是说的通的,但是在仔细看手册的时候发现 TC 和 TXE 标志位在复位的时候被置1 ,这样第一次while循环就是没有用的。这样导致了首次第一个字符还没有被输出,就被后面的字符覆盖掉,造成实际看到的丢失现象。解决办法就很简单:在前面加上一句 USART1- SR; 具体代码如下: USART1- SR; USART_SendData(USART1, (uint8_t)ch); while( USAR
[单片机]
STM32家族介绍、区别及命名规则
一、STM32的八大产品及区别 每一种型号的向上延伸,内核部分都是相同的,区别在于外设部分,也就是在于外设功能的增加及丰富。比如F103和F102相比,外设就更丰富,多3相电机定时器、CAN2.0B和SDIO的2个IIS。 二、STM32的Cortex-M产品(所有型号互相兼容) 不同的STM32产品的型号的引脚及闪存容量是不一样的,详情可参考上面的表格,在自己选型时注意结合自己的实际需要来选择合适的芯片,外设太少会不满足,而外设过多优惠导致浪费,选型时可根据下面的命名规则来进行参考或者查看选型手册。 三、STM32命名规则
[单片机]
<font color='red'>STM32</font>家族介绍、区别及命名规则
stm32的Core_cm3.c文件
上一章提到了对于stm32的堆栈的研究。实际上在查询资料时,看到有大神提到可以获取栈的指针。因为一般要验证都是存在栈溢出的问题,把他贴出来供大家研究。(我没有实际验证) void HardFault_Handler(void) { uint32_t r_sp ; r_sp = __get_PSP(); //获取SP的值 PERROR(ERROR,Memory Access Error!); Panic(r_sp); while (1); } 获取​进程堆栈指针并打印出来!__get_PSP()函数为Core_Core_cm3.c中的函数。他这个函数解析一下供大家查看:
[单片机]
STM32学习之路(四)——Sys Tick定时器
SysTick定时器被捆绑在NVIC中,用于产生SysTick异常(异常号:15)。在以前,操作系统还有所有使用了时基的系统,都必须一个硬件定时器来产生需要的 滴答 中断,作为整个系统的时基。滴答中断对操作系统尤其重要。例如,操作系统可以为多个任务许以不同数目的时间片,确保没有一个任务能霸占系统;或者把每个定时器周期的某个时间范围赐予特定的任务等,还有操作系统提供的各种定时功能,都与这个滴答定时器有关。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统 心跳 的节律。 Cortex-M3处理器内部包含了一个简单的定时器。因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的
[单片机]
<font color='red'>STM32</font>学习之路(四)——Sys Tick<font color='red'>定时器</font>
stm32的五个时钟源参数设置经验
一、在STM32中,有五个时钟源,为HSI、HSE、LSI、LSE、PLL。 ①HSI是高速内部时钟,RC振荡器,频率为8MHz。 ②HSE是高速外部时钟,可接石英/陶瓷谐振器,或者接外部时钟源,频率范围为4MHz~16MHz。 ③LSI是低速内部时钟,RC振荡器,频率为40kHz。 ④LSE是低速外部时钟,接频率为32.768kHz的石英晶体。 ⑤PLL为锁相环倍频输出,其时钟输入源可选择为HSI/2、HSE或者HSE/2。倍频可选择为2~16倍,但是其输出频率最大不得超过72MHz。 二、在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法:如果使用内部RC振荡器而不使用外部晶振,请按照下面方法处理:
[单片机]
<font color='red'>stm32</font>的五个时钟源参数设置经验
STM32驱动AT24CXX系列芯片
AT24Cxx系列EEPROM是由美国Mcrochip公司出品,1-512K位的支持I2C总线数据传送协议的串行CMOS E2PROM,可用电擦除,可编程自定时写周期(包括自动擦除时间不超过10ms,典型时间为5ms)的。串行E2PROM一般具有两种写入方式,一种是字节写入方式,还有另一种页写入方式。允许在一个写周期内同时对1个字节到一页的若干字节的编程写入,1页的大小取决于芯片内页寄存器的大小。其中,AT24C01具有8字节数据的页面写能力,AT24C02/04/08/16具有16字节数据的页面写能力,AT24C32/64具有32字节数据的页面写能力 AT24CXX的驱动是基于IIC的,在基本的IIC上加入了一些通讯协议,具体如
[单片机]
<font color='red'>STM32</font>驱动AT24CXX系列芯片
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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