【STM32】影子寄存器简单理解

STM32定时器的影子寄存器功能及其工作原理

影子寄存器是个实际存在的寄存器,主要起一个缓存作用。

比如STM32参考手册里叙述可以在定时器计数的时候操作自动装载寄存器ARR,那么问题来了,在用户写了ARR时,此时定时器当前计数值与哪个定时值比较,会不会由于写的值小于当前计数值立即溢出? 这就是影子寄存器的作用,写了ARR后,当前的计数值是和影子寄存器里的值比较的,当产生了更新事件或者手动情况下,自动装载值立即被送往影子寄存器。

数据手册里的描述:
当发生一个更新事件时,所有的寄存器都被更新,硬件同时(依据URS位)设置更新标志位(TIMx_SR寄存器中的UIF位)。
● 预分频器的缓冲区被置入预装载寄存器的值(TIMx_PSC寄存器的内容)。
● 自动装载影子寄存器被重新置入预装载寄存器的值(TIMx_ARR)。

### STM32 更新影子寄存器方法 在 STM32 的 RTC 模块中,更新影子寄存器的过程涉及特定的操作流程。为了确保时间计数的准确性以及防止数据冲突,STM32 使用了一种称为“预装载”的机制来处理影子寄存器的更新。 当需要修改 RTC 配置时,所有的更改首先被写入到影子寄存器而不是直接作用于实际寄存器。这意味着任何对 RTC 寄存器的新设置都会先存储在一个临时位置即影子寄存器内[^1]。只有当发生指定类型的更新事件(例如秒中断或外部校准事件),这些预先加载好的值才会一次性转移到真正的硬件寄存器中并生效[^4]。 对于某些版本的 STM32 微控制器而言,还可以通过控制 ARPE 位的状态决定是否启用自动重载功能。当此位设为高电平时 (ARPE=1),表示启用了异步预装载模式;反之,则采用同步方式立即应用变更[^3]。 下面是一个简单的 C 语言代码片段用于展示如何向 STM32 的 RTC 写入新的时间和日期: ```c // 设置RTC的时间和日期 void Set_RTC_Time_Date(RTC_TimeTypeDef* sTime, RTC_DateTypeDef* sDate){ /* Enable write protection for RTC registers */ __HAL_RCC_BACKUPRESET_FORCE(); __HAL_RCC_BACKUPRESET_RELEASE(); HAL_PWR_EnableBkUpAccess(); //使能备份区域访问 while (__HAL_RTC_IS_FLAG_SET(&hrtc, RTC_FLAG_INITS) != RESET); //等待初始化标志清除 __HAL_RTC_ENTERINITMODE(&hrtc); //进入初始化模式 // 将新设置写入影子寄存器 hrtc.Instance->TR = sTime->RTC_Hours | (sTime->RTC_Minutes << 8) | (sTime->RTC_Seconds << 16); hrtc.Instance->DR = ((uint32_t)sDate->RTC_Year & 0xFF) | (((uint32_t)(sDate->RTC_Month)) << 8) | (((uint32_t)(sDate->RTC_Date)) << 16); __HAL_RTC_EXITINITMODE(&hrtc); //退出初始化模式 } ``` 这段代码展示了如何正确地将新的时间和日期信息写入到影子寄存器中,并最终让其生效。需要注意的是,在执行上述操作之前应该确保已经完成了必要的准备工作,比如允许对后备域进行访问等前置条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值