当前位置: 首页 > news >正文

STM32F0实战:基于HAL库开发【2.8】

13.2.2 读取日历寄存器

1.当RTC_CR寄存器的BYPSHAD位清0时日历寄存器的影子寄存器使能

为确保在安全同步机制下正常读取RTC日历寄存器(RTC_SSR、RTC_TR和RTC_DR),APB1时钟频率(fPCLK)应至少为RTC时钟频率(fRTCCLK)的7倍以上。当APB1时钟频率低于7倍的RTC时钟频率时,软件必须两次读取日历时间和日期寄存器,并比较二者的值是否相同,如果相同说明返回值是正确的,否则需再次读取。

日历寄存器的内容被复制到RTC_SSR、RTC_TR和RTC_DR影子寄存器中时,RTC_ISR寄存器的RSF位被置位,此复制操作由硬件每两个RTCCLK周期执行一次。为确保从3个寄存器中读取的时间值为同一个瞬时值,在读取RTC_SSR或RTC_TR时,会将高阶日历影子寄存器中的值锁存,直至RTC_DR中的值被读取。另外,为避免软件在时间间隔少于2个RTCCLK周期的情况下多次访问日历,每次读取日历寄存器后RSF位应由软件清零,软件必须等待RSF位被置位后才能再次读取RTC_SSR、RTC_TR和RTC_DR寄存器。

当微控制器处于关机或待机模式时,RTC_SSR、RTC_TR和RTC_DR寄存器的值将不再被刷新,因此在从低功耗模式唤醒后,RSF位应由软件清零,并且等待RSF位被再次置位后才能读上述3个日历寄存器。在系统复位后,复位操作将导致影子寄存器复位至其默认值,软件必须等待RSF位硬件置位后才能读RTC_SSR、RTC_TR和RTC_DR寄存器。同样,当日历初始化或RTC同步发生后,也需要在RSF置位后才能读取日历寄存器。

2.当RTC_CR寄存器的BYPSHAD位置1时无需考虑影子寄存器

读日历寄存器,将直接从日历计数器获取时间值,此时读操作无需等待RSF位是否被置位。此功能通常应用在刚退出停止或待机模式时,因为影子寄存器在低功耗模式下不会自动更新。如果两次读取日历寄存器之间出现RTCCLK边沿,由于该边沿有可能触发日历计数器计数,所以此时对不同日历寄存器的读取结果可能反映的不是同一个时间值,软件必须读取所有的日历寄存器两次,并比较两次读取的结果,或者通过比较两组最低有效日历寄存器的结果,以检验数据是否正确且有一定关联。

3.复位对RTC的影响

任何可用的系统复位源都将导致日历影子寄存器RTC_SSR、RTC_TR、TC_DR以及RTC状态寄存器RTC_ISR复位至默认值,但RTC当前日历寄存器、RTC控制寄存器(RTC_CR)、预分频器寄存器(RTC_PRER)、RTC校准寄存器(RTC_CALR)、RTC移位寄存器(RTC_SHIFTR)、RTC时间戳寄存器(RTC_TSSSR、RTC_TSTR和RTC_TSDR)、RTC侵入和复用功能配置寄存器(RTC_TAFCR)、RTC备份寄存器(RTC_BKPxR)和Alarm A寄存器(RTC_ALRMASSR/RTC_ALRMAR)的复位与系统复位无任何关联,只与上电复位有关。

发生上电复位后,RTC停止运行,所有RTC寄存器复位至默认值。除上电复位外,任何系统复位时RTC都将维持运行状态。

13.2.3 RTC同步

RTC可以与一个高精度远程时钟同步以精确地调整时间。RTC在读取亚秒字段(RTC_SSR或RTC_TSSSR)后,可计算出远程时钟和RTC时钟在亚秒级的精确偏差值,通过RTC_SHIFTR寄存器用时钟移位的方式瞬间修正这个偏差。具体的方法是通过软件写RTC_SHIFTR寄存器实现。当软件将数值写入该寄存器的SUBFS[14:0]位后,写入值将会增加到同步预分频计数器SS[15:0]位中,由于同步预分频计数器是递减计数的,数值的增加会使时钟信号延迟,延迟时间由以下公式得出:

时钟延迟(秒)=SUBFS/(PREDIV_S+1)

