cube生成rtc时钟的工程
这一步在网上可以找到许多资料,在此就不做过多的赘述了。记住在生成工程的时候,也把串口打开,这样方便直接把时间信息输出到串口。
输出时间信息
在工程完成以后,只需要简单的加几句就可以输出时间。这几句加在主循环里面,
/* USER CODE END WHILE */
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc, &GetData, RTC_FORMAT_BIN);
printf("%02d/%02d/%02d\r\n",2000 + GetData.Year, GetData.Month, GetData.Date);
printf("%02d:%02d:%02d\r\n",GetTime.Hours, GetTime.Minutes, GetTime.Seconds);
printf("\r\n");
`
这时在串口上面已经可以看到输出的时间信息了,但这时如果进行复位或者断电的话,时间又会重新开始了,因为我们还没有打开后备电源模块,所以断电就会重新开始。
开启后备模块
首先在时钟初始化函数里面进行修改,其他的东西全部删除了,就留下如下的代码,并且添加 ***__HAL_RCC_PWR_CLK_ENABLE(); ***//开启后备电源时钟
***HAL_PWR_EnableBkUpAccess();***//允许访问、RTC 备份寄存器
这两个函数。
void MX_RTC_Init(void)
{
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
/** 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 */
// __HAL_RCC_BKP_CLK_ENABLE();
***__HAL_RCC_PWR_CLK_ENABLE(); ***//开启后备电源时钟
***HAL_PWR_EnableBkUpAccess();***//允许访问、RTC 备份寄存器
/* ??????:0x32F1?RTC???????1 */
//??????
/* USER CODE END Check_RTC_BKUP */
/** Initialize RTC and set the Time and Date
*/
}
在rtc,c里面添加如下函数
void rtc_check(void )
{
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
/*读取后备寄存器的值,我们给他写入了一个值,我们在重新上电的时候,重新读取这个值,正常情况下,应该是不会发生改变的,如果发送了改变就重新写入我们设置的时间值*/
if (HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR1) != 0x32F1)
{
/* ÉèÖÃʱ¼ä£¬ÉèÖÃÈÕÆÚ */
sTime.Hours = 0x13;
sTime.Minutes = 0x30;
sTime.Seconds = 0x13;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_AUGUST;
sDate.Date = 0x25;
sDate.Year = 0x20;
/*以上就是我们设置的时间值*/
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x32F1);
}
else
{
/* ????????????:SET */
if (__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
{
printf("·¢ÉúÉϵ縴λ!\n");
}
/* ????????????:SET */
if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
{
printf("·¢ÉúÍⲿӡ½Å¸´Î»\n");
}
/* 清除标志位 */
__HAL_RCC_CLEAR_RESET_FLAGS();
/允许读取后备寄存器
HAL_PWR_EnableBkUpAccess();
//等待同步
HAL_RTC_WaitForSynchro(&hrtc);
}
}
进行了以上的修改以后就可以进行正常的时间显示,复位,掉电都可以继续允许。
可以看到,我按下了复位,时间依然还是正常的。
如果需要源代码的话,可以私信我,我发给你。