RTC实质是一个掉电后还继续运行的定时器
一,RTC的简单运用(打印日期与时间)
1,配置STM32Cubemx
RCC的HSE与LSE都设置为外部晶振,SYS;
RTC: Activate Clock Source (激活时钟源)和 Activate calendar(激活日历)都开启;RTC OUT选择 NO RTC OUTPUT;
Binary data format 十六进制
BCD data format BCD码进制
选择BCD data format(BCD码进制),并设置时间与日期;
开启串口打印;
二,程序实现
编写串口打印函数,并添加头文件,开启USE;
在主函数前添加两个结构体:
RTC_DateTypeDef myData; //获取日期结构体
RTC_TimeTypeDef myTime; //获取时间结构体
主函数://======================先读时间,再读日期
HAL_RTC_GetTime(&hrtc,&myTime,RTC_FORMAT_BIN);//============================时间获取函数
printf("%02d:%02d:%02d\r\n",myTime.Hours, myTime.Minutes, myTime.Seconds);
HAL_RTC_GetDate(&hrtc,&myData,RTC_FORMAT_BIN);//=============================日期获取函数
printf("%02d/%02d/%02d\r\n",2000 + myData.Year, myData.Month, myData.Date);
HAL_GPIO_TogglePin(GPIOC,LED_Pin);//========================检测
HAL_Delay(1000);
//==================================================================================================================
void time(int x,int y, int z)//========================自定义时间设置函数,调用即可,日期设置类似
{
RTC_TimeTypeDef myTime;
myTime.Hours = x;
myTime.Minutes = y;
myTime.Seconds = z;
if (HAL_RTC_SetTime(&hrtc, &myTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
}
void date (uint8_t YY, uint8_t MM, uint8_t DD)
{
RTC_DateTypeDef sDate;
myDate.WeekDay = RTC_WEEKDAY_MONDAY;
myDate.Month = MM;
myDate.Date = DD;
myDate.Year = YY;
if (HAL_RTC_SetDate(&hrtc, &myDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
/*设置系统时间*/
HAL_StatusTypeDef HAL_RTC_SetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*读取系统时间*/
HAL_StatusTypeDef HAL_RTC_GetTime(RTC_HandleTypeDef *hrtc, RTC_TimeTypeDef *sTime, uint32_t Format)
/*设置系统日期*/
HAL_StatusTypeDef HAL_RTC_SetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*读取系统日期*/
HAL_StatusTypeDef HAL_RTC_GetDate(RTC_HandleTypeDef *hrtc, RTC_DateTypeDef *sDate, uint32_t Format)
/*启动报警功能*/
HAL_StatusTypeDef HAL_RTC_SetAlarm(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*设置报警中断*/
HAL_StatusTypeDef HAL_RTC_SetAlarm_IT(RTC_HandleTypeDef *hrtc, RTC_AlarmTypeDef *sAlarm, uint32_t Format)
/*报警时间回调函数*/
__weak void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
/*写入后备储存器*/
void HAL_RTCEx_BKUPWrite(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister, uint32_t Data)
/*读取后备储存器*/
uint32_t HAL_RTCEx_BKUPRead(RTC_HandleTypeDef *hrtc, uint32_t BackupRegister
/*RTC周期回调中断服务函数*/
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
/*RTC闹钟A中断服务函数*/
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
/*RTC闹钟B中断服务函数*/
void HAL_RTCEx_AlarmBEventCallback(RTC_HandleTypeDef *hrtc)
总分频公式:
F(rtc_clock) = (PREDIV + 1) * (PREDIV_S + 1);
在STM32CubeMX 中 :
Asynchronous Predivider value (PREDIV_A):127
Synchronous Predivider value (PREDIV_S):255
(127+1)×(255+1)=128×256=32768(接近实际频率)