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

关于STM32 RTC时钟使用内部/外部晶振的切换方法

[复制链接]
我不怕 发布时间:2019-1-8 15:45
    对于使用STM32单片开发项目的同志,经常会使用到STM32的RTC功能,而在配置RTC的功能时需要配置晶振的使用,可以使用内部晶振或外部晶振,配置流程参考官方的示例代码即可。# |" M( D. u9 N; O; N
    但在之前的项目中遇到一个问题,由于一些产品的外部晶振损坏(时间长了有些外部晶振容易坏掉),导致RTC实时时钟时间异常。为了降低公司的维护成本,所以考虑通过修改程序,重新配置为STM32内部晶振来解决问题(我们的应用场景可以采用这种方法,因为服务器会固定时间同步产品时间)。& n& R1 {# G% _0 M6 h6 p# u# r
    采用外部晶振的RTC部分配置代码:) J& Q  m6 K9 e7 w4 W
    /* Enable the PWR clock */
/ I; k: e" Q( C- {$ b% _" f  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);: U  P8 r8 s% D0 p
  /* Allow access to RTC */
) M" I6 [$ i/ a) E2 M2 r. m  PWR_BackupAccessCmd(ENABLE);
3 P  Z+ u/ p, C$ ?; K    /* Enable the LSE OSC */
: s2 ~3 ?+ M, d+ O$ d; \# K, D  RCC_LSEConfig(RCC_LSE_ON);
! h) K+ b7 ?0 _" D$ D   
! p0 H4 r1 A9 ]; J. N    /* Wait till LSE is ready */ " @: d' f% H/ b/ u) V- e- C( n* D' y
    do{                           
0 _+ B; ~# W' L+ p            tick++;
% a. x1 K& ~& l7 J$ _    }while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && tick < 20000);
6 T- e* u& u- u& p. p  k0 z    tick = 0;
4 G8 P) k$ c2 o- i* c0 w4 P3 y2 z    /* Select the RTC Clock Source */3 k' _) s, p) `3 u$ s
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
+ b$ O3 Z: `: M    /* Enable the RTC Clock */( S" k3 {/ J4 m2 Q
  RCC_RTCCLKCmd(ENABLE);' G3 [6 F, u1 f9 A9 h& k
    1 x& h1 I( U$ @: C# w- f* N) h
    RTC_StructInit(&RTC_InitStructure);
% j" U* R9 z0 I( q: n" D    RTC_Init(&RTC_InitStructure);
- `/ U% l* |( C' S: H5 U0 u   
6 I( F* ~" y2 t: f! o* r    /* Wait for RTC APB registers synchronisation */' y' L' z1 `2 J- U& s0 t1 P
  RTC_WaitForSynchro();6 E3 V' j4 y6 R' \  |+ {  ^
    最初以为改为内部晶振配置比较简单,只要将和外部晶振有关的配置代码改为内部晶振即可。后来发现,STM32芯片的RTC时钟选择一旦配置了之后,想要切切换的话需要多配置一点东西,后来查了手册果然如此,这里给出配置代码,具体手册的说明有时间再放过来,以下部分供同志们参考。
) ~9 a+ n/ n$ S* }' J+ f    RTC从外部晶振切换为内部晶振配置代码:
- ]/ s, p  h* A    uint32_t tick = 0;9 Z2 n7 K; j" T0 H% |2 k8 G7 q
    uint32_t tmpreg1 = 0;; Q% J, d9 H8 x0 B4 B
     * c) t$ ~! ^$ P4 M( M! s7 P* g
    /* Enable the PWR clock */% L; g1 v: F. W9 _$ ?5 c9 V  B7 R$ t
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
5 L1 K2 V6 V4 i; o" T) m" ~4 G  /* Allow access to RTC */
& m+ D7 ^4 N. _8 I4 p& g2 D+ x/ A  PWR_BackupAccessCmd(ENABLE);
! i: a+ ]* y: Y' ?; ^  r    /* 晶振切换时必须执行的步骤,但不能每次上电都执行,否则会清空时间,同志们根据实际需求自行考虑执行位置 */
; E$ ]: k" L6 v% K- `    tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL));
4 @! p& m# V  r5 F& A, D% |    RCC_BackupResetCmd(ENABLE);        
" {0 }5 Z/ ~8 C8 m' Q8 m    RCC_BackupResetCmd(DISABLE);
. z0 G4 S* ~! p& I, O3 B/ a+ Y    RCC->BDCR = tmpreg1;
% H# @: B- I$ A0 `% \
   
/ Z/ S9 l$ d" x) s' c    6 q0 [1 g% U; {- A
    /* Enable the LSI OSC */
: y- @4 r  O' O, t3 e    RCC_LSICmd(ENABLE);" ]& N4 z6 }, V" {0 V, ]
    /* Wait till LSI is ready */
9 m7 ~2 I& Q, U9 c) J4 P    do{
% Q/ f  }% _+ w) F" p0 q            
. P1 V0 }" Q, ?( k            tick++;1 t3 r# k( E/ F5 T3 U% ?0 a
    }while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && tick < 20000);, i; z/ ^' I. q2 W0 B$ D+ J
    tick = 0;
+ g( V' S$ O" q. _5 I& B, u  E               
( I/ c9 A4 x# n# j  ~( [    /* Select the RTC Clock Source */
4 ~4 U3 V, F3 j8 S0 D2 d1 u  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
% N' U: p+ d# l. x$ ^( s2 O( Z    /* Enable the RTC Clock */. g0 M0 Y+ Q" G9 n) N  }  F* p, n! S  N
  RCC_RTCCLKCmd(ENABLE);$ K6 c5 h8 Q: {1 k) ~
   
2 Y7 S0 n. {3 u1 N7 w    RTC_StructInit(&RTC_InitStructure);
! E+ H- N% l: H5 ~. o( T    RTC_Init(&RTC_InitStructure);& U7 n0 T# U# P- |) H8 r+ m. d
   
+ |) R* t6 }. r; p+ o" E    /* Wait for RTC APB registers synchronisation */
" R; U; S- o1 L$ S  RTC_WaitForSynchro();; C: S& b/ [& A9 W  l" ~
9 d8 k% H* d7 I9 }) H/ \" c
天道酬勤!
0 Z1 X1 [. r$ o" R; I+ g/ j$ P% a
: I& I& s. f1 `. o5 `4 r) X+ L
赞 收藏 评论1 发布时间:2019-1-8 15:45

举报

1个回答
五哥1 回答时间:2019-1-8 19:25:57
原子的程序不是这样写的,也能够在外部晶振损坏的情况下,调用内部的
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版