为了获得最高的调整精度,可以将异步预分频器的分频比设为1,这时CK_APRE时钟频率为32768Hz,为了保证同步预分频器的输出为1Hz(CK_SPRE=1Hz),同步预分频器此时的分频比需要设置为32768(SS[15:0]=7FFF),这将允许以30.52μs的最大分辨率(1/32768Hz)精确地调整时间,时间的最大调整幅度为1s。这里需要说明的是,同步预分频器输入频率的增加,将会导致相应的动态功耗的增加。

当ADD1S位的功能与SUBFS位共同使用时,将会使时钟提前若干分之一秒。ADD1S置位后时钟将超前1s,而写入SUBFS位的数值将会使时钟延迟若干分之一秒,最终的结果可由以下公式得出:

时钟超前(秒)=(1-(SUBFS/(PREDIV_S+1)))

使用时钟移位操作需要注意以下几点:

·写SUBFS将导致RSF被清除,在读取日历寄存器时,软件需等待RSF位置位以确保影子寄存器中相应值已与移位时间同步。

·在启动移位操作前,必须软件检查SS[15]位是否为“0”,以确保移位后不会发生数据溢出。

·写入RTC_SHIFTR寄存器将启动移位操作,并将硬件设置SHPF标志位,表示一个移位操作正在进行,当移位操作完成后该位被硬件清除。

·同步功能与参考时钟检测功能不兼容,因此当“REFCKON=1”时,固件不能写RTC_SHIFTR。

13.2.4 RTC参考时钟检测

RTC模块允许使用一个50Hz或60Hz的外部高精度时钟(参考时钟)来衡量自身LSE的精确度。当RTC_CR寄存器的REFCKON置位时,参考时钟检测使能。RTC会将内部每个1Hz的时钟边沿与最近的参考时钟(RTC_REFIN)边沿进行比较,多数情况下两个时钟沿会恰好对齐,当发现二者之间没有正确对齐时,说明LSE频率不够精确,RTC会将1Hz时钟移动一个最小位,使下一个边沿能正确对齐,这种操作可以确保日历时钟的精度和参考时钟一样准确。

参考时钟对于RTC模块本身来说并不是必需的,当参考时钟停止时,日历将使用自身的LSE时钟维持运行。另外,在启动RTC_REFIN检测后,PREDIV_A和PREDIV_S必须设置为默认值。

13.2.5 RTC平滑数字校准

1.平滑数字校准

平滑数字校准是在220个RTCCLK脉冲周期(当输入频率为32768Hz时为32s)的时间内,通过增加或减少RTCCLK脉冲数量来进行频率校正,以获得更加精确、均匀的频率修正。当输入时钟为32768Hz时,RTC频率可以按0.954 ppm(Parts permillion,百万分率)的分辨率进行校准。校准分辨率可用以下公式来计算:

校准分辨率=1/(32×32768)=0.9536×10-6

当输入时钟为32768Hz时,设置RTC校准寄存器的CALP位可以在每211个RTCCLK脉冲后插入一个额外的RTCCLK脉冲,也就意味着每32s会插入512个RTCCLK时钟周期,这将使频率增加488.5 ppm。频率增加的比例可用以下公式来计算:

频率增加比例(百万分率)=512/(220-512)=488.52 ppm

RTC_CALR寄存器的CALM[8:0]位是“校准减”控制位,用于降低日历时钟频率,其取值表示在220个RTCCLK脉冲(32 s)的时间范围内所屏蔽的RTCCLK时钟脉冲个数,其最大值为511,可以使RTC频率最多减少487.1 ppm,频率降低比例可以用以下公式来计算:

频率降低比例(百万分率)=511/(220+511)=487.09 ppm

组合使用RTC_CALR寄存器的CALM和CALP位,可以在-487.1 ppm~+488.5 ppm的校准范围内,以0.954 ppm的校准步长来调整日历时钟频率。有效校准频率可用以下公式计算:

有效校准频率(FCAL)=FRTCCLK×[1+(CALP×512-CALM)/(220+CALM-CALP×512)]

2.验证RTC校准

可以通过对RTC模块1Hz校准输出脉冲的精确测量来验证RTC精度。默认情况下校准周期为32s,通过测量在32s时间内1Hz输出的精确度,测算出RTCCLK的精确频率,并计算正确的CALM和CALP值。为有效地对RTC进行校准,应当首先确保测量精度可以在0.477 ppm以内(0.5个RTCCLK相对于32s)。另外,当RTC_CALR寄存器CALW16位或CALW8位置位时,将强制使用16s或8s的校准周期,当然校准时间越短精确度也将会越差。

3.运行中重校准

当RTC模块运行时,也可以通过软件写RTC_CALR寄存器,实现运行中动态地调整RTCCLK时钟,具体可以通过以下步骤来实现:

