什么是RTC ?
RTC:实时时钟(Real-Time Clock),利用RTC可以实现产品的精确计时,比如平时用的笔记本电脑、电子日历等都有RTC模块,当主电源断电时,RTC的模块用电池来供电,继续进行计时。STM32中的RTC和定时器有点类似,有一个32位的计数器,可以计数2的32次方,大约可以计时136年。
RTC的结构框图
RTC的时钟源(STM32L1系列,其它系列的芯片时钟源会略有不同,但都是这三类):
(1) LSE 32.768kHz
(2)HSE,最大1Mhz
(3)LSI,内部低速时钟,L1系列是37k,F2系列是32K,F4系列是40K,频率不一样,预分频值的设定也不一样。
RTC的相关代码
下面是HAL库中RTC使用的一些代码。
第一步,选择RTC的时钟源,本例选择内部低速时钟LSI,在系统时钟配置中有该时钟源的配置。
void SystemClock_Config(void)
{
//..............省略
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)= HAL_OK!)
{
_Error_Handler(__ FILE __,__ LINE__);
}
//............省略
}
然后,进行RTC初始化并启动设置RTC的定时时间,初始化部分涉及RTC的各个参数较多。
void MX_RTC_Init(void)
{
/ **初始化RTC
* /
hrtc.Instance = RTC;
hrtc.Init.HourFormat = RTC_HOURFORMAT_24; // 24小时制,还可选择12小时制
hrtc.Init.AsynchPrediv = 124; //异步预分频值
hrtc.Init.SynchPrediv = 295; //同步预分频值,异步与同步的预分频设置下面进行详细讲解
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(__ FILE __,__ LINE__);
}
/ **初始化RTC并设置时间和日期
* /
if(HAL_RTCEx_BKUPRead(&hrtc,RTC_BKP_DR0)!= 0x32F2){
sTime.Hours = 0x09;
sTime.Minutes = 0x1F;
sTime.Seconds = 0x0;
sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; //不使用夏令时
sTime.StoreOperation = RTC_STOREOPERATION_RESET;
if(HAL_RTC_SetTime(&hrtc,&sTime,RTC_FORMAT_BIN)!= HAL_OK)//注意传入参数有二进制格式和BCD格式可选
{
_Error_Handler(__ FILE __,__ LINE__);
}
sDate.WeekDay = RTC_WEEKDAY_MONDAY;
sDate.Month = RTC_MONTH_NOVEMBER;
sDate.Date = 0x15;
sDate.Year = 0x11;
if(HAL_RTC_SetDate(&hrtc,&sDate,RTC_FORMAT_BIN)!= HAL_OK)
{
_Error_Handler(__ FILE __,__ LINE__);
}
HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);
}
//设置RTC定时时间1s
if(HAL_RTCEx_SetWakeUpTimer_IT(&hrtc,1,RTC_WAKEUPCLOCK_CK_SPRE_16BITS)!= HAL_OK)
{
_Error_Handler(__ FILE __,__ LINE__);
}
}
RTC预分频值的设定关系到RTC多长时间记一次数。为了实现RTC的秒中断,需要对同步和异步预分频进行设置,如下图。STM32L1系列的RTC详细资料见链接:STM32L1XX_RTC。
如上图,为了得到1HZ计数周期,37KHZ/(124+1)/(295+1)=1HZ , 故预分频设置为124和295,如使用32.768k,设置为127和255。
RTC的时钟使能如下:
void HAL_RTC_MspInit(RTC_HandleTypeDef * hrtc)
{
if(hrtc-> Instance == RTC)
{
/ * USER CODE BEGIN RTC_MspInit 0 * /
/ * USER CODE END RTC_MspInit 0 * /
/ * *RTC时钟使能* /
__HAL_RCC_RTC_ENABLE();
/ * USER CODE BEGIN RTC_MspInit 1 * /
HAL_NVIC_SetPriority(RTC_WKUP_IRQn,0,0);//设置RTC秒中断优先级
HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn); //使能RTC秒中断
/ * USER CODE END RTC_MspInit 1 * /
}
}
第三步:编写RTC中断函数并置标志位;
void RTC_WKUP_IRQHandler(void)
{
HAL_RTCEx_WakeUpTimerIRQHandler(&hrtc);
RTC_Flag = 1;
}
第四步:主函数中若标志位被置位,执行自己的程序;
while(1)
{
if(!RTC_Flag == RESET)
{
RTC_Flag = 0; //RTC标志位清零
....... //添加自己的程序
}
}
上一篇:STM32-USART HAL库接收任意长度数据详细解析
下一篇:STM32—USART
推荐阅读最新更新时间:2024-03-16 16:23