|
楼主 |
发表于 2021-4-13 15:45:32
|
显示全部楼层
- void bsp_InitRTC1(void)
- {
- uint16_t u16_WaitForOscSource;
- /*
- 在BKP的后备寄存器1中,存了一个特殊字符0xA5A5, 第一次上电或后备电源掉电后,该寄存器数据丢失,
- 表明RTC数据丢失,需要重新配置
- */
- if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
- {
- /* PWR时钟(电源控制)与BKP时钟(RTC后备寄存器)使能 */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
-
- /* 使能RTC和后备寄存器访问 */
- PWR_BackupAccessCmd(ENABLE);
-
- /* 将外设BKP的全部寄存器重设为缺省值 */
- BKP_DeInit();
- #if defined (RTC_CLOCK_SOURCE_LSE)
-
- /* 使能LSE */
- RCC_LSEConfig(RCC_LSE_ON);
-
- #if 1
- for(u16_WaitForOscSource=0; u16_WaitForOscSource < 5000; u16_WaitForOscSource++)
- {
- ;
- }
- #endif
-
- /* 等待外部晶振震荡稳定输出 */
- while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
-
- /* 使用外部32.768KHz晶振作为RTC时钟 */
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
- #elif defined (RTC_CLOCK_SOURCE_LSI)
-
- /* 使能LSI */
- RCC_LSICmd(ENABLE);
- /* 等待直到LSI就绪 */
- while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
- /* 选择LSI作为RTC的时钟 */
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
- #endif
-
- /* 使能RTC时钟 */
- RCC_RTCCLKCmd(ENABLE);
-
- /*
- 在APB1总线复位或者停止后重新开启,RTC的任何读取前得等待RTC寄存器
- (RTC_CNT, RTC_ALR and RTC_PRL)跟RTC APB时钟同步。
- */
- RTC_WaitForSynchro();
-
- /* 等待RTC寄存器操作完成 */
- RTC_WaitForLastTask();
- #if defined (RTC_CLOCK_SOURCE_LSE)
- /* 32.768KHz晶振预分频值是32767,如果对精度要求很高可以修改此分频值来校准晶振 */
- RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
- #elif defined (RTC_CLOCK_SOURCE_LSI)
- /*
- 1. LSI的频率典型值是40KHz(30KHz到60KHz)
- 2. 这里按40KHz来计算
- RTC 周期 = RTCCLK / RTC_PR = (40 KHz)/(39999 + 1) = 1Hz
- */
- RTC_SetPrescaler(39999);
- #endif
-
- /* 等待RTC寄存器操作完成 */
- RTC_WaitForLastTask();
-
- /* Enable the RTC Alarm interrupt */
- RTC_ITConfig(RTC_IT_ALR, ENABLE);
- /* 设置默认时间 */
- RTC_WriteClock(2015, 8, 8, 0, 0, 0);
-
- /* 配置完成后,向后备寄存器中写特殊字符0xA5A5 */
- BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
-
- /* 打印调试信息 */
- #ifdef RTC_Debug
- printf("重新配置后使用RTC \n\r");
- #endif
-
- /* 检测上电复位标志是否设置 */
- if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
- {
- /* 发生上电复位 */
- #ifdef RTC_Debug
- printf("发生上电复位 \n\r");
- #endif
- }
- }
- else
- {
- /* 若后备寄存器没有掉电,则无需重新配置RTC */
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
-
- for (u16_WaitForOscSource = 0; u16_WaitForOscSource < 5000; u16_WaitForOscSource++)
- {
- ;
- }
-
- /* 打印调试信息 */
- #ifdef RTC_Debug
- printf("第n次使用RTC \n\r");
- #endif
-
- /* Enable the RTC Alarm interrupt */
- RTC_ITConfig(RTC_IT_ALR, ENABLE);
-
- /* 检测上电复位标志是否设置 */
- if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)
- {
- /* 发生上电复位 */
- #ifdef RTC_Debug
- printf("发生上电复位 \n\r");
- #endif
- }
- /* 检测引脚复位标志是否设置 */
- else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)
- {
- /* 发生引脚复位 */
- #ifdef RTC_Debug
- printf("发生引脚复位 \n\r");
- #endif
- }
-
- /* 清除RCC中复位标志 */
- RCC_ClearFlag();
-
- }
- return;
- }
复制代码
用了 这个发现调用RTC_ReadClock(); 然后打印timecount 一直都是0
|
|