stm32定时器的相关寄存器105.pdf

上传人:小*** 文档编号:83377504 上传时间:2023-03-30 格式:PDF 页数:11 大小:581.79KB
返回 下载 相关 举报
stm32定时器的相关寄存器105.pdf_第1页
第1页 / 共11页
stm32定时器的相关寄存器105.pdf_第2页
第2页 / 共11页
点击查看更多>>
资源描述

《stm32定时器的相关寄存器105.pdf》由会员分享,可在线阅读,更多相关《stm32定时器的相关寄存器105.pdf(11页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、定时器 在 STM32F10 xxx系列的 32 位 MCU 上,定时器资源十分丰富,包括高级控制定时器,通用定时器和基本定时器。此外,还有能够实现定时功能的系统滴答定时器,实时时钟以及看门狗。关于这些定时器的介绍,占据了 STM32F10 xxx参考手册 1/5的篇幅,可见其功能的强大。在低容量和中容量的 STM32F103xx产品,以及互联型产品 STM32F105xx和STM32F107xx中,只有一个高级控制定时器 TIM1。而在高容量和超大容量的STM32F103xx产品中,有两个高级控制定时器 TIM1和 TIM8。在所有 STM32F10 xxx系列产品中,都有通用定时器 TIM

2、2TIM5,除非另有说明。除此之外,在超大容量产品中,还有通用定时器 TIM9TIM14。在高容量和超大容量的 STM32F101xx和 STM32F103xx产品,以及互联型产品 STM32F105xx和 STM32F107xx中,有两个基本定时器 TIM6和 TIM7。其中,高级控制定时器的功能最为强大,可以实现所有其他定时器的所有功能。TrailBreaker开发板使用的是高容量的 STM32F103ZE,因此有两个高级控制定时器 TIM1和 TIM8。下面我们就着重介绍这两个高级控制定时器。TIM1和 TIM8简介 高级控制定时器(TIM1和 TIM8)由一个 16 位的自动装载计数器

3、组成,它由一个可编程的预分频器驱动。它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补 PWM 等)。使用定时器预分频器和 RCC时钟控制预分频器,可以实现脉冲宽度和波形周期从几个微秒到几个毫秒的调节。关于实验中用到的 LED部分原理图和 GPIO跑马灯实验所用到的相同,在此不再多做介绍。TIM1和 TIM8定时器的功能包括:16 位向上、向下、向上/下自动装载计数器 16 位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1 65535之间的任意数值 多达 4 个独立通道:输入捕获 输出比较 PWM 生成(边缘或中间对齐

4、模式)单脉冲模式输出 死区时间可编程的互补输出 使用外部信号控制定时器和定时器互联的同步电路 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 如下事件发生时产生中断/DMA:更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)输入捕获 输出比较 刹车信号输入 支持针对定位的增量(正交)编码器和霍尔传感器电路 触发输入作为外部时钟或者按周期的电流管理 高级定时器框图和时钟简介 如框图中的红框所示,红框中的部分,也是时基单元(Time-base

5、 unit),对时基单元进行设置,就可以完成基础的定时器的使用设置。计数器时钟可由下列时钟源提供:内部时钟(CK_INT)外部时钟模式 1:外部输入引脚 外部时钟模式 2:外部触发输入 ETR 内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器。如可以配置一个定时器 Timer1而作为另一个定时器 Timer2的预分频器。详见数据手册的通用定时器部分。内部时钟源(CK_INT):如果禁止了从模式控制器(SMS=000),则 CEN、DIR(TIMx_CR1寄存器)和 UG位(TIMx_EGR寄存器)是事实上的控制位,并且只能被软件修改(UG位仍被自动清除)。只要 CEN位被写成

6、1,预分频器的时钟就由内部时钟 CK_INT提供。下图显示控制电路和向上计数器在一般模式下,不带预分频器时的操作。外部时钟源模式 1 当 TIMx_SMCR寄存器的 SMS=111时,此模式被选中。计数器可以在选定输入端的每个上升沿或下降沿计数。下图为 TI2外部时钟连接例子 例如,要配置向上计数器在 T12输入端的上升沿计数,使用下列步骤:1.配置 TIMx_CCMR1寄存器 CC2S=01 2.配置通道 2 检测 TI2输入的上升沿 3.配置 TIMx_CCMR1寄存器的 IC2F3:0,选择输入滤波器带宽(如果不需要滤波器,保持 IC2F=0000)4.配置 TIMx_CCER寄存器的