·软件查询RTC_ISR寄存器的RECALPF位(重校准挂起标志),确保该位已经清除。

·软件向RTC_CALR寄存器写入一个新的校准值,此时RECALPF位将硬件置位。

·在向RTC_CALR寄存器写入新值后的3个CK_APRE时钟周期内,新的校准设置生效。

13.2.6 时间戳

RTC模块的时间戳功能允许将某一事件与其发生的时间相关联。当某一事件发生时,会将该事件发生时刻的日历寄存器中的实时值记录下来,用于后期软件处理。时间戳的原理如图13-2所示。

RTC_TS是时间戳事件输入端,当RTC_CR寄存器TSE置位时启用时间戳功能。当RTC_TS引脚检测到一个时间戳事件时,会将当前日历分别存储在时间戳事件寄存器(RTC_TSTR)、时间戳日期寄存器(RTC_TSDR)和时间戳亚秒寄存器(RTC_TSSSR)中。RTC_CR寄存器的TSEDGE位用于设置时间戳事件检测的有效边沿。

当产生时间戳事件时,RTC_ISR寄存器的时间戳标志位TSF被置位,如果RTC_CR寄存器的时间戳事件中断允许位TSIE已经置位,则会产生一个中断。当TSF标志位已经置位,且RTC_TS输入端又检测到一个新的时间戳事件,时间戳溢出标志位TSOVF会硬件置位,指示时间戳事件溢出,溢出后时间戳事件寄存器(RTC_TSTR和RTC_TSDR)内所保存的内容不变。

13.2.7 侵入检测

1.侵入检测的功能

与时间戳功能类似,STM32F072VBT6微控制器的RTC模块还有3个侵入检测端RTC_TAMP1、RTC_TAMP2和RTC_TAMP3,用于对外部事件做出相应动作。侵入检测有以下功能。

·产生侵入中断:当从RTC_TAMPx输入端检测到侵入事件时,RTC_ISR寄存器的TAMPxF检测标志位会硬件置位,通过设置RTC_TAFCR寄存器的TAMPIE位,会产生一个侵入中断。

·产生时间戳:当RTC_TAFCR寄存器的侵入事件时间戳TAMPTS位置1时,所有侵入事件将产生一个时间戳,其作用和正常的时间戳事件发生时的效果相同。该时间戳事件同样可以设置TSF或TSOVF位,并且与其关联的侵入标志位TAMPxF将同时被设置。

·复位备份寄存器:备份寄存器RTC_BKPxR处于备份域中,当VDD电源被切断后,这些寄存器将切换至VBAT维持供电,其中保存的内容并不会丢失。不仅如此,备份寄存器遇到系统复位或从待机模式下唤醒时,其内容也会保持,只有当微控制器处于上电复位或者发生侵入检测事件时,备份寄存器才会被复位。

侵入检测功能可以作为产品防拆解措施加以利用。例如在产品开发时,事先将一组密码写入备份寄存器中,使用板载电池作为备份域的供电以保持该密码,微控制器每次复位后都将检测该密码的存在,确认之后才能开始运行。一旦产品外壳遭遇意外拆解产生侵入事件(需要相应电路支持),或将微控制器与备份供电分离,将会导致备份寄存器复位,从而使程序不能继续运行。

2.侵入检测设置

侵入检测可以通过设置RTC_TAFCR寄存器的TAMPxE位来使能。输入事件可设置为边沿检测或带过滤功能的电平检测两种方式。

·边沿检测:RTC_TAFCR寄存器的TAMPFLT位为“00”时,按照相关TAMPxTRG位的边沿特性设置,当RTC_TAMPx引脚检测到上升或下降沿时,将生成侵入检测事件。当边沿检测特性被选中后,RTC_TAMPx输入端内部的上拉电阻将被停用。

·电平检测(带滤波):如果RTC_TAFCR寄存器的TAMPFLT位不为“00”时,会启用带滤波功能的电平检测。按照TAMPFLT位的不同设置,当完成2个、4个或8个连续采样后,指定电平(由TAMPxTRG位决定)将触发侵入检测事件。

在默认情况下,RTC_TAMPx引脚在采样前会通过内部上拉电阻实现预充电,预充电时间由RTC_TAFCR寄存器的TAMPPRCH[1:0]位设定。开启引脚预充电功能可以允许驱动更大的容性负载,置位RTC_TAFCR寄存器的TAMPPUDIS位可以关闭上拉功能,TAMPFREQ[2:0]位用于改变电平检测的采样频率,综合使用引脚上拉和采样频率控制可以在侵入检测延迟与上拉电阻电源消耗间进行取舍。

