基于STM32的自动重装载auto-reload preload以及影子寄存器
目录
写在前面
在使用cubeMX开发stm32,会经常用到定时器,并通过定时器产生中断计数来定期地执行某些任务。在配置时会遇到auto-reload preload 。这让熟悉51开发时解触到的定时器产生中断后自动重装载计数值让其产生下一次中断名字有点相似但实际并不是一回事。于是便有了这篇文章。
箭头所指的寄存器有影子即代表有它们有影子寄存器。
正文
在51开发时,自动重装载定时器的值是为了保证下一次计数值溢出时重新装载计数值产生定时器中断。
而本文所说的影子寄存器是在预装载时真正地起了缓冲作用,
auto-reload preload 使能 :在更新事件(计数器溢出,比较输出等事件)产生后再更新影子寄存器
从下面的时序图中看出保护了原来的计数周期不受影响,在更新事件(UEV)产生后再开始新的计数。
auto-reload preload 不使能 ,arr与影子寄存器直连,立即更新影子寄存器的值。
更新事件允许位
设置TIMx_CR1寄存器中的UDIS位,可以禁止更新事件;这样可以避免在向预装载寄存器中写入新值时更新影子寄存器。在UDIS位被清’0’之前,将不产生更新事件。但是在应该产生更新事件时,计数器仍会被清’0’,同时预分频器的计数也被请0(但预分频器的数值不变)。此外,如果设置了TIMx_CR1寄存器中的URS位(选择更新请求),设置UG位将产生一个更新事件UEV,但硬件不设置UIF标志(即不产生中断或DMA请求)。这是为了避免在捕获模式下清计数器时,同时产生更新和捕获中断。
在捕获/比较通道中
捕获/比较模块由一个预装载寄存器和一个影子寄存器组成。读写过程仅操作预装载寄存器。
在捕获模式下,捕获发生在影子寄存器上,然后再复制到预装载寄存器中。
在比较模式下,预装载寄存器的内容被复制到影子寄存器中,然后影子寄存器的内容和计数器进行比较
在强制输出模式中
TIMx_CCRx影子寄存器和计数器之间的比较仍然在进行。
在PWM模式中
仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。
总结
它的应用场景是在定时器运行并允许更新事件产生,若用户需要去改变(软件直接对寄存器的值进行读写)TIMX_PSC(预分配器),TIMX_ARR自动装载寄存器等寄存器时,是否立刻对正在运行的计数周期产生影响。
自动重装载寄存器是预加载的,每次读写自动重装载寄存器时,实际上是通过读写预加载寄存
器实现。根据TIMx_CR1寄存器中的自动重装载预加载使能位(ARPE),写入预加载寄存器的内
容能够立即或在每次更新事件时,传送到它的影子寄存器。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?