本帖最后由 amulet116 于 2016-11-14 18:18 编辑
原子哥,小弟在用RTC的时候出现一个问题,百思不得其解,希望赐教。
RTC初始化正常,可以设置日期,时间。可是运行一段时间后,通过RTC_SetDate()重新设置日期失败,日期总是上次的日期。同时用RTC_SetTime(),可以成功修改时间。
对比RTC_SetDate() 和 RTC_SetTime(),操作基本一致,为什么呢? 修改日期是否还需要什么额外操作?
原子哥,是否碰到过同样问题 ?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
程序里面的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;
}
只不过这样修改之后,每次开机都需要自己重新修改时间值。
一周热门 更多>