1.初始化RTC
RTC_handle.Instance = RTC;
RTC_handle.Lock = HAL_UNLOCKED;
RTC_handle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
RTC_handle.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
if(HAL_RTC_Init(&RTC_handle) != HAL_OK)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
2.重写HAL_RTC_MspInit()函数
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
#ifdef RTC_CLOCK_SOURCE_LSE
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
}
#elif defined (RTC_CLOCK_SOURCE_LSI)
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
}
#else
#error Please select the RTC Clock source inside the main.h file
#endif
__HAL_RCC_RTC_ENABLE();
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}
3.定义用哪一个时钟源
可以定义在main.h文件中
#define RTC_CLOCK_SOURCE_LSE
4.配置时间和闹钟
date.Year = 0x20;
date.Month = RTC_MONTH_JUNE;
date.Date = 0x30;
date.WeekDay = RTC_WEEKDAY_TUESDAY;
if(HAL_RTC_SetDate(&RTC_handle,&date,RTC_FORMAT_BCD)!= HAL_OK)
{
}
time.Hours = 0x15;
time.Minutes = 0x10;
ime.Seconds = 0x00;
if(HAL_RTC_SetTime(&RTC_handle,&time,RTC_FORMAT_BCD)!= HAL_OK)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
alarm.Alarm = RTC_ALARM_A;
alarm.AlarmTime.Hours = 0x15;
alarm.AlarmTime.Minutes = 0x10;
alarm.AlarmTime.Seconds = 0x05;
HAL_RTC_SetAlarm_IT(&RTC_handle,&alarm,RTC_FORMAT_BCD);
5.重写RTC_Alarm_IRQHandler
让其进去HAL_RTC_AlarmIRQHandler()
void RTC_Alarm_IRQHandler(void)
{
HAL_RTC_AlarmIRQHandler(&RTC_handle);
}
6.重写HAL_RTC_AlarmAEventCallback()函数
进入闹钟中断执行里面的代码段。
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
HAL_RTC_GetTime(&RTC_handle,&time,RTC_FORMAT_BCD);
HAL_UART_Transmit(&UART_initStruct, (uint8_t*)&time.Seconds, 1,1000);
}
7.整份代码
#include "rtc.h"
RTC_HandleTypeDef RTC_handle;
RTC_DateTypeDef date;
RTC_TimeTypeDef time;
RTC_AlarmTypeDef alarm;
void RTC_Init(void)
{
RTC_handle.Instance = RTC;
RTC_handle.Lock = HAL_UNLOCKED;
RTC_handle.Init.AsynchPrediv = RTC_AUTO_1_SECOND;
RTC_handle.Init.OutPut = RTC_OUTPUTSOURCE_ALARM;
if(HAL_RTC_Init(&RTC_handle) != HAL_OK)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
}
void RTC_alarmconfig(void)
{
date.Year = 0x20;
date.Month = RTC_MONTH_JUNE;
date.Date = 0x30;
date.WeekDay = RTC_WEEKDAY_TUESDAY;
if(HAL_RTC_SetDate(&RTC_handle,&date,RTC_FORMAT_BCD)!= HAL_OK)
{
}
time.Hours = 0x15;
time.Minutes = 0x10;
time.Seconds = 0x00;
if(HAL_RTC_SetTime(&RTC_handle,&time,RTC_FORMAT_BCD)!= HAL_OK)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);
}
alarm.Alarm = RTC_ALARM_A;
alarm.AlarmTime.Hours = 0x15;
alarm.AlarmTime.Minutes = 0x10;
alarm.AlarmTime.Seconds = 0x05;
HAL_RTC_SetAlarm_IT(&RTC_handle,&alarm,RTC_FORMAT_BCD);
}
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
HAL_PWR_EnableBkUpAccess();
#ifdef RTC_CLOCK_SOURCE_LSE
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSEState = RCC_LSE_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_OFF;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
}
#elif defined (RTC_CLOCK_SOURCE_LSI)
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI | RCC_OSCILLATORTYPE_LSE;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.LSEState = RCC_LSE_OFF;
if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
{
}
#else
#error Please select the RTC Clock source inside the main.h file
#endif
__HAL_RCC_RTC_ENABLE();
HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x0F, 0);
HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);
}
void RTC_Alarm_IRQHandler(void)
{
HAL_RTC_AlarmIRQHandler(&RTC_handle);
}
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
HAL_RTC_GetTime(&RTC_handle,&time,RTC_FORMAT_BCD);
HAL_UART_Transmit(&UART_initStruct, (uint8_t*)&time.Seconds, 1,1000);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)