OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2617|回复: 0

F103VE复位后RTC预分频值 为什么也复位了

[复制链接]

2

主题

5

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2020-1-18
在线时间
5 小时
发表于 2020-1-18 17:05:28 | 显示全部楼层 |阅读模式
1金钱
问题情况: 板子有RTC电池。  程序首次配置RTC的预分频为 32772 。  板子停止供电后, RTC能继续跑,  但是我重新上电(或复位)后, 读取到的预分频寄存器值变回默认值(32768)。  问题:
       难道 RTC预分频寄存器 不是由 RTC电池维持着?  如果是这样, M3掉电下,RTC时间 还能跑正确?

       还是说,M3上电后,有程序引起 这预分频寄存器 复位?

RTC配置程序:
  1. u8 RTC_Init(void)
  2. {
  3.   //检查是不是第一次配置时钟
  4.   u8 temp=0;
  5.   
  6.   printf("\r\nRTC->PRLH =0x%4X", RTC->PRLH );
  7.   printf("\r\nRTC->PRLL =0x%4X\r\n", RTC->PRLL );
  8.   
  9.   RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR , ENABLE);
  10.   
  11.   if( BKP_ReadBackupRegister(BKP_DR1) != 0X5050)//第一次配置
  12.   {  
  13.    
  14.   PWR_BackupAccessCmd(ENABLE);//打开后备域电源,可以访问后备域寄存器
  15.   RCC_LSEConfig(RCC_LSE_ON);
  16.    
  17.     BKP_DeInit();  //复位备份区域,将BKP寄存器清空
  18.    
  19.     //RCC_LSEConfig(RCC_LSE_ON);//开启外部低速晶振LSE
  20.     //RCC_LSICmd(ENABLE);//开启内部低速晶振LSI
  21.     while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) &&temp<250 )
  22.     {
  23.       temp++;
  24.       __nop();
  25.       //delay_ms(10);
  26.     }
  27.     if( temp>=250 ) return 1;
  28.    
  29.     RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);//使用外部低速晶振LSE为RTC时钟源
  30.     //RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
  31.    
  32.     RCC_RTCCLKCmd(ENABLE);//选择使能RTC时钟
  33.    
  34.     RTC_WaitForLastTask();//等待上一次写RTC任务完成(常用,只要涉及对RTC里值的修改,都需要在修改后加上此函数)
  35.     RTC_WaitForSynchro();//等待与APB1的同步,才能读RTC寄存器
  36.    
  37.     RTC_EnterConfigMode();//允许RTC配置
  38.    
  39.     RTC_SetPrescaler(32772);//
  40.    
  41.     RTC_WaitForLastTask();//等待上一次写RTC任务完成
  42.    
  43.     //RTC_ITConfig(RTC_IT_ALR , DISABLE);//使能闹钟中断.  秒中断RTC_IT_SEC
  44.     RTC_ITConfig(RTC_IT_SEC, DISABLE);
  45.    
  46.     RTC_WaitForLastTask();//等待上一次写RTC任务完成
  47.                   
  48.     RTC_Set(2020, 1,1, 6, 0, 0);  //设置时间
  49.    
  50.     BKP_WriteBackupRegister(BKP_DR1, 0x5050);//写入想要的丢电判断数据
  51.    
  52.     rtc_log("*W RTC default time!\r\n");
  53.     PWR_BackupAccessCmd(DISABLE);
  54.   }
  55.   else//系统继续计时
  56.   {
  57.     RCC_RTCCLKCmd(ENABLE);//选择使能RTC时钟
  58.    
  59.     RTC_WaitForSynchro();
  60.     RTC_ITConfig(RTC_IT_SEC, DISABLE);   
  61.    
  62.     RTC_WaitForLastTask();
  63.    
  64.     rtc_log("# RTC ok\r\n");
  65.   }
  66.   
  67.   //NVIC_Config();//优先级设置   
  68.   RTC_Get();//更新时间
  69.   
  70.   return 0; //ok
  71. }
复制代码
读取预分频值代码:
  1. u32 prevalue = 0;
  2. prevalue = ((RTC->PRLH &0x0000F) <<16) | (RTC->PRLL & 0x0FFFF);
  3. printf("\r\nRTC pr=%u\r\n", prevalue );
复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-19 22:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表