|
对于使用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 */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);: U P8 r8 s% D0 p /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ " @: d' f% H/ b/ u) V- e- C( n* D' y do{ tick++; }while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && tick < 20000); tick = 0; /* Select the RTC Clock Source */3 k' _) s, p) `3 u$ s RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* 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); RTC_Init(&RTC_InitStructure); /* 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时钟选择一旦配置了之后,想要切切换的话需要多配置一点东西,后来查了手册果然如此,这里给出配置代码,具体手册的说明有时间再放过来,以下部分供同志们参考。 RTC从外部晶振切换为内部晶振配置代码: 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); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* 晶振切换时必须执行的步骤,但不能每次上电都执行,否则会清空时间,同志们根据实际需求自行考虑执行位置 */ tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); RCC->BDCR = tmpreg1;% H# @: B- I$ A0 `% \ 6 q0 [1 g% U; {- A /* Enable the LSI OSC */ RCC_LSICmd(ENABLE);" ]& N4 z6 }, V" {0 V, ] /* Wait till LSI is ready */ do{ 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; /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* 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) ~ RTC_StructInit(&RTC_InitStructure); RTC_Init(&RTC_InitStructure);& U7 n0 T# U# P- |) H8 r+ m. d /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro();; C: S& b/ [& A9 W l" ~ 9 d8 k% H* d7 I9 }) H/ \" c 天道酬勤! |
| 原子的程序不是这样写的,也能够在外部晶振损坏的情况下,调用内部的 |
微信公众号
手机版