你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L476之RTC使用注意

[复制链接]
catch2000 发布时间:2017-6-8 14:52
最近在使用STM32L476的RTC功能时,
( s; I1 t( N1 C* s发现在重新设置日期和时间后,# M, z6 y2 r; u2 T3 f( H8 N
虽然时间已经更新为设置的时间,
! d/ ?6 l/ v1 l) E/ p% p但是日期没有改变为最新的日期。
; ^1 a) T! t" x/ l: q) U9 c: p只有重新复位后,RTC_DR的内容才被刷新。
& ~1 R: u# B1 U. J4 F% ?5 ?8 P0 p. I4 O2 N" p4 n: o: d
阅读手册才发现,4 \' J/ v3 P) f
3 G/ a4 w0 l( }
STM32L476 RTC.png
+ R6 @5 l' l( F, S( J  h& w0 x! p6 T/ i' i2 G% w* S% U
默认设置下,读取RTC_TR和RTC_DR都是读的shadow registers中的值。$ t: j9 U: m/ T+ @9 r
虽然按照理论说,这两个寄存器会在两个RTCCLK周期内被刷新,
9 C9 r7 b( b# Z# c& W5 x6 e- b但是不知何故,在自己的应用中RTC_TR刷新了,RTC_DR一直没有刷新。6 A: l! V0 t- u" n2 @' P3 T
除非复位重启。
4 J  K. Y$ a3 n0 T. z
8 e$ }/ N0 L( j. s& P4 S; Y所以,需要设置RTC_CR中的BYPSHAD标志,直接读取calendar registers的内容。% i3 `- N% T7 ], K! I
避免设置后,RTC_DR的内容没有被更新。
. S+ _' t* w$ B8 R5 q, ^# ?* c# [: f. ~3 M* ^" Q) }1 p, l
那么这里有一个疑问,4 E% h* G' C2 n' r
实际应用中如果访问shadow registers是否存在隐患(或者确实是在初始化的时候,漏掉了某些设置,参考附注),
% ?& a. n, A9 j6 O相比于direct access访问shadow registers的优点在哪里?
0 d  C6 d' `" Z4 O0 C6 L6 k( C1 {- 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;
: E! L) ]0 j' i  T% O: |4 w  hrtc.Init.AsynchPrediv   = RTC_ASYNCH_PREDIV;
2 u# R( |; b! H) P5 `$ `* `  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;
+ ?" Q) E- l; Y# E  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;
4 K! g7 s- Y0 Y$ u  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;
! ?' k) ]5 ~: D, a+ S0 ?4 A' A" ?# ^) [0 v1 u6 D4 ]# N

% h4 ~5 a' [+ V
赞 收藏 评论2 发布时间:2017-6-8 14:52

举报

2个回答
wolfgang 回答时间:2017-6-9 10:47:26
初始化之后没有 Enable?或者 Start RTC的操作?只有Reset?
catch2000 回答时间:2017-6-10 10:44:31
wolfgang2015 发表于 2017-6-9 10:470 p! N+ p* _! q5 u' S. }
初始化之后没有 Enable?或者 Start RTC的操作?只有Reset?
+ N  }$ U& ~, K0 x, r, O- J
在RTC的HAL库中没有找到相关的Enable操作,
8 V( x+ _2 y: r你是指这里缺少了哪一个Enable操作呢?/ a) s5 O7 ^: _9 k( Y0 J

( e: o, c! Q; I4 o当前的初始化确实只进行了这些操作。  P6 ]/ j3 K& t+ z8 T
if (HAL_RTC_Init(&hrtc) != HAL_OK) {8 T0 g0 [: I! S+ ]! c
    return VC_ER_FATIL;
) }8 S$ c" q$ K  }
2 l' |8 W  i6 x4 ?没有额外调用其他的操作。
  B! ^+ T* D/ W+ F* ~' g& r) k6 u( z( v$ ^' S

* }1 K4 {7 s, v' @9 M) E$ m2 A在COMP中设置好之后需要调用HAL_COMP_Start,, z0 v0 f7 s1 t. \& X
才能使能COMP,
5 y6 m1 O2 J% |5 X" W7 A- u这个在HAL库中找到了。

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版