STM32 RTC亚秒
rtc时钟功能实现:rtc模块在stm32内部,由电池或者主电源供电。如下图,需注意实现时仅需设置一次初始化。
1、stm32cubemx 代码生成界面设置,仅需开启时钟源和激活日历功能。
2、生成的代码,需要对时钟进行初始化,仅需一次初始化即可。因此使用RTC_BKP_DR0保存设置状态,等于设置值时就说明设置过了不用再设置:
{
/* USER CODE BEGIN RTC_Init 0 */
/* USER CODE END RTC_Init 0 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
/* USER CODE BEGIN RTC_Init 1 */
/* USER CODE END RTC_Init 1 */
/** Initialize RTC Only
*/
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
hrtc.Init.AsynchPrediv = 127;
hrtc.Init.SynchPrediv = 255;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN Check_RTC_BKUP */
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
*/
/* USER CODE BEGIN RTC_Init 2 */
if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x50)
{
rtc_set_time(19, 17, 56, RTC_HOURFORMAT12_PM); /* 设置时间, 根据实际时间修改 */
rtc_set_date(25, 2, 9, 7); /* 设置日期 */
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR0,0x50);
}
/* USER CODE END RTC_Init 2 */
}
3、亚秒的设置,在RTC_TimeTypeDef结构体中有亚秒的属性SubSeconds读出即可,默认状态下不读取,因项目要求5ms记录一次时间所以使用到该属性。
4、函数调用:
void rtc_get_time(uint8_t *hour, uint8_t *min, uint8_t *sec,uint8_t *subsec, uint8_t *ampm)
{
RTC_TimeTypeDef rtc_time_handle;
HAL_RTC_GetTime(&hrtc, &rtc_time_handle, RTC_FORMAT_BIN);
*hour = rtc_time_handle.Hours;
*min = rtc_time_handle.Minutes;
*sec = rtc_time_handle.Seconds;
*subsec = rtc_time_handle.SubSeconds * 0.39;
*ampm = rtc_time_handle.TimeFormat;
}
最后的结果: