代码
//bsp_rtc.c 中
void Rtc_Init(void){
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);
PWR_BackupAccessCmd(ENABLE);
BKP_DeInit();
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);
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetPrescaler(40000 - 1);
RTC_WaitForLastTask();
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” 里找到:
参考博客
@fei…- 蓝桥杯嵌入式开发经验分享(10. 输出比较 PWM) @Zach_z - 蓝桥杯嵌入式备赛手册
|