實驗目的:
通過STM32CubeMX進行簡單配置生成HAL庫實現內部晶振RTC。
一、STM32CubeMX配置如下:
1.時鐘樹配置:
因為板子沒有外部RTC晶振,所以只能使用內部32KHz晶振,時鐘樹配置如下:
2.RTC配置:
(1)關于Asynchronous Predivider value 和 Synchronous Predivider value填寫多少,請看下面:
因為內部晶振是32KHz,所以毫無疑問應該選擇LSI=32KHz即:
Asynchronous Predivider value :127
Synchronous Predivider value :249
(2)關于Hours、Minutes等這些初值沒啥好疑問的,直接填寫,但是Year需要注意一下,它是從1970年開始算起的,所以比如填寫50就是2020年的意思。
二、STM32CubeMX配置生成的HAL庫如下:
/**
******************************************************************************
* File Name : RTC.c
* Description : This file provides code for the configuration
* of the RTC instances.
******************************************************************************
* @attention
*
*
© Copyright (c) 2020 STMicroelectronics. * All rights reserved.
* All rights reserved.
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "rtc.h"
/* USER CODE BEGIN 0 */
RTC_TimeTypeDef GetTime; //μ¥???ú?ú2?RTC?áè?ê±??
RTC_DateTypeDef GetDate; //μ¥???ú?ú2?RTC?áè?è??ú
uint8_t RTC_READ_Flag;
/* USER CODE END 0 */
RTC_HandleTypeDef hrtc;
/* RTC init function */
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 = 249;
hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
hrtc.Init.OutPutPullUp = RTC_OUTPUT_PULLUP_NONE;
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
*/
sTime.Hours = 19;
sTime.Minutes = 07;
sTime.Seconds = 00;
sTime.SubSeconds = 0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
sDate.WeekDay = RTC_WEEKDAY_WEDNESDAY;
sDate.Month = RTC_MONTH_SEPTEMBER;
sDate.Date = 8;
sDate.Year = 50;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
}
void HAL_RTC_MspInit(RTC_HandleTypeDef* rtcHandle)
{
if(rtcHandle->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspInit 0 */
/* USER CODE END RTC_MspInit 0 */
/* RTC clock enable */
__HAL_RCC_RTC_ENABLE();
__HAL_RCC_RTCAPB_CLK_ENABLE();
/* USER CODE BEGIN RTC_MspInit 1 */
/* USER CODE END RTC_MspInit 1 */
}
}
void HAL_RTC_MspDeInit(RTC_HandleTypeDef* rtcHandle)
{
if(rtcHandle->Instance==RTC)
{
/* USER CODE BEGIN RTC_MspDeInit 0 */
/* USER CODE END RTC_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_RTC_DISABLE();
__HAL_RCC_RTCAPB_CLK_DISABLE();
/* USER CODE BEGIN RTC_MspDeInit 1 */
/* USER CODE END RTC_MspDeInit 1 */
}
}
三、時間日期獲取設置等:
1、自己重繪一個設置time的函數:
/* USER CODE BEGIN 1 */
void RTC_SetTime(u8 hour, u8 minute, u8 second)
{
/*##-2- Configure the Time #################################################*/
GetTime.Hours = hour;
GetTime.Minutes = minute;
GetTime.Seconds = second;
// GetTime.TimeFormat = RTC_HOURFORMAT12_AM;
GetTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
GetTime.StoreOperation = RTC_STOREOPERATION_RESET;
if(HAL_RTC_SetTime(&hrtc,&GetTime,RTC_FORMAT_BIN) != HAL_OK)
{
}
}
/* USER CODE END 1 */
2、調用函數實現RTC:
1.首先初始化RTC時鐘:
MX_RTC_Init();
2.接著設置time時間:
RTC_SetTime(11,59,50); //設置時間為11時59分50秒
3.然后調用HAL庫函數實現time和date獲取,有個細節要注意一下,需要先獲取日期再獲取時間,親測直接獲取時間會有問題:
HAL_RTC_GetDate(&hrtc, &GetDate, RTC_FORMAT_BIN);//更新日期
HAL_RTC_GetTime(&hrtc, &GetTime, RTC_FORMAT_BIN);//更新時間
完美,收工!!!
上一篇:解決MDK仿真時候彈框Programming range...問題
下一篇:STM32CubeMX配置ADC模擬看門狗實現掉電保存
推薦閱讀
史海拾趣