#include "../main/SystemInclude.h" void RTC_SEC_Init(void) { RTC_InitTypeDef RTC_InitStructure; /* 1. 初始化RTC参数 */ RTC_InitStructure.ClockSource = RCC_RTCCLKSource_LSI; // RTC时钟源LSI RTC_InitStructure.Prescaler = 32767; // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) = 1S RTC_InitStructure.Counter = 0; // 从0开始计数 RTC_InitStructure.Alarm = 10; // 闹钟时间10S LHL_RTC_Init(&RTC_InitStructure); /* 2. 开启秒中断 */ LHL_RTC_ITConfig(RTC_IT_SECIE, ENABLE); NVIC_EnableIRQ(RTC_IRQn); // 秒中断和溢出中断在RTC_IRQn处理 } void RTC_ALR_Init(void) { RTC_InitTypeDef RTC_InitStructure; /* 1. 初始化RTC参数 */ RTC_InitStructure.ClockSource = RCC_RTCCLKSource_LSI; // RTC时钟源LSI RTC_InitStructure.Prescaler = 32767; // RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) = 1S RTC_InitStructure.Counter = 0; // 从0开始计数 RTC_InitStructure.Alarm = 5-1; // 闹钟时间5S LHL_RTC_Init(&RTC_InitStructure); /* 2. 开启闹钟 */ LHL_RTC_ITConfig(RTC_IT_ALRIE, ENABLE); NVIC_EnableIRQ(RTCAlarm_IRQn); // 独立开启闹钟中断,则在RTCAlarm_IRQn处理 } /* 不建议同时开启秒中断和闹钟中断 */ //秒中断 void RTC_IRQHandler(void) { uint32_t Time_Count; if (LHL_RTC_GetPending(RTC_FLAG_SECF) == SET) { // 清除RTC秒中断标志 LHL_RTC_ClearPending(RTC_FLAG_SECF); // 获取当前RTC 计数值并打印 LHL_RTC_GetCounter(&Time_Count); // printf("%d\n", Time_Count); } } //闹钟中断 void RTCAlarm_IRQHandler(void) { uint32_t Time_Count; if (LHL_RTC_GetPending(RTC_FLAG_ALRF) == SET) { LHL_RTC_ClearPending(RTC_FLAG_ALRF); // 清除RTC闹钟中断标志 LHL_RTC_GetCounter(&Time_Count); // 获取当前RTC 计数值并打印 LHL_RTC_SetAlarm(Time_Count+4); // 设置新的闹钟,当前时间+5S // printf("Alarm is ringing: %d\n", Time_Count); } }