13.2.8 时钟输出

RTC_OUT是RTC模块复用功能输出引脚,具有校准和报警两种输出形式,其原理如图13-3所示。

1.校准输出(RTC_CALIB)

校准输出由RTC_CR寄存器的COE位使能。置位时RTC_CALIB校准输出端会输出512Hz或1Hz时钟信号(由RTC_CR寄存器的COSEL位设置),此时RTCCLK频率必须为32.768kHz,而且预分频器PREDIV_A和PREDIV_S均须保持为默认值。

2.报警输出(RTC_ALARM)

Alarm A输出由RTC_CR寄存器的OSEL[1:0]位使能,并与RTC_ISR寄存器的ALRAF标志位状态相关联。当OSEL[1:0]控制位的值为“01”时,Alarm A输出启用,输出极性由RTC_CR寄存器的POL位决定。当POL位清除时,报警输出与ALRAF标志状态相同,即ALRAF置位时报警输出为高电平;当POL位置1时,报警输出与ALRAF标志状态相反。

这里需要说明的是,报警输出启用后其优先级将高于校准输出,这时COE位的值将被忽略,并且需要保持在清除状态。当校准输出或报警输出启用后,RTC_OUT引脚将自动被配置为复用输出功能。

13.2.9 RTC低功耗模式

睡眠模式对RTC模块无影响,RTC中断会使微控制器退出睡眠模式。在停止或待机模式下,如果RTC使用LSE或LSI作为时钟源,RTC将保持运行状态,RTC报警、RTC侵入事件、RTC时间戳事件以及RTC唤醒事件将使设备退出停止模式,RTC模块对低功耗模式的影响详见表13-5。

http://www.cnnetsun.cn/news/1248103.html

相关文章:

  • 673. 最长递增子序列的个数(序列dp)
  • JavaScript性能优化实战哪撤
  • 3.12团队准备开题答辩
  • 把微信做成 AI 入口,到底值不值得?wechatapi操作实践
  • 048海产品销售系统-springboot+vue
  • Claude Code 番外篇:内置 `/loop` 全解,cron 调度 + 自然语言,自动监控只需一行
  • 港科校友| 罗咏丰:以校友导师身份回馈科大
  • 第二章 Spring中的Bean
  • 解决 Tomcat 跨域问题 - Tomcat 配置静态文件和 Java Web 服务(Spring MVC Springboot)同时允许跨域
  • 如何在 Golang 项目中高效运用 Protocol Buffers
  • 深度解析嵌入式for循环实现原理!
  • 使用PDF-Extract-Kit-1.0实现科研论文元数据自动提取
  • DeEAR语音情感识别避坑手册:采样率不匹配、通道数错误、静音过长导致的失败
  • DeepSeek-OCR-2部署教程:WSL2环境下Windows用户零配置运行深求·墨鉴
  • Qwen3-TTS语音合成进阶教程:情感强度、语速、停顿符的控制方法
  • Gemma-3-270m与MySQL数据库集成实战:高效数据处理方案
  • Realistic Vision V5.1 创意作品展:结合SolidWorks模型渲染的工业设计概念图
  • Qwen3-Reranker-4B性能优化:vLLM推理加速实践指南
  • 云容笔谈·东方红颜影像生成系统性能调优:针对STM32嵌入式设备展示的优化策略
  • 音乐流派分类Web应用保姆级教程:ViT模型+Gradio快速上手指南
  • 3个步骤解决OpenMV IDE在Raspberry Pi Bookworm上的兼容性问题
  • Qwen2.5-VL-7B-Instruct惊艳效果:漫画分镜图→剧情连贯性描述+角色关系推断
  • 如何摆脱平台依赖?yuque-exporter让语雀知识库完全自主掌控
  • Qwen3-VL-2B API接口安全设置:认证与限流配置
  • Phi-4-reasoning-vision-15B入门必看:如何规避click(x,y)输出?强约束提示词模板库
  • 内存故障排查全景图:从症状到解决方案的深度指南
  • Phi-3-Mini-128K算力利用率提升:多并发请求下GPU利用率稳定达82%实测
  • MusePublic资源监控教程:nvidia-smi实时跟踪显存与GPU利用率
  • Z-Image-Turbo-辉夜巫女对比评测:不同采样器生成效果与速度分析
  • AIGlasses OS Pro 面试宝典:攻克计算机视觉与深度学习常见八股文