新手上路
- 积分
- 28
- 金钱
- 28
- 注册时间
- 2020-1-18
- 在线时间
- 5 小时
|
1金钱
问题情况: 板子有RTC电池。 程序首次配置RTC的预分频为 32772 。 板子停止供电后, RTC能继续跑, 但是我重新上电(或复位)后, 读取到的预分频寄存器值变回默认值(32768)。 问题:
难道 RTC预分频寄存器 不是由 RTC电池维持着? 如果是这样, M3掉电下,RTC时间 还能跑正确?
还是说,M3上电后,有程序引起 这预分频寄存器 复位?
RTC配置程序:
- u8 RTC_Init(void)
- {
- //检查是不是第一次配置时钟
- u8 temp=0;
-
- printf("\r\nRTC->PRLH =0x%4X", RTC->PRLH );
- printf("\r\nRTC->PRLL =0x%4X\r\n", RTC->PRLL );
-
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR , ENABLE);
-
- if( BKP_ReadBackupRegister(BKP_DR1) != 0X5050)//第一次配置
- {
-
- PWR_BackupAccessCmd(ENABLE);//打开后备域电源,可以访问后备域寄存器
- RCC_LSEConfig(RCC_LSE_ON);
-
- BKP_DeInit(); //复位备份区域,将BKP寄存器清空
-
- //RCC_LSEConfig(RCC_LSE_ON);//开启外部低速晶振LSE
- //RCC_LSICmd(ENABLE);//开启内部低速晶振LSI
- while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) &&temp<250 )
- {
- temp++;
- __nop();
- //delay_ms(10);
- }
- if( temp>=250 ) return 1;
-
- RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//使用外部低速晶振LSE为RTC时钟源
- //RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
-
- RCC_RTCCLKCmd(ENABLE);//选择使能RTC时钟
-
- RTC_WaitForLastTask();//等待上一次写RTC任务完成(常用,只要涉及对RTC里值的修改,都需要在修改后加上此函数)
- RTC_WaitForSynchro();//等待与APB1的同步,才能读RTC寄存器
-
- RTC_EnterConfigMode();//允许RTC配置
-
- RTC_SetPrescaler(32772);//
-
- RTC_WaitForLastTask();//等待上一次写RTC任务完成
-
- //RTC_ITConfig(RTC_IT_ALR , DISABLE);//使能闹钟中断. 秒中断RTC_IT_SEC
- RTC_ITConfig(RTC_IT_SEC, DISABLE);
-
- RTC_WaitForLastTask();//等待上一次写RTC任务完成
-
- RTC_Set(2020, 1,1, 6, 0, 0); //设置时间
-
- BKP_WriteBackupRegister(BKP_DR1, 0x5050);//写入想要的丢电判断数据
-
- rtc_log("*W RTC default time!\r\n");
- PWR_BackupAccessCmd(DISABLE);
- }
- else//系统继续计时
- {
- RCC_RTCCLKCmd(ENABLE);//选择使能RTC时钟
-
- RTC_WaitForSynchro();
- RTC_ITConfig(RTC_IT_SEC, DISABLE);
-
- RTC_WaitForLastTask();
-
- rtc_log("# RTC ok\r\n");
- }
-
- //NVIC_Config();//优先级设置
- RTC_Get();//更新时间
-
- return 0; //ok
- }
复制代码 读取预分频值代码:
- u32 prevalue = 0;
- prevalue = ((RTC->PRLH &0x0000F) <<16) | (RTC->PRLL & 0x0FFFF);
- printf("\r\nRTC pr=%u\r\n", prevalue );
复制代码
|
|