配置基本的参数:时钟、下载配置、串口(用于显示,记得重写fputc函数和使用微库Use MicroLIB)
生成keil程序后,首先找到rtc.c中的RTC_Init进行修改(如果不更改的话,会出现复位后出时间重新计算了)
内容如下(来自链接:https://blog.csdn.net/as480133937/article/details/105741893)
void MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 0 */
RTC_TimeTypeDef time; //时间结构体参数
RTC_DateTypeDef datebuff; //日期结构体参数
/* USER CODE END RTC_Init 0 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef DateToUpdate = {0};
/* USER CODE BEGIN RTC_Init 1 */
__HAL_RCC_BKP_CLK_ENABLE(); //开启后备区域时钟
__HAL_RCC_PWR_CLK_ENABLE(); //开启电源时钟
/* USER CODE END RTC_Init 1 */
/**Initialize RTC Only
*/
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();
}
/* USER CODE BEGIN Check_RTC_BKUP */
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR1)!= 0x5051)
{
/* USER CODE END Check_RTC_BKUP */
/**Initialize RTC and set the Time and Date
*/
sTime.Hours = 0x14;
sTime.Minutes = 0x30;
sTime.Seconds = 0x0;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
DateToUpdate.WeekDay = RTC_WEEKDAY_SATURDAY;
DateToUpdate.Month = RTC_MONTH_APRIL;
DateToUpdate.Date = 0x25;
DateToUpdate.Year = 0x20;
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BCD) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启RTC时钟秒中断
datebuff = DateToUpdate; //把日期数据拷贝到自己定义的data中
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR1, 0x5051);//向指定的后备区域寄存器写入数据
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR2, (uint16_t)datebuff.Year);
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR3, (uint16_t)datebuff.Month);
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR4, (uint16_t)datebuff.Date);
HAL_RTCEx_BKUPWrite(&hrtc, RTC_BKP_DR5, (uint16_t)datebuff.WeekDay);
}
else
{
datebuff.Year = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR2);
datebuff.Month = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR3);
datebuff.Date = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR4);
datebuff.WeekDay = HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR5);
DateToUpdate = datebuff;
if (HAL_RTC_SetDate(&hrtc, &DateToUpdate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
__HAL_RTC_SECOND_ENABLE_IT(&hrtc,RTC_IT_SEC); //开启RTC时钟秒中断
}
}
然后声明结构体
RTC_DateTypeDef Get_Data; //获取日期结构体
RTC_TimeTypeDef Get_Time; //获取时间结构体
然后进行时间获取文章来源:https://www.toymoban.com/news/detail-520506.html
HAL_RTC_GetDate(&hrtc, &Get_Data, RTC_FORMAT_BIN);//获取日期
HAL_RTC_GetTime(&hrtc, &Get_Time, RTC_FORMAT_BIN); //获取时间结
获取后的日期分别为:
Get_Data.Year//年:需要加上2000
Get_Data.Month//月
Get_Data.Date//日
Get_Data.WeekDay//星期数
获取后的日期分别为:
Get_Time.Hours//时
Get_Time.Minutes//分
Get_Time.Seconds//秒
可以根据串口打印出来
printf("%02d/%02d/%02d 星期:%d\r\n",2000 + Get_Data.Year, Get_Data.Month, Get_Data.Date,Get_Data.WeekDay);
printf("%02d:%02d:%02d\r\n",Get_Time.Hours, Get_Time.Minutes, Get_Time.Seconds);
最后的效果如下:文章来源地址https://www.toymoban.com/news/detail-520506.html
到了这里,关于STM32的RTC时钟的获取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!