博主将直接贴出代码并且辅以较为详细得注解
/***RTC初始化函数***/
/*
(1)后备区域开启和允许访问
(2)后备区域复位
(3)Rtc时钟选择及使能
(4)秒中断开启、设置计数器值、预分频值
*/
void Rtc_Init()
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR,ENABLE);//PWR,BKP时钟开启
PWR_BackupAccessCmd(ENABLE);//允许访问后备区域
BKP_DeInit();//后备区域复位
RCC_LSICmd(ENABLE);//LSI时钟使能
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY)==RESET);//等待使能完毕
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //RTC选择时钟
RCC_RTCCLKCmd(ENABLE);//Rtc时钟使能
RTC_WaitForSynchro();//等待时钟同步
RTC_WaitForLastTask();//等待最近写操作完成
RTC_ITConfig(RTC_IT_SEC,ENABLE);//打开秒中断
RTC_WaitForLastTask();
RTC_SetPrescaler(40000-1);//设置预分频值(40000-1)
RTC_WaitForLastTask();
RTC_SetCounter(Hour*2400+Minute*60+Second);//设置计数器初值
RTC_WaitForLastTask();
}
void NVIC_Config()
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
u8 string[20];
void Time_Display(u32 time_val)//传入参数为计数器值
{
u8 H;
u8 S;
u8 M;
H=time_val/3600;//得到时
M=time_val%3600/60;//得到分
S=time_val%3600%60;//得到秒
sprintf((char*)string,"time:%0.2d:%0.2d:%0.2d",H,M,S);//强制字符数组转换
LCD_DisplayStringLine(Line7,string);//lcd显示
}
```c
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC)==1)//如果发生中断
{
RTC_ClearITPendingBit(RTC_IT_SEC);//清楚中断标志
Time_Renew_flag=1;//更新显示标志
RTC_WaitForLastTask();
if(RTC_GetCounter()==3600*24)//时间到达24小时
{
RTC_SetCounter(0);//计数器清零
RTC_WaitForLastTask();
}
}
}