初级会员

- 积分
- 76
- 金钱
- 76
- 注册时间
- 2016-12-29
- 在线时间
- 28 小时
|
发表于 2016-12-29 11:42:53
|
显示全部楼层
我刚刚也遇到了同样的问题,后来想明白了。
程序里面的u8 RTC_Init(void)函数中有这样一句:
if(RTC_Read_BKR(0)!=0x5050) //是否第一次配置?
那么在配置完成之后,RTC_Read_BKR(0)的值被设置为0x5050,所以假如我们想要在开机之后再次修改时间,进不去这个if循环,所以没法修改,时间还是上次修改之后的结果。
如果想要每次都可以修改时间,只需要去掉这个if循环,将这个函数改成:
u8 RTC_Init(void)
{
u16 retry=0X1FFF;
RCC->APB1ENR|=1<<28; //使能电源接口时钟
PWR->CR|=1<<8; //后备区域访问使能(RTC+SRAM)
//if(RTC_Read_BKR(0)==0x5050) //是否第一次配置?
//{
RCC->BDCR|=1<<0; //LSE 开启
while(retry&&((RCC->BDCR&0X02)==0))//等待LSE准备好
{
retry--;
delay_ms(5);
}
if(retry==0)return 1; //LSE 开启失败.
RCC->BDCR|=1<<8; //选择LSE,作为RTC的时钟
RCC->BDCR|=1<<15; //使能RTC时钟
//关闭RTC寄存器写保护
RTC->WPR=0xCA;
RTC->WPR=0x53;
if(RTC_Init_Mode())return 2;//进入RTC初始化模式
RTC->PRER=0XFF; //RTC同步分频系数(0~7FFF),必须先设置同步分频,再设置异步分频,Frtc=Fclks/((Sprec+1)*(Asprec+1))
RTC->PRER|=0X7F<<16; //RTC异步分频系数(1~0X7F)
RTC->CR&=~(1<<6); //RTC设置为,24小时格式
RTC->ISR&=~(1<<7); //退出RTC初始化模式
RTC->WPR=0xFF; //使能RTC寄存器写保护
RTC_Set_Time(21,5,12,0); //设置时间
RTC_Set_Date(16,7,25,3); //设置日期
//RTC_Set_AlarmA(7,0,0,10); //设置闹钟时间
//RTC_Write_BKR(0,0X5050); //标记已经初始化过了
//}
//RTC_Set_WakeUp(4,0); //配置WAKE UP中断,1秒钟中断一次
return 0;
}
只不过这样修改之后,每次开机都需要自己重新修改时间值。
|
|