在下面的函数中调用了一条RTC_Get()函数,此处的可以执行,整个程序都正常,但在main()函数中的RTC_Init()之后,再加一条RTC_Set(2014,4,11,20,1,1)函数,编译然后下载执行,结果整个程序就执行不了。不知什么原因,请大家帮帮忙,解答一下吧。
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
//if(BKP->DR1!=0X5050)//第一次配置
if (BKP_ReadBackupRegister(BKP_DR1) != 0x5051) //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
{
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
/* Allow access to BKP Domain */
 
WR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
/* Reset Backup Domain */
BKP_DeInit(); //将外设BKP的全部寄存器重设为缺省值
/* Enable LSE */
RCC_LSEConfig(RCC_LSE_ON); //设置外部低速晶振(LSE),使用外设低速晶振
/* Wait till LSE is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//初始化时钟失败,晶振有问题
/* Select LSE as RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
/* Enable RTC Clock */
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
/* Set RTC prescaler: set RTC period to 1sec */
/* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
RTC_SetPrescaler(32767); //设置RTC预分频的值
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
RTC_Set(2014,4,11,18,54,55); //设置时间
BKP_WriteBackupRegister(BKP_DR1, 0X5050); //向指定的后备寄存器中写入用户程序数据
}
else//系统继续计时
{
/* Check if the Power On Reset flag is set */
if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET) //检查指定的RCC标志位设置与否
OR/PDR复位
{
//printf("
Power On Reset occurred....");
}
/* Check if the Pin Reset flag is set */
else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET) //检查指定的RCC标志位设置与否:管脚复位
{
//printf("
External Reset occurred....");
}
//printf("
No need to configure RTC....");
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro(); //等待最近一次对RTC寄存器的写操作完成
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE); //使能RTC秒中断
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
}
RTC_Get();//更新时间
/* Clear reset flags */
RCC_ClearFlag(); //清除RCC的复位标志位
return 0; //ok
}
在站长的寄存器版的RTC_Ret()函数中有如下三句指令:“
//设置时钟
RCC->APB1ENR|=1<<28;//使能电源时钟
RCC->APB1ENR|=1<<27;//使能备份时钟
PWR->CR|=1<<8; //取消备份区写保护
//上面三步是必须的!”
而在库函数版的RTC_Set()函数中没有以上三句的功能。把以下语句加上后,一切正常。
/* Enable WR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟
/* Allow access to BKP Domain */
 WR_BackupAccessCmd(ENABLE); //使能RTC和后备寄存器访问
一周热门 更多>