我们知道,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的产品开发。
上一篇:【STM32学习笔记】SPI不够用? USART来帮忙
下一篇:【STM32安全技术导论之二】加解密技术
推荐阅读最新更新时间:2024-11-10 00:29
推荐帖子
- Modbus转EtherCAT:优化半导体生产设备的网络架构
- 将Modbus转换为EtherCAT旨在提高实时性能(低延迟、高带宽)、简化网络架构(灵活拓扑、易于扩展)、增强系统集成性(无缝集成Modbus设备)、提升数据处理能力(复杂操作、增强诊断)及适应未来需求(技术进步、灵活性和可扩展性)。Modbus是什么?Modbus是由Modicon(现为施耐德电气公司的一个品牌)在1979年发明的,是全球第一个真正用于工业现场的总线协议。目的是为了简化不同设备之间的数据交换。Modbus协议支持多种通信方式,包括串行通信和以太网通信,使其
- Bliiot—Peter 工控电子
- LOTO任意波形发生器SIG82模拟输出继电器吸合断开的信号波形用于算法调试
- LOTO任意波形发生器SIG82模拟输出继电器吸合断开的信号波形用于算法调试继电器吸合的电流变化过程是如图这样的波形,0到2的时间大约为17毫秒,2到3的时间大约38毫秒。批量继电器产品吸合是否满足产品标准的时候,不能靠人操作和判断,效率太低了也容易出错。通常要设计软件自动用算法计算0和2之间的时间差。做电流波形采集和自动计算时间差算法不能每次都到现场调试工装和开机测试。如果有个可以调整的足够真实的信号来模拟继电器吸合和断开过程的波
- LOTO2018 测试/测量
- 泰克的 CMD80 中文使用手册
- 由于工作需要希望那位大哥、大姐有泰克的CMD80中文使用手册的可不可以给我发来让我学习一下泰克的CMD80中文使用手册
- guan123 测试/测量
- 想用MSP430,求助开发板,仿真器,仿真软件等信息
- 想用MSP430,求助开发板,仿真器,仿真软件等信息。大家用的都是神马的,哪里买的。有具体型号最好,我要最全功能的。想用MSP430,求助开发板,仿真器,仿真软件等信息淘宝上蛮多的,个人感觉LT-1B还不错啦,仿真器都大同小易,仿真软件IARforMSP430网上也很多。
- seven561 微控制器 MCU
- C6000DSP的堆(heap)和栈(stack)
- stack-又称系统栈(systemstack),用于:保存函数调用后的返回地址;给局部变量分配存储空间;传递函数参数;保存临时结果;heap-编译器提供的运行时支持库的一些函数(如malloc/calloc/realloc),允许运行时为变量动态分配存储器。这些存储器就放置在.system段的全局池(globalpool)或堆(heap)中。这个动态存储池的大小仅仅受限与系统中实际的存储容量。这2个选项都可以在project-buildoptions的连接器
- fish001 DSP 与 ARM 处理器
- 导热界面材料对降低接触热阻的影响分析
- 随着电子设备功率密度的增加,系统的热管理变得越来越重要。导热界面材料(TIMs)在降低接触热阻、提高热量传递效率方面发挥着关键作用。本文分析了导热界面材料的工作原理及其对接触热阻的影响,并通过实验数据验证了其有效性。一、引言在电子设备中,接触热阻(TCR)是影响散热性能的重要因素。接触热阻的存在会导致热量传递路径受阻,使得热量无法有效从发热元件传递到散热部件,进而造成局部过热和系统性能下降。为了改善这一现象,导热界面材料(TIMs)被广泛应用于电子设备中,以降低接触热阻,提高热量传
- aoqi PCB设计