代码
//bsp_rtc.c 中
void Rtc_Init(void){
NVIC_InitTypeDef NVIC_InitStructure;
//使能备份寄存器BKP和电源管理PWR时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
//使能RTC中断
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);
RCC_LSICmd(ENABLE); //使能LSI时钟
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //选择LSI作为时钟源
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForSynchro(); //等待APB1时钟与RTC时钟同步
RTC_WaitForLastTask();
RTC_SetPrescaler(40000 - 1); //设置分频
RTC_WaitForLastTask(); //等待操作完成
//RTC_SetCounter(3600 * HH + 60 * MM + SS); //设置初始时间
RTC_SetCounter(3600 * 20 + 60 * 30 + 00);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_SEC,ENABLE);//秒中断使能
RTC_WaitForLastTask();
}
// 主函数中
if(RTC_Flag)
{
RTC_Flag = 0;
TimeVal = RTC_GetCounter();
hour = TimeVal / 3600;
min = TimeVal % 3600 / 60;
sec = TimeVal % 3600 % 60;
sprintf((char*)string," TIME:%.2d:%.2d:%.2d ",hour,min,sec);
LCD_DisplayStringLine(Line4, string);
}
快速编写 RTC 驱动
在比赛提供的 V3.5 库的 “Project->STM32F10x_StdPeriph_Examples->RTC->LSI_Calib” 文件夹下,打开 “main.c”:
直接复制粘贴 RTC_Configuration () 部分,去掉最后两句代码,加上我们的计数值设定即可。
在相同目录下,打开 “stm32f10x_it.c” 还可以看到 RTC 中断函数相关代码,修改修改直接使用即可:
另外 RTC_SetCounter () 和 RTC_GetCounter () 也可以在库函数文件 “stm32f10x_rtc.h” 里找到: