|
对于使用STM32单片开发项目的同志,经常会使用到STM32的RTC功能,而在配置RTC的功能时需要配置晶振的使用,可以使用内部晶振或外部晶振,配置流程参考官方的示例代码即可。 但在之前的项目中遇到一个问题,由于一些产品的外部晶振损坏(时间长了有些外部晶振容易坏掉),导致RTC实时时钟时间异常。为了降低公司的维护成本,所以考虑通过修改程序,重新配置为STM32内部晶振来解决问题(我们的应用场景可以采用这种方法,因为服务器会固定时间同步产品时间)。: A! o3 ]6 x3 M& S 采用外部晶振的RTC部分配置代码:: H7 H ~/ u, |9 N& A) L /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */+ |' P+ l3 D9 @. l! J. K; }* Q PWR_BackupAccessCmd(ENABLE); /* Enable the LSE OSC */) ^9 }6 e' \. e RCC_LSEConfig(RCC_LSE_ON);4 j. { e7 U, O* P6 `) q! m3 o % R% s' T+ H3 h# j8 ] /* Wait till LSE is ready */ & H3 ]) T8 c& v" { do{ tick++; }while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && tick < 20000);* D) x. A# k& |" ~$ s1 Z tick = 0; /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); RTC_StructInit(&RTC_InitStructure); RTC_Init(&RTC_InitStructure); 7 }/ t i5 \. b% B /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); 最初以为改为内部晶振配置比较简单,只要将和外部晶振有关的配置代码改为内部晶振即可。后来发现,STM32芯片的RTC时钟选择一旦配置了之后,想要切切换的话需要多配置一点东西,后来查了手册果然如此,这里给出配置代码,具体手册的说明有时间再放过来,以下部分供同志们参考。6 i* B7 g9 z" v2 c& ?6 p RTC从外部晶振切换为内部晶振配置代码:- ^, y3 |1 B6 L" [" `- B4 ? uint32_t tick = 0; uint32_t tmpreg1 = 0;' J d$ ?% R! f; N8 J% g* R * N. M, b. d- ^5 U /* Enable the PWR clock */$ |" |; H) I1 s: F9 s% n RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */+ H3 D+ b3 X- m7 u& z9 g PWR_BackupAccessCmd(ENABLE); /* 晶振切换时必须执行的步骤,但不能每次上电都执行,否则会清空时间,同志们根据实际需求自行考虑执行位置 */ tmpreg1 = (RCC->BDCR & ~(RCC_BDCR_RTCSEL)); RCC_BackupResetCmd(ENABLE); - C j7 r- `. s1 ^ RCC_BackupResetCmd(DISABLE);* k; \) N! n% ^- w n RCC->BDCR = tmpreg1;$ N3 `0 W& f' g) X" z4 A: `7 J 4 h, X/ K( [3 n' g2 V /* Enable the LSI OSC */ RCC_LSICmd(ENABLE);, z) [/ }% s8 C( W4 T /* Wait till LSI is ready */ 1 r) ]) r7 y3 A* w9 }% ^ do{ a. l5 k0 [& t8 N tick++;. k! K; y) k; A. ~2 Q }while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET && tick < 20000); tick = 0;* S+ {8 d/ Y, u5 I1 f$ ]0 _3 W 7 j4 f" [* j! S9 l' | /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); /* Enable the RTC Clock */0 k& ? \& M* U/ F8 G. w RCC_RTCCLKCmd(ENABLE); RTC_StructInit(&RTC_InitStructure);" h* ?& n8 l; C \ RTC_Init(&RTC_InitStructure); /* Wait for RTC APB registers synchronisation */! u4 }8 n' c8 f7 s5 B RTC_WaitForSynchro(); 天道酬勤!5 s9 `' x8 V: S8 Q |
| 原子的程序不是这样写的,也能够在外部晶振损坏的情况下,调用内部的 |
微信公众号
手机版