芯片:STM32F103C8T6
应用管脚:
USART1、RCC、RTC
配置界面
修改时钟源为LSE
配置RTC,可设置时间及日期
应用函数
HAL_RTC_GetTime(&hrtc, &stimestructure, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &sdatestructure, RTC_FORMAT_BIN);
printf("%02d/%02d/%02d\r\n",2000 + sdatestructure.Year, sdatestructure.Month, sdatestructure.Date);
printf("%02d:%02d:%02d\r\n",stimestructure.Hours, stimestructure.Minutes, stimestructure.Seconds);
设置时间
stimestructure.Hours=huart1_RxBuffer[1];
stimestructure.Minutes=huart1_RxBuffer[2];
stimestructure.Seconds=huart1_RxBuffer[3];
if (HAL_RTC_SetTime(&hrtc, &stimestructure, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
设置日期
sdatestructure.Year=huart1_RxBuffer[1];
sdatestructure.Month=huart1_RxBuffer[2];
sdatestructure.Date=huart1_RxBuffer[3];
sdatestructure.WeekDay=huart1_RxBuffer[4];
if (HAL_RTC_SetDate(&hrtc, &sdatestructure, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
注意:
设置完成后,重启依旧会恢复到原初始化状态,修改MX_RTC_Init函数,将设置日期及时间注释掉,可解决掉电恢复初始化问题。但掉电日期依旧恢复默认,不知为何原因,后期实际用途中再深入使用。
/* RTC init function */
static void MX_RTC_Init(void)
{
// RTC_TimeTypeDef sTime;
// RTC_DateTypeDef DateToUpdate;
/**Initialize RTC and set the Time and Date
*/
hrtc.Instance = RTC;
hrtc.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
hrtc.Init.OutPut = RTC_OUTPUTSOURCE_NONE;
if (HAL_RTC_Init(&hrtc) != HAL_OK)
{
Error_Handler();
}
// sTime.Hours = 0x1;
// sTime.Minutes = 0x0;
// sTime.Seconds = 0x0;
// if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
// {
// Error_Handler();
// }
// DateToUpdate.WeekDay = RTC_WEEKDAY_MONDAY;
// DateToUpdate.Month = RTC_MONTH_JANUARY;
// DateToUpdate.Date = 0x1;
// DateToUpdate.Year = 0x0;
// if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
// {
// Error_Handler();
// }
}