【话说定时器系列】之四:STM32定时器更新事件及案例分享

发布时间:2023-03-07  

我们知道,STM32定时器中的四个带影子特性的寄存器组,每组寄存器分别由 影子寄存器【即实际控制寄存器】和预装寄存器组成。其中,影子寄存器是真正起作用的控制寄存器,用户访问不到它。而预装寄存器是用户访问的为实际影子寄存器准备数据或指令的寄存器。它们分别是:


TIMx_PSC 分频寄存器 TIMx_ARR 自动重装载寄存器


TIMx_CCR 捕捉寄存器 TIMx_RCR 重复计数寄存器[高级定时器有】


其中,ARR、CCR寄存器带预装载使能控制位,即它们的预装功能可以软件开启或关闭。


TIMx_ARR 带预装载使能控制位 ARPE@TIMx_CR1


TIMx_CCR 带预装载使能控制位 OCxPE@TIMx_CCMR


当相应预装使能位置1时,即开启预装功能时,此时影子寄存器的数据更新必须且只能通过更新事件实现从预装寄存器到影子寄存器的数据拷贝。


当相应预装使能位置0时,即关闭预装功能时,用户修改预装寄存器的数据后会立即被拷贝进影子寄存器【实际寄存器】。也就是说,此时我们用户操作预装寄存器就相当于访问实际影子寄存器。


那另外的PSC、RCR寄存器是不带预装使能控制位的,也就是说,二者的影子寄存器的预装功能始终开启,所以对于PSC/RCR影子寄存器的数据更新就只能通过更新事件唯一途径实现从预装寄存器到影子寄存器的数据拷贝更新。







那么有哪些操作可以产生更新事件呢?或者有哪些更新事件源呢?

这里把更新操作跟更新事件区别开来,以便于概念上的理解。


更新操作是一种动作,是更新事件的源头,即事件源;


更新事件是基于更新操作所导致的后续影响或结果。


可能的更新操作【事件源】有3类:


1、核心计数器的溢出【上溢或下溢】

2、软件复位操作【对UG@TIMX_EGR置位】

3、工作在复位模式下的定时器收到触发信号【即复位触发信号】

【特别提醒,对于高级定时器必须发生RCR+1次溢出动作后才可以产生更新事件。对于通用或基本定时器,每溢出一次都可以产生更新事件。】


那么更新操作何时可以升级为更新事件呢?


这里涉及到一个控制寄存器的控制位,UDIS@TIMx_CR1.


当该控制位UDIS@TIMx_CR1为0时,更新操作升级为更新事件,更新事件会产生如下影响或效果:


1、实现从预装寄存器的数据到影子寄存器的内容拷贝,即完成影子寄存器的内容更新;

2、实现计数器【预分频计数器、核心计数器、重复计数器】的重新初始化;

3、置位状态寄存器的UIF@TIMx_SR,并可以触发定时器更新中断或触发DMA请求;

当该控制位UDIS@TIMx_CR1为1时,更新操作不能升级为更新事件,其相应的结果或影响:

仅限于计数器的重新初始化,不做影子寄存器的更新;

无更新标志的置位,不触发中断或DMA请求


那么发生更新操作时计数器的重新初始化具体是指什么呢?


1、分频计数器重装为0,然后重新开始计数;

2、重复计数器重装为RCR寄存器里的值,然后重新递减计数;

3、核心计数器的初始化由计数模式来定,如果是向上计数或中心对齐计数模式,CNT归0;如果是向下计数器模式,CNT重装为ARR,然后重新向下计数;


发生更新事件时,影子寄存器的更新与计数器的重装有先后顺序问题吗?


有!影子寄存器【ARR/CCR….】的更新操作在前,计数器的重装操作在后!

因为这样可以保障计数器的重装值使用更新过的数据。该个细节要特别注意!


最后,不妨做个基于更新事件的案例分享:


问题描述:TIMER初始化阶段,经常有人反馈,不管定时器周期的长短,只要一使能更新中断,就立即进中断服务程序?令人不解,往往给开发带来些困扰,原因可能是什么?如何解决?


我们知道,定时器应用的初始化时,往往需要对有关时基寄存器进行些基本的数据赋值。


比方对ARR/PSC/RCR这些寄存器赋予初始值。结合前面的介绍,这些寄存器都是些带预装功能的寄存器,我们用户操作的寄存器都是预装寄存器,还不是实际起作用的影子寄存器。对于ARR寄存器倒还好,因为芯片复位后默认状态下,ARR寄存器的预装功能时关闭的【CCR寄存器的预装载功能默认条件下也是关闭的】,那么我们用户给ARR赋值就相当于给其实际影子寄存器赋值了。


但PSC/RCR寄存器是不带预装控制位的,它们两个的影子寄存器的更新必须借助于更新事件。所以,在定时器的时基参数的初始代码里,为了让用户写进预转寄存器的数据生效,就用到了上面提到过的软件复位操作,即对UG@TIMx_EGR进行置位而产生更新事件,从而完成影子寄存器的数据更新。


在STM32标准库里的TIM_TimeBaseInit( )函数里都有这句代码:

TIMx->EGR = TIM_PSCReloadMode_Immediate;

在Cube库里的HAL_TIM_Base_Init( )函数里的 函数有这句代码:

TIMx->EGR = TIM_EGR_UG;


结合前面的介绍,这两行代码使用到了前面提到的软件更新操作,触发了更新事件,它不仅仅实现了影子寄存器的数据更新,同时呢,还置位了状态寄存器的更新中断标志位UIF@TIMx_SR。那么,如果在这之后,我们使能定时器更新中断的话,进入更新中断服务程序的话就再自然不过了。为了规避这个问题,我们在时基参数初始化完成之后、使能定时器更新中断之前,可以先做更新中断标志的清除操作。


基于这个案例,我们可以对定时器的预装特性以及不同影子寄存器的特性差异有进一步的了解。总的来讲,STM32定时器的寄存器预装载特性也是其一特色,定时器的更新事件也是非常重要的事件,更新事件本身及相关中断或DMA功能也是STM32开发应用中常用的工具,切实掌握这些将十分有助于STM32的产品开发。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>