|
最近在使用STM32L476的RTC功能时, 发现在重新设置日期和时间后,# M, z6 y2 r; u2 T3 f( H8 N 虽然时间已经更新为设置的时间, 但是日期没有改变为最新的日期。 只有重新复位后,RTC_DR的内容才被刷新。 8 P0 p. I4 O2 N" p4 n: o: d 阅读手册才发现,4 \' J/ v3 P) f 3 G/ a4 w0 l( }
& w0 x! p6 T/ i' i2 G% w* S% U 默认设置下,读取RTC_TR和RTC_DR都是读的shadow registers中的值。$ t: j9 U: m/ T+ @9 r 虽然按照理论说,这两个寄存器会在两个RTCCLK周期内被刷新, 但是不知何故,在自己的应用中RTC_TR刷新了,RTC_DR一直没有刷新。6 A: l! V0 t- u" n2 @' P3 T 除非复位重启。 所以,需要设置RTC_CR中的BYPSHAD标志,直接读取calendar registers的内容。% i3 `- N% T7 ], K! I 避免设置后,RTC_DR的内容没有被更新。 : f. ~3 M* ^" Q) }1 p, l 那么这里有一个疑问,4 E% h* G' C2 n' r 实际应用中如果访问shadow registers是否存在隐患(或者确实是在初始化的时候,漏掉了某些设置,参考附注), 相比于direct access访问shadow registers的优点在哪里? 1 {- M) N. j0 O; [0 `: I 附:- J4 v* J K" U6 p 在访问shadow registers的初始化设置如下:% S- ?; c4 ~. ~& M) D9 L( E9 _$ G hrtc.Init.HourFormat = RTC_HOURFORMAT_24; hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV; hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV;: [2 f- J4 D/ H hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;" K" T% S, y* ?$ o* ?* a6 | hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;1 ~4 t. \2 s' @3 @0 p" C/ r J 2 x. y6 ~7 z$ Q0 r* _% U* j+ J/ A+ S direct access的初始化设置如下:& C1 K5 P4 O+ R/ }" L+ J " y9 ^4 r) |$ w' ~! j" h hrtc.Init.HourFormat = RTC_HOURFORMAT_24 | RTC_CR_BYPSHAD;4 k) \. t! g) \) k3 p; T. v3 w( M hrtc.Init.AsynchPrediv = RTC_ASYNCH_PREDIV;- P# d/ o& U) r7 v6 u hrtc.Init.SynchPrediv = RTC_SYNCH_PREDIV; hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;' m6 V: O+ q$ @) t hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;' `: v; ^+ S: W J0 P$ e1 ^ hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; 4 A' A" ?# ^) [0 v1 u6 D4 ]# N |
STM32L4R9 QuadSPI Flash通讯速率优化解析 32位总线的DMA传输适配核心方案
【STEVAL-STWINKT1B评测】运行Datalog固件并记录运行时间
【STEVAL-STWINKT1B评测】数字麦/模拟麦对比测试+音频配套上位机软件开发
【板卡评测】STEVAL-STWINKT1B读取 ACC/GYRO/MAG 实时数据
小白也能明白的STM32的低功耗与唤醒机制
【STM32入门学习路径指南】(四步走)
STM32和Arduino对比,谁更耐打?
STM32系统中2种数据掉电保护的方法
STM32 LL为什么比HAL高效?
STM32小白入门指南:从基础到OTA实现方案
微信公众号
手机版
在RTC的HAL库中没有找到相关的Enable操作,
你是指这里缺少了哪一个Enable操作呢?/ a) s5 O7 ^: _9 k( Y0 J
当前的初始化确实只进行了这些操作。 P6 ]/ j3 K& t+ z8 T
if (HAL_RTC_Init(&hrtc) != HAL_OK) {8 T0 g0 [: I! S+ ]! c
return VC_ER_FATIL;
}
没有额外调用其他的操作。
6 u( z( v$ ^' S
在COMP中设置好之后需要调用HAL_COMP_Start,, z0 v0 f7 s1 t. \& X
才能使能COMP,
这个在HAL库中找到了。