一、功能
实时时钟是一个由时钟信号驱动的日历时钟,提供日期和时间数据。STM32L496有一个片上RTC,通常情况下由内部时钟信号驱动,提供日历时间数据,它内部维护一个日历,能自动确定每个月的天数,能自动处理闰年情况。RTC有两个可编程闹钟,可以设定任意组合和重复性的闹钟;有一个周期唤醒单元,还有时间戳和入侵检测功能。
二、CubeMX项目配置
1、配置SYS
2、配置RCC
3、设置LSE
为Crystal/Ceramic Resonator
4、配置RTC
选择时钟源;
选择日历;
启用闹钟A和闹钟B;
启动周期唤醒功能。
5、参数设置
6、使能NVIC中断
7、生成IDE
三、添加代码
/*****rtc.c****/
//添加两段代码
/* USER CODE BEGIN RTC_Init 2 */
if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK)
{
Error_Handler();//默认配置生成的,我这里没有默认生成,就手动添加。
}
/* USER CODE END RTC_Init 2 */
/* USER CODE BEGIN 1 */
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
RTC_DateTypeDef sDate;
RTC_TimeTypeDef sTime;
static uint16_t num = 0;
num++;
printf("num:%d\r\n",num);
if(HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN) == HAL_OK)
{
HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);
char str[40];
sprintf(str,"%4d-%2d-%2d",2000+sDate.Year,sDate.Month,sDate.Date);
OLED_ShowString(0, 3, (uint8_t*)str,8);
sprintf(str,"%2d:%2d:%2d",sTime.Hours,sTime.Minutes,sTime.Seconds);
OLED_ShowString(0,5, (uint8_t*)str, 8);
}
}
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
triggerCntA++; //闹钟A触发次数
DEBUG_PRINT_String("AlarmA\r\n");
printf("triggerCntA:%d\r\n",triggerCntA);
}
void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
{
triggerCntB++; //闹钟B触发次数
DEBUG_PRINT_String("AlarmB\r\n");
printf("triggerCntB:%d\r\n",triggerCntB);
}
/* USER CODE END 1 */
四、结果展示与分析
每分钟的30s时触发闹钟B;
每小时的16分05秒时触发闹钟A;