7、CC2P=0,选定上升沿极性 5.配置 TIMx_SMCR寄存器的 SMS=111,选择定时器外部时钟模式 1 6.配置 TIMx_SMCR寄存器中的 TS=110,选定 TI2作为触发输入源 7.设置 TIMx_CR1寄存器的 CEN=1,使能计数器 注:捕获预分频器不用作触发,所以不需要对它进行配置 当上升沿出现在 TI2,计数器计数一次,且 TIF标志被设置。在 TI2的上升沿和计数器实际时钟之间的延时,取决于在 TI2输入端的重新同步电路。下图为外部时钟模式 1 下的控制电路 外部时钟源模式 2 选定此模式的方法为:令 TIMx_SMCR寄存器中的 ECE=1。计数器能够在外部触发 E

8、TR的每一个上升沿或下降沿计数。下图是外部触发输入的框图 设置从模式控制寄存器的 ETP位选择选择是用 ETR还是 ETR的反相来作为触发操作 例如,要配置在 ETR下每 2 个上升沿计数一次的向上计数器,使用下列步骤:1.本例中不需要滤波器,置 TIMx_SMCR寄存器中的 ETF3:0=0000 2.设置预分频器,置 TIMx_SMCR寄存器中的 ETPS1:0=01 3.选择 ETR的上升沿检测,置 TIMx_SMCR寄存器中的 ETP=0 4.开启外部时钟模式 2,写 TIMx_SMCR寄存器中的 ECE=1 5.启动计数器,写 TIMx_CR1寄存器中的 CEN=1 计数器在每 2

9、个 ETR上升沿计数一次。在 ETR的上升沿和计数器实际时钟之间的延时取决于在 ETRP信号端的重新同步电路。下图为外部时钟模式 2 下的控制电路 如图,该图为 STM32的时钟树,结合高级控制定时器框图,我们可以看出,高级定时器的时钟不是直接来自 APB2,而是来自于输入为 APB2的一个倍频器。当APB2的预分频系数为 1 时,这个倍频器不起作用,定时器的时钟频率等于 APB2的频率;当 APB2的预分频系数为其它数值(即预分频系数为 2、4、8 或 16)时,这个分频器起作用,定时器的时钟频率等于 APB2的频率相应倍数。假定 AHB=36MHz,因为 APB2允许的最大频率为 72MH

10、z,所以 APB2的预分频系数可以取任意数值;当预分频系数=1 时,APB2=72MHz,TIM1和 TIM8的时钟频率=72MHz(分频器不起作用);当预分频系数=2 时,APB1=36MHz,在倍频器的作用下,TIM1和 TIM8的时钟频率=72MHz。有人会问,既然需要 TIM1和 TIM8的时钟频率为 72MHz,为什么不直接取 APB2的预分频系数=1?答案是:APB2不但要为 TIM1和 TIM8提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM1和 TIM8仍能得到较高的时钟频率。再举个例子:当 AHB=72MHz时,APB2因为其他

11、设备需要,时钟为 36MHZ,因为这个倍频器,TIM1和 TIM8仍然能够得到 72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。高级定时器寄存器简介 可编程高级控制定时器的主要部分是一个 16 位计数器和与其相关的自动装载寄存器。这个计数器可以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。计数器、自动装载寄存器和预分频器寄存器可以由软件读写,即使计数器还在运行读写仍然有效。时基单元,也就是决定了定时器的基本功能的模块包含:1.计数器寄存器(Counter register,简写为 TIMx_CNT)2.预分频器寄存

12、器(Prescaler register,简写为 TIMx_PSC)3.自动装载寄存器(Auto-reload register,简写为 TIMx_ARR)4.重复次数寄存器(Repetition counter register,简写为 TIMx_RCR)1.影子寄存器 这张图是高级定时器框图的一部分,细心的人可以发现预分频器寄存器、自动重载寄存器和捕捉/比较寄存器下面有一个阴影,其他的寄存器有些也有阴影。这表示在物理上这个寄存器对应 2 个寄存器:一个是我们可以可以写入或读出的寄存器,称为预装载寄存器,另一个是我们看不见的、无法真正对其读写操作的,但在使用中真正起作用的寄存器,称为影子寄存

13、器.数据手册介绍预装载寄存器的内容可以随时传送到影子寄存器,即两者是连通的(permanently),或者在每一次更新事件(UEV)时才把预装载寄存器的内容传送到影子寄存器。原文如下:The auto-reload register is preloaded.Writing to or reading from the auto-reload register accesses the preload register.The content of the preload register are transferred into the shadow register permanently

14、 or at each update event(UEV),depending on the auto-reload preload enable bit(ARPE)in TIMx_CR1 register.The update event is sent when the counter reaches the overflow(or underflow when downcounting)and if the UDIS bit equals 0 in the TIMx_CR1 register.It can also be generated by software.The generat

15、ion of the update event is described in detailed for each configuration.在图中的,表示对应寄存器的影子寄存器可以在发生更新事件时,被更新为它的预装载寄存器的内容;而图中的部分,表示对应的自动重载寄存器可以产生一个更新事件(U)或更新事件中断(UI)。设计预装载寄存器和影子寄存器的好处是,所有真正需要起作用的寄存器(影子寄存器)可以在同一个时间(发生更新事件时)被更新为所对应的预装载寄存器的内容,这样可以保证多个通道的操作能够准确地同步。如果没有影子寄存器,软件更新预装载寄存器时,则同时更新了真正操作的寄存器,因为软件不可能

16、在一个相同的时刻同时更新多个寄存器,结果造成多个通道的时序不能同步,如果再加上例如中断等其它因素,多个通道的时序关系有可能会混乱,造成是不可预知的结果。2.预分频寄存器 预分频器可以将计数器的时钟频率按 1 到 65536之间的任意值分频。它是基于一个在 TIMx_PSC寄存器中的 16 位寄存器控制的 16 位计数器。因为这个控制寄存器带有缓冲器,它能够在运行时被改变。新的预分频器的参数在下一次更新事件到来时被采用。下面给出了在预分频器运行时,更改计数器参数的例子 当预分频器的参数从 1 变到 2 时,计数器的时序图如下:当预分频器的参数从 1 变到 4 时,计数器的时序图如下:预分频寄存器

17、各位的描述如下:位 15:0 PSC15:0:预分频值 计数器的时钟频率(CK_CNT)等于 fCK_PSC/(PSC15:0+1)。PSC的值保存在预分频寄存器的预装载寄存器中,在每次更新事件时加载至影子寄存器.3.计数器寄存器 高级定时器计数模式:在向上计数模式中,计数器从 0 计数到自动加载值(TIMx_ARR计数器的内容),然后重新从 0 开始计数并且产生一个计数器溢出事件。如果使用了重复计数器功能,在向上计数达到设置的重复计数次数(TIMx_RCR)时,产生更新事件(UEV);否则每次计数器溢出时才产生更新事件。在事件产生寄存器寄存器中(通过软件方式或者使用从模式控制器)设置 UG

18、位也同样可以产生一个更新事件。设置 TIMx_CR1寄存器中的 UDIS位,可以禁止更新事件;这样可以避免在向预装载寄存器中写入新值时更新影子寄存器。在 UDIS位被清0之前,将不产生更新事件。但是在应该产生更新事件时,计数器仍会被清0,同时预分频器的计数也被请 0(但预分频器的数值不变)。此外,如果设置了 TIMx_CR1寄存器中的 URS位(选择更新请求),设置 UG 位将产生一个更新事件 UEV,但硬件不设置 UIF标志(即不产生中断或 DMA请求)。这是为了避免在捕获模式下清除计数器时,同时产生更新和捕获中断。当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据 URS位)设置更

19、新标志位(TIMx_SR寄存器中的 UIF位)。重复计数器被重新加载为 TIMx_RCR寄存器的内容。自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。下面给出一些例子,当 TIMx_ARR=0 x36时计数器在不同时钟频率下的动作。内部时钟分频因子为 1 时的计数器时序图如下:内部时钟分频因子为 2 时的计数器时序图如下:内部时钟分频因子为 4 时的计数器时序图如下:内部时钟分频因子为 N 时的计数器时序图如下:当 ARPE=0时的更新事件(TIMx_ARR没有预装入)时的计数器时序图如下:当 ARPE=

20、1时的更新事件(TIMx_ARR预装入)时的计数器时序图如下:在向下模式中,计数器从自动装入的值(TIMx_ARR计数器的值)开始向下计数到 0,然后从自动装入的值重新开始并且产生一个计数器向下溢出事件。如果使用了重复计数器,当向下计数重复了重复计数寄存器(TIMx_RCR)中设定的次数后,将产生更新事件(UEV),否则每次计数器下溢时才产生更新事件。在 TIMx_EGR寄存器中(通过软件方式或者使用从模式控制器)设置 UG 位,也同样可以产生一个更新事件。设置 TIMx_CR1寄存器的 UDIS位可以禁止 UEV事件。这样可以避免向预装载寄存器中写入新值时更新影子寄存器。因此 UDIS位被清

21、为 0 之前不会产生更新事件。然而,计数器仍会从当前自动加载值重新开始计数,并且预分频器的计数器重新从 0 开始(但预分频系数不变)。此外,如果设置了 TIMx_CR1寄存器中的 URS位(选择更新请求),设置 UG 位将产生一个更新事件 UEV但不设置 UIF标志(因此不产生中断和 DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。当发生更新事件时,所有的寄存器都被更新,并且(根据 URS位的设置)更新标志位(TIMx_SR寄存器中的 UIF位)也被设置。重复计数器被重置为 TIMx_RCR寄存器中的内容 预分频器的缓存器被加载为预装载的值(TIMx_PSC寄存

22、器的值)。当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。注:自动装载在计数器重载入之前被更新,因此下一个周期将是预期的值。下面是一些当 TIMx_ARR=0 x36时,计数器在不同时钟频率下的动作。内部时钟分频因子为 1 时的计数器时序图如下:内部时钟分频因子为 2 时的计数器时序图如下:内部时钟分频因子为 4 时的计数器时序图如下:内部时钟分频因子为 N 时的计数器时序图如下:当没有使用重复计数器时的更新事件时的计数器时序图:中央对齐模式(up/down counting)在中央对齐模式,计数器从 0 开始计数到自动加载的值(TIMx_ARR寄存器)s211,产生一

23、个计数器溢出事件,然后向下计数到 1 并且产生一个计数器下溢事件;然后再从 0 开始重新计数。在此模式下,不能写入 TIMx_CR1中的 DIR方向位。它由硬件更新并指示当前的计数方向。可以在每次计数上溢和每次计数下溢时产生更新事件;也可以通过(软件或者使用从模式控制器)设置 TIMx_EGR寄存器中的 UG 位产生更新事件。然后,计数器重新从 0 开始计数,预分频器也重新从 0 开始计数。设置 TIMx_CR1寄存器中的 UDIS位可以禁止 UEV事件。这样可以避免在向预装载寄存器中写入新值时更新影子寄存器。因此 UDIS位被清为 0 之前不会产生更新事件。然而,计数器仍会根据当前自动重加载

24、的值,继续向上或向下计数。此外,如果设置了 TIMx_CR1寄存器中的 URS位(选择更新请求),设置 UG 位将产生一个更新事件 UEV但不设置 UIF标志(因此不产生中断和 DMA请求),这是为了避免在发生捕获事件并清除计数器时,同时产生更新和捕获中断。当发生更新事件时,所有的寄存器都被更新,并且(根据 URS位的设置)更新标志位(TIMx_SR寄存器中的 UIF位)也被设置。重复计数器被重置为 TIMx_RCR寄存器中的内容 预分频器的缓存器被加载为预装载(TIMx_PSC寄存器)的值。当前的自动加载寄存器被更新为预装载值(TIMx_ARR寄存器中的内容)。注:如果因为计数器溢出而产生更

25、新,自动重装载将在计数器重载入之前被更新,因此下一个周期将是预期的值(计数器被装载为新的值)。下面是一些计数器在不同时钟频率下的操作的例子:内部时钟分频因子为 1,TIMx_ARR=0 x6时的计数器时序图:内部时钟分频因子为 2 时的计数器时序图:内部时钟分频因子为 4,TIMx_ARR=0 x36时的计数器时序图:注:在此无论是中心对齐模式 2 或 3 都是在溢出时与 UIF标志一起使用 内部时钟分频因子为 N,计数器时序图如下:ARPE=1时的更新事件(计数器下溢),计数器时序图如下:计数器寄存器各位的描述如下:位 15:0 ARR15:0:自动重装载的值(Prescaler value

26、)ARR包含了将要装载入实际的自动重装载寄存器的值。详细参考数据手册13.3.1节:有关 ARR的更新和动作。当自动重装载的值为空时,计数器不工作。4.重复计数器 前面解释了计数器上溢/下溢时更新事件(UEV)是如何产生的,然而事实上它只能在重复计数达到 0 的时候产生。这个特性对产生 PWM信号非常有用。这意味着在每 N 次计数上溢或下溢时,数据从预装载寄存器传输到影子寄存器(TIMx_ARR自动重载入寄存器,TIMx_PSC预装载寄存器,还有在比较模式下的捕获/比较寄存器 TIMx_CCRx),N 是 TIMx_RCR重复计数寄存器中的值。重复计数器在下述任一条件成立时递减:向上计数模式下

27、每次计数器溢出时,向下计数模式下每次计数器下溢时,中央对齐模式下每次上溢和每次下溢时。虽然这样限制了 PWM的最大循环周期为 128,但它能够在每个 PWM周期 2 次更新占空比。在中央对齐模式下,因为波形是对称的,如果每个 PWM周期中仅刷新一次比较寄存器,则最大的分辨率为 2xTck。重复计数器是自动加载的,重复速率是由 TIMx_RCR寄存器的值定义。当更新事件由软件产生(通过设置 TIMx_EGR 中的 UG 位)或者通过硬件的从模式控制器产生,则无论重复计数器的值是多少,立即发生更新事件,并且 TIMx_RCR寄存器中的内容被重载入到重复计数器。下图为不同模式下更新速率的例子,及 T

28、IMx_RCR的寄存器设置 重复计数器各位的描述如下:位 15:8 保留位,始终读为 0。位 7:0 REP7:0:重复计数器的值(Repetition counter value)开启了预装载功能后,这些位允许用户设置比较寄存器的更新速率(即周期性地从预装载寄存器传输到当前寄存器);如果允许产生更新中断,则会同时影响产生更新中断的速率。每次向下计数器 REP_CNT达到 0,会产生一个更新事件并且计数器 REP_CNT重新从 REP值开始计数。由于 REP_CNT只有在周期更新事件 U_RC发生时才重载 REP值,因此对 TIMx_RCR寄存器写入的新值只在下次周期更新事件发生时才起作用。这

29、意味着在 PWM模式中,(REP+1)对应着:在边沿对齐模式下,PWM周期的数目;在中心对称模式下,PWM半周期的数目;5.控制寄存器 1(TIMx_CR1)控制寄存器 1 各位的描述如下:位 15:10 保留,始终读为 0。位 9:8 CKD1:0:时钟分频因子(Clock division)这 2 位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用的采样时钟之间的分频比例。00:tDTS=tCK_INT 01:tDTS=2 x tCK_INT 10:tDTS=4 x tCK_INT 11:保留,不要使用这个配置 位 7 ARPE:自动重装载预装

30、载允许位(Auto-reload preload enable)0:TIMx_ARR寄存器没有缓冲;1:TIMx_ARR寄存器被装入缓冲器。位 6:5 CMS1:0:选择中央对齐模式(Center-aligned mode selection)00:边沿对齐模式。计数器依据方向位(DIR)向上或向下计数。01:中央对齐模式 1。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中 CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。10:中央对齐模式 2。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中 CCxS=00)的输出比较中

31、断标志位,只在计数器向上计数时被设置。11:中央对齐模式 3。计数器交替地向上和向下计数。配置为输出的通道(TIMx_CCMRx寄存器中 CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。在计数器开启时(CEN=1),不允许从边沿对齐模式转换到中央对齐模式。位 4 DIR:方向(Direction)0:计数器向上计数;1:计数器向下计数。当计数器配置为中央对齐模式或编码器模式时,该位为只读。位 3 OPM:单脉冲模式(One pulse mode)0:在发生更新事件时,计数器不停止;1:在发生下一次更新事件(清除 CEN位)时,计数器停止。位 2 URS:更新请求源(Up

32、date request source)(更新源的选择)软件通过该位选择 UEV事件的源 0:如果使能了更新中断或 DMA请求,则下述任一事件都可以产生更新中断或 DMA请求:计数器溢出/下溢 设置 UG 位 从模式控制器产生的更新 1:如果使能了更新中断或 DMA请求,则只有计数器溢出/下溢才产生更新中断或 DMA请求 位 1 UDIS:禁止更新(Update disable),软件通过该位允许/禁止 UEV事件的产生 0:允许 UEV。更新(UEV)事件由下述任一事件产生:计数器溢出/下溢 设置 UG 位 从模式控制器产生的更新 具有缓存的寄存器被装入它们的预装载值。(更新影子寄存器)1:

33、禁止 UEV。不产生更新事件,影子寄存器(ARR、PSC、CCRx)保持它们的值。如果设置了 UG 位或从模式控制器发出了一个硬件复位,则计数器和预分频器被重新初始化。位 0 CEN:使能计数器(Counter enable)0:禁止计数器;1:使能计数器。在软件设置了 CEN位后,外部时钟、门控模式和编码器模式才能工作。触发模式可以自动地通过硬件设置 CEN位。6.事件产生寄存器 位 15:8 保留,始终读为 0。位 7 BG:产生刹车事件(Break generation)该位由软件置1,用于产生一个刹车事件,由硬件自动清0。0:无动作;1:产生一个刹车事件。此时 MOE=0、BIF=1,

34、若开启对应的中断和 DMA,则产生相应的中断和 DMA。位 6 TG:产生触发事件(Trigger generation)该位由软件置1,用于产生一个触发事件,由硬件自动清0。0:无动作;1:TIMx_SR寄存器的 TIF=1,若开启对应的中断和 DMA,则产生相应的中断和DMA。位 5 COMG:捕获/比较事件,产生控制更新(Capture/Compare control update generation)该位由软件置1,由硬件自动清0。0:无动作;1:当 CCPC=1,允许更新 CCxE、CCxNE、OCxM位。该位只对拥有互补输出的通道有效。位 4 CC4G:产生捕获/比较 4 事件(

35、Capture/Compare 4 generation)参考 CC1G描述。位 3 CC3G:产生捕获/比较 3 事件(Capture/Compare 3 generation)参考 CC1G描述。位 2 CC2G:产生捕获/比较 2 事件(Capture/Compare 2 generation)参考 CC1G描述。位 1 CC1G:产生捕获/比较 1 事件(Capture/Compare 1 generation)该位由软件置1,用于产生一个捕获/比较事件,由硬件自动清0。0:无动作;1:在通道 CC1 上产生一个捕获/比较事件:若通道 CC1 配置为输出:设置 CC1IF=1,若开启对

36、应的中断和 DMA,则产生相应的中断和 DMA。若通道 CC1 配置为输入:当前的计数器值被捕获至 TIMx_CCR1寄存器;设置CC1IF=1,若开启对应的中断和 DMA,则产生相应的中断和 DMA。若 CC1IF已经为 1,则设置 CC1OF=1。位 0 UG:产生更新事件(Update generation)该位由软件置1,由硬件自动清0。0:无动作;1:重新初始化计数器,并产生一个更新事件。注意预分频器的计数器也被清0(但是预分频系数不变)。若在中心对称模式下或 DIR=0(向上计数)则计数器被清0;若 DIR=1(向下计数)则计数器取 TIMx_ARR的值。关于刹车事件,触发事件,捕

37、获比较事件的描述,详见数据手册 13 章 程序分析:固件库函数分析:STM32的高级定时器功能十分强大,但相应的功能强大就意味着结构复杂。复杂的结构带来的是复杂的库函数。高级定时器 TIM1和 TIM8一共有着 80 多个库函数,如果对其一一介绍,不但浪费时间,浪费精力,还有可能变成类似固件库使用手册一样的东西。在学习的时候,我们对事物的认知总是螺旋上升的,尤其是我们做嵌入式开发,当遇到一个新的系统或者硬件,指望着看一遍数据手册,就完全掌握其使用方法是不可能的。所以,我们先建立起一个最简单,最基础的实验,方便对新事物有着一个感性的直观的认知。有了清晰的认知,明白了基本原理后,后面的学习速度就会

38、大大加快,也能的心应手了.看数据手册和固件库函数的时候,不要图快,不要浮躁,指望着看看相关的资料,复制下固件库例程的代码把程序搞定,这不叫“写代码”,这叫“移植”。基础打的不牢靠,对于细节问题理解的不清晰,是不可能真正的学好 ARM的.如果想继续学习的话,你会发现,你“节省”的时间,在越来越深入后,就会给你带来双倍的“节省时间”长的麻烦.-作者的心得在stm32f10 x_tim.h中可以看到如下定义:typedef struct uint16_t TIM_Prescaler;uint16_t TIM_CounterMode;uint16_t TIM_Period;uint16_t TIM_C

39、lockDivision;uint8_tTIM_RepetitionCounter;TIM_TimeBaseInitTypeDef;库函数 TIM_TimeBaseInit()的原型如下 void TIM_TimeBaseInit(TIM_TypeDef*TIMx,TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)uint16_t tmpcr1=0;assert_param(IS_TIM_ALL_PERIPH(TIMx);assert_param(IS_TIM_COUNTER_MODE(TIM_TimeBaseInitStruct-TIM_Count

40、erMode);assert_param(IS_TIM_CKD_DIV(TIM_TimeBaseInitStruct-TIM_ClockDivision);tmpcr1=TIMx-CR1;if(TIMx=TIM1)|(TIMx=TIM8)|(TIMx=TIM2)|(TIMx=TIM3)|(TIMx=TIM4)|(TIMx=TIM5)tmpcr1&=(uint16_t)(uint16_t)(TIM_CR1_DIR|TIM_CR1_CMS);tmpcr1|=(uint32_t)TIM_TimeBaseInitStruct-TIM_CounterMode;if(TIMx!=TIM6)&(TIMx!=

41、TIM7)tmpcr1&=(uint16_t)(uint16_t)TIM_CR1_CKD);tmpcr1|=(uint32_t)TIM_TimeBaseInitStruct-TIM_ClockDivision;TIMx-CR1=tmpcr1;TIMx-ARR=TIM_TimeBaseInitStruct-TIM_Period;TIMx-PSC=TIM_TimeBaseInitStruct-TIM_Prescaler;if(TIMx=TIM1)|(TIMx=TIM8)|(TIMx=TIM15)|(TIMx=TIM16)|(TIMx=TIM17)TIMx-RCR=TIM_TimeBaseInitS

42、truct-TIM_RepetitionCounter;TIMx-EGR=TIM_PSCReloadMode_Immediate;正如函数名,和结构体名所描述的,这个函数的作用为,初始化 TIM1的时基部分.结合着数据手册和上面的高级定时器框图和时钟简介可知,我们使用高级定时器 TIM1中断时对 TIM1的时基配置顺序如下所示。在此例中,我们可以这样定义他.TIM_TimeBaseStructure.TIM_Prescaler=(18000-1);/时钟预分频TIM_TimeBaseStructure.TIM_Period=(4000-1);/定时器初始值TIM_TimeBaseStructu

43、re.TIM_CounterMode=TIM_CounterMode_Up;/向上计数模式 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;/时钟分割 TIM_CKD_DIV1 为 0 x0 TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);/初始化定时器的值 上面的初始化流程图已经说明,定时器中断频率=时钟频率/(时钟预分频+1)/(计数器装载值+1)所以我们要达到 1S 间隔的跑马灯,定时器的中断频率为 1Hz,所以这里只要时钟分频的值与定时器的计数器的装载值之积为 72MHZ且不越界即可 关于计数模式,在 stm32f10 x.h中有如下的定义#define TIM_CounterMode_Up(uint16_t)0 x0000)#define TIM_CounterMode_Down(uint16_t)0 x0010)#define TIM_CounterMode_CenterAligned1(uint16_t)0 x0020)#define TIM_CounterMode_CenterAligned2(uint16_t)0 x0040)#define TIM_CounterMode_CenterAligned3(uint16_t)0 x0060)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 技术资料 > 技术方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com