STM32内部时钟配置RTC,实现时间、闹钟和周期唤醒设置与读取
说明:由于开发板上没有32.768kHz的时钟,所以选择内部32kHz的时钟。
基本配置
1.首先使能RTC
2.配置时钟(内部时钟32kHz)
3. General选项组里配置小时模式,有24小时制和12小时制可选,后面的127和255组合成分频系数,127实际对应128,255实际对应256,所以128×256=32768,正好实现输入32.768KHz时钟分频到1Hz。
由于我们选择内部时钟,所以设置为79和399,80×400=32000,实现输入32KHz时钟分频到1Hz。
4. 初始时间及日期配置:
DataFormat选项分别为BIN(时间为10进制)BCD(时间为16进制)
Hours为初始时间的小时
Minutes为初始时间的分钟
Seconds为初始时间的秒数
设置闹钟
1.闹钟使用,闹钟A设置为xx:xx:30触发,即每分钟的30秒触发。
2.使能闹钟中断
3.调用闹钟回调函数,每分钟30秒的时候触发一次
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
HAL_UART_Transmit(&huart6,(uint8_t *)"Alarm\r\n",7, 100);
}
周期唤醒
1.配置,Wake Up Clock:周期唤醒的时钟源;Wake Up Counter:唤醒计数器的重载值,如果设置为0,则每个时钟周期中断一次。如选择周期唤醒时钟源为1Hz信号时,若设置次值为0,则每一秒发生一次唤醒中断。
2.开启周期唤醒中断
3.重写回调函数,并获取时间日期(需同时获取,否则时间会锁死)
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
RTC_TimeTypeDef sTime;
RTC_DateTypeDef sDate;
HAL_RTC_GetTime(hrtc, &sTime, RTC_FORMAT_BIN);
sprintf(Uart6RxBuffer,"Time:%02d:%02d:%02d\t",sTime.Hours,sTime.Minutes,sTime.Seconds);
HAL_UART_Transmit(&huart6,(uint8_t *)Uart6RxBuffer,strlen(Uart6RxBuffer), 100);
HAL_RTC_GetDate(hrtc, &sDate, RTC_FORMAT_BIN);
sprintf(Uart6RxBuffer, "Date:20%02d-%02d-%02d\r\n",sDate.Year,sDate.Month,sDate.Date);
HAL_UART_Transmit(&huart6,(uint8_t *)Uart6RxBuffer,strlen(Uart6RxBuffer), 100);
}
作者:凌雲木794