u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
RTC_NVIC_Config();
BKP->DR1=0Xa5a5;//
??这个地方是不是要重置,这句是我加的 ,但是没用
if(BKP->DR1!=0X5050)//第一次配置
{if (BKP_ReadBackupRegister(BKP_DR1) != 0x5a5a) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
PWR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//初始化时钟失败,晶振有问题
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_SetPrescaler(32767); //设置RTC预分频的值
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
Auto_
time_Set();
RTC_Set(2014,12,2,10,0,55); //设置时间
BKP_WriteBackupRegister(BKP_DR1, 0x0000); //向指定的后备寄存器中写入用户程序数据
}
}
else//系统继续计时
{
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_Get();//更新时间
RCC_ClearFlag(); //清除RCC的复位标志位
return 0; //ok
}
问题1:资料里给的时间是2004-13-30号,我想设置成自己的时间,但是不知道怎么改。上面我试了一下,没用。哪里出问题
问题2:RTC_Set()这个函数说是把所有的秒加起来,然后在得到年月日。但是我却没有看到变量来传递,难道是放在寄存器里面了。
在RTC初始化程序中,我们一般要查看BKP寄存器中的数据,判断后备电源是否掉电过。
如果掉电过,则初始化。没有在不执行。
但要设置时钟的话,必需允许PWR和BKP时钟,并允许读取BKP。
而如果仅电源掉电而后备电池不掉电的话,PWR和BKP时钟是没有开放的。
这样就等不到RTC指令执行完成的标志,停在那了。
解决方法就是在RTC初始化中判断判断掉电标志位的else分支中加入
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//后备域解锁
PWR_BackupAccessCmd(ENABLE);
即
if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
//重新配置RTC
RTC_Configuration();
...
...
}
else
{
//启用PWR和BKP的时钟(from APB1)
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
//后备域解锁
PWR_BackupAccessCmd(ENABLE);
...
...
}
要更改初值,必须重新设置后备寄存器的值,才能将新值写入RTC计数器。
void clockinit_RTC()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);
PWR_BackupAccessCmd(ENABLE);
if(BKP_ReadBackupRegister(BKP_DR1)!=0XA5A6)//从指定的后备寄存器读取数据,此数据是判断是否写入RTC寄存器初值的标志
{
rtc_init(); //RTC初始化
RTC_WaitForLastTask();//等待最后一次写操作完成
RTC_SetCounter(0xee98);//给RTC计数器赋初值
RTC_WaitForLastTask();
BKP_WriteBackupRegister(BKP_DR1,0xA5A6); //0xA5A6标志值
}
else
{
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC,ENABLE);
RTC_WaitForLastTask();
}
一周热门 更多>