?目錄
前言
RTC框圖
STM32實(shí)時(shí)時(shí)鐘電路
功能需要
STM32CubeMx配置RTC
配置RCC
配置RTC
配置時(shí)間,鬧鐘,喚醒
開啟中斷
設(shè)置中斷優(yōu)先級
功能代碼實(shí)現(xiàn)
STM32Cude生成RTC初始化
自定義觸發(fā)鬧鐘次數(shù)變量?
重寫周期喚醒回調(diào)函數(shù)
重寫鬧鐘中斷函數(shù)
前言
????????在做51單片機(jī)項(xiàng)目時(shí),如果需要年月日時(shí)分秒的時(shí)間記錄,會(huì)在51單片機(jī)上面外掛一個(gè)DS1302的時(shí)鐘芯片,再加上時(shí)間芯片的外圍電路。但在STM32F407中,不再需要這么干了,因?yàn)樵赟TM32的內(nèi)部就已經(jīng)集成了年月日時(shí)分秒的時(shí)鐘電路--也就是實(shí)時(shí)時(shí)鐘(RTC)
RTC框圖
????????下圖是RTC的框圖,箭頭部分是實(shí)時(shí)時(shí)鐘基本部分,包括時(shí)鐘源,預(yù)分頻,影子寄存器,引腳復(fù)用輸出。此外還有兩個(gè)鬧鐘,周期喚醒,入侵檢測以及時(shí)間戳。
STM32實(shí)時(shí)時(shí)鐘電路
? ? ? ? 在開發(fā)板上有低速外部時(shí)鐘源-32.768Khz。
功能需要
1)配置當(dāng)前時(shí)間
? ? ? ? 時(shí)間可以采取24小時(shí)格式,也可以采用12小時(shí)格式,默認(rèn)采用24小時(shí)格式。配置時(shí)間時(shí),還會(huì)設(shè)置日期格式,是采用BCD或者二進(jìn)制。建議采用二進(jìn)制即可,可以直接填入時(shí)間數(shù)值。
2)配置鬧鐘(每隔10s,觸發(fā)一次鬧鐘中斷)
3)設(shè)置周期喚醒(喚醒時(shí)間1s)并且可以輸出低電平。
STM32CubeMx配置RTC
配置RCC
? ? ? ? 由于RTC使用到外部時(shí)鐘源,因此需要在時(shí)鐘配置使用低速外部時(shí)鐘源。
配置RTC
配置時(shí)間,鬧鐘,喚醒
? ? ? ? 配置時(shí)間24小時(shí)格式,二進(jìn)制格式(22年5月2日,12時(shí)19分50秒);設(shè)置鬧鐘(由于每10s,鬧鐘觸發(fā)一次中斷,因此屏蔽掉時(shí)分,不屏蔽秒);設(shè)置周期時(shí)鐘,周期為1Hz,不需要計(jì)數(shù),也就是1s觸發(fā)一次;如果計(jì)數(shù)值為1,則為2s觸發(fā)一次中斷。
開啟中斷
設(shè)置中斷優(yōu)先級
功能代碼實(shí)現(xiàn)
STM32Cude生成RTC初始化
void MX_RTC_Init(void)
{
/* USER CODE BEGIN RTC_Init 0 */
/* USER CODE END RTC_Init 0 */
RTC_TimeTypeDef sTime = {0};
RTC_DateTypeDef sDate = {0};
RTC_AlarmTypeDef sAlarm = {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_WAKEUP;
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
*/
sTime.Hours = 12;
sTime.Minutes = 19;
sTime.Seconds = 50;
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_MONDAY;
sDate.Month = RTC_MONTH_MAY;
sDate.Date = 2;
sDate.Year = 22;
if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
/** Enable the Alarm A
*/
sAlarm.AlarmTime.Hours = 0;
sAlarm.AlarmTime.Minutes = 0;
sAlarm.AlarmTime.Seconds = 10;
sAlarm.AlarmTime.SubSeconds = 0;
sAlarm.AlarmTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
sAlarm.AlarmTime.StoreOperation = RTC_STOREOPERATION_RESET;
sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS
|RTC_ALARMMASK_MINUTES;
sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
sAlarm.AlarmDateWeekDay = 1;
sAlarm.Alarm = RTC_ALARM_A;
if (HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN) != HAL_OK)
{
Error_Handler();
}
/** Enable the WakeUp
*/
if (HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 0, RTC_WAKEUPCLOCK_CK_SPRE_16BITS) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN RTC_Init 2 */
/* USER CODE END RTC_Init 2 */
}
自定義觸發(fā)鬧鐘次數(shù)變量?
?
重寫周期喚醒回調(diào)函數(shù)
? ? ? ? 注:
????????1)一定要要先讀Time然后再度Date,否者會(huì)出錯(cuò);文章來源:http://www.zghlxwxcb.cn/news/detail-410700.html
? ? ? ? 2)即使不需要Date數(shù)據(jù),也要讀Date否則也會(huì)出錯(cuò)。?文章來源地址http://www.zghlxwxcb.cn/news/detail-410700.html
void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
RTC_TimeTypeDef sTime ={0};
RTC_DateTypeDef sDate={0};
char str[40] ={0};
//1)一定要要先讀Time然后再度Date,否者會(huì)出做;即使不需要Date數(shù)據(jù),也要度Date否則也會(huì)出錯(cuò)
if((HAL_RTC_GetTime(hrtc,&sTime,RTC_FORMAT_BIN)!=HAL_OK)|| (HAL_RTC_GetDate(hrtc,&sDate,RTC_FORMAT_BIN)!=HAL_OK))
{
return;
}
sprintf(str,"RTC Time = %4d年%2d月%2d日 \r\n",2000+sDate.Year,sDate.Month,sDate.Date);
HAL_UART_Transmit(&huart1,(const uint8_t *)str,strlen(str),100);
sprintf(str,"RTC Time = %2d時(shí)%2d分%2d秒 \r\n",sTime.Hours,sTime.Minutes,sTime.Seconds);
HAL_UART_Transmit(&huart1,(const uint8_t *)str,strlen(str),100);
}
重寫鬧鐘中斷函數(shù)
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
char str[40] ={0};
sprintf(str,"鬧鐘觸發(fā)次數(shù): %d \r\n",++alarmTrigger);
HAL_UART_Transmit(&huart1,(const uint8_t *)str,strlen((const char *)str),100);
}
到了這里,關(guān)于STM32基礎(chǔ)10--實(shí)時(shí)時(shí)鐘(RTC)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!