STM32F1系列HAL库开发——RTC实时时钟

这篇具有很好参考价值的文章主要介绍了STM32F1系列HAL库开发——RTC实时时钟。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

RTC简介

实时时钟(Real Time Clock,RTC),是一个可以不使用系统主电源供电的定时器。在系统主电源断开 的情况下,依靠纽扣电池供电继续计时,只要都VBAT不断,都不影响RTC正常工作,只有当系统电源VDD和纽扣电池VBAT都断开时,RTC才停止工作。RTC的时钟源有三个。第一个由外部高速时钟源(HSE)经过128分频得到,第二个来自外部低速时钟源(LSE),第三个来自内部低速时钟源(LSI)。只有LSE在系统主电源掉电时,可以由VBAT供电,因此如果想RTC在主电源掉电也能运行,只能选择LSE提供时钟。外部低速时钟(LSE)的晶振频率为32.768KHz,经过2^15=32768分频后,刚好为1Hz,即计数器每计数一次,刚好就是一秒。

RTC初始化配置

RTC相关参数的设置较少,只需要设置预分频系数和将RTC时钟源配置为LSE即可。具体代码如下。需要注意的是,设置RTC的预分频系数理论上是32768,但是由于实际的外部晶振的频率并不是准确的32.768kHz,所以RTC走时会较快或者较慢,这时就需要根据实际情况来调整预分频系数了。

//RTC初始化
void RTC_Init(void)
{
	hrtc.Instance = RTC;
	//这里可以设置为RTC_AUTO_1_SECOND,自动计算1秒对应的预分频值
	hrtc.Init.AsynchPrediv = 32776;
	if(HAL_RTC_Init(&hrtc) != HAL_OK)
	{
		printf("RTC初始化失败\r\n");
	}
	__HAL_RCC_RTC_ENABLE();		//使能RTC时钟
}

//HAL_RTC_Init回调硬件初始化
void HAL_RTC_MspInit(RTC_HandleTypeDef *RTC_Handle)
{
	RCC_OscInitTypeDef			RCC_OscInitStruct;
	RCC_PeriphCLKInitTypeDef	PeriphCLKInitStruct;
	
	//配置LSE时钟源
	RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE;
	RCC_OscInitStruct.LSEState = RCC_LSE_ON;
	RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
	if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
	{
		printf("LSE时钟源开启失败\r\n");
	}
	
	//配置RTC时钟
	PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;
	PeriphCLKInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
	if(HAL_RCCEx_PeriphCLKConfig(&PeriphCLKInitStruct) != HAL_OK)
	{
		printf("RTC时钟源配置失败\r\n");
	}
	
	__HAL_RTC_ALARM_ENABLE_IT(&hrtc,RTC_IT_ALRA);	//使能闹钟中断
	HAL_NVIC_SetPriority(RTC_Alarm_IRQn,1,0);
	HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn);		
}

RTC时间的设置与获取

要配置RTC日历(时间和日期),使用HAL_RTC_SetTime()和HAL_RTC_SetDate()函数。读取RTC日历,使用HAL_RTC_GetTime()和HAL_RTC_GetDate()函数。
具体代码如下,值得注意的是,获取RTC时间和日期时,需要先调用HAL_RTC_GetTime获取时间再调用HAL_RTC_GetDate获取日期,否则会出现获取的时间不准等一系列问题。

//定义日期和时间结构体,用于接收时间和日期信息
RTC_DateTypeDef RTC_DataStruct;
RTC_TimeTypeDef	RTC_TimeStruct;
//设置RTC时间和日期(数据格式 BIN,即使用 10 进制表示)
void RTC_SetTime(uint16_t year, uint8_t month, uint8_t day, 
				uint8_t hour, uint8_t min, uint8_t sec)
{
	// 使能访问后备寄存器相关条件 
	 __HAL_RCC_PWR_CLK_ENABLE(); // 使能 PWR 电源时钟 
	 __HAL_RCC_BKP_CLK_ENABLE(); // 使能 BKP 后备寄存器时钟 
	 HAL_PWR_EnableBkUpAccess(); // 使能对 BKP 后备寄存器访问
	
	 //由该结构体的定义得知年份参数范围是0到99,所以要将具体的年份减去2000
	RTC_DataStruct.Year = year - 2000;	
	RTC_DataStruct.Month= month;
	RTC_DataStruct.Date= day;
	RTC_DataStruct.WeekDay = RTC_WEEKDAY_MONDAY;	//星期会自动计算,这里传入任意值
	HAL_RTC_SetDate(&hrtc,&RTC_DataStruct,RTC_FORMAT_BIN);
	RTC_TimeStruct.Hours = hour;
	RTC_TimeStruct.Minutes= min;
	RTC_TimeStruct.Seconds= sec;
	HAL_RTC_SetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
}
//获取RTC时间和日期
void RTC_GetTime(void)
{
	HAL_RTC_GetTime(&hrtc,&RTC_TimeStruct,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc,&RTC_DataStruct,RTC_FORMAT_BIN);
}

这里再插一个注意:STM32F1系列使用的RTC版本为V1版本。V2(其他系列)支持的所有特性在F1上都不支持。
在V2中,主要的RTC特性由HW管理。而在F1上,日期特性完全由软件管理。所以,与其他系列相比,有一些限制:
•HAL只支持24小时格式(不支持12小时格式)
•日期保存在SRAM中。当MCU处于STOP或STANDBY模式时,或者掉电重新上电数据将丢失。若想在下次上电或者低功耗唤醒之后仍然可以获取到日期信息需要另寻他法。

RTC中断

秒中断:
如果在RTC_CR寄存器中使能了SECIE位(Second interrupt enable),则每个TR_CLK周期RTC会产生一
个中断。通常TR_CLK周期为1秒,因此该中断也被称为秒中断。
闹钟中断:
闹钟中断就是设置一个预设定的值,当目前时间到达设定的值,就会产生中断信号。当然,RTC闹钟中断还有一个功能就是将MCU从低功耗模式下唤醒,而不用依靠外部中断唤醒的方式

这里主要介绍闹钟中断的使用,秒中断的使用方法大同小异。
使用HAL_RTC_SetAlarm()函数配置RTC闹钟。使用HAL_RTC_SetAlarm_IT()函数配置中断模式的RTC闹钟。
读取RTC闹钟,使用HAL_RTC_GetAlarm()函数。下面是设置RTC闹钟和闹钟中断函数的代码,其中闹钟中断的中断优先级设置和使能等已经在RTC初始化配置过了。

//RTC设置闹钟时间
void RTC_SetAlarm(uint8_t hour,uint8_t min,uint8_t sec)
{
	RTC_AlarmStruct.AlarmTime.Hours = hour;
	RTC_AlarmStruct.AlarmTime.Minutes = min;
	RTC_AlarmStruct.AlarmTime.Seconds = sec;
	HAL_RTC_SetAlarm_IT(&hrtc,&RTC_AlarmStruct,RTC_FORMAT_BIN);
}

//RTC闹钟中断服务函数
void RTC_Alarm_IRQHandler(void)
{
	HAL_RTC_AlarmIRQHandler(&hrtc);
}

//RTC闹钟唤醒中断回调函数
void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *RTC_Handle)
{
	__HAL_RTC_ALARM_EXTI_CLEAR_FLAG();	//清除闹钟中断标志位
	//你的中断服务具体代码.....
	//............
}

以上就是基于STM32HAL库的RTC时钟的一些我认为比较重要的点,当然还有一些没有介绍到,比如如何写入和读取后备寄存器还有RTC的32位向上计数器Uinx 时间戳转换等等。文章来源地址https://www.toymoban.com/news/detail-417157.html

到了这里,关于STM32F1系列HAL库开发——RTC实时时钟的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【正点原子STM32】RTC实时时钟(RTC方案、BCD码、时间戳、RTC相关寄存器和HAL库驱动、RTC基本配置步骤、RTC基本驱动步骤、时间设置和读取、RTC闹钟配置和RTC周期性自动唤醒配置)

    一、RTC简介 二、STM32 RTC框图介绍 2.1、STM32 F1 RTC结构框图 2.2、STM32 F4 / F7 / H7 RTC结构框图 三、RTC相关寄存器介绍 3.1、RTC基本配置步骤 3.2、RTC相关寄存器(F1) 3.3、RTC相关寄存器(F4 / F7 / H7) 四、RTC相关HAL库驱动介绍 4.1、RTC相关HAL库驱动(F1) 4.2、RTC相关HAL库驱动(F4 / F7 /

    2024年03月27日
    浏览(61)
  • STM32--RTC实时时钟

    Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒 。 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量。 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间。 GMT : GMT(Greenwich Mean Time), 格林威治平时(也称格林

    2024年02月10日
    浏览(40)
  • STM32——RTC实时时钟

    Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日0时0分0秒开始所经过的秒数,不考虑闰秒 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间 底层使用秒计数器可以节省硬件设计电路,

    2024年01月23日
    浏览(33)
  • STM32-RTC实时时钟

    目录 RTC实时时钟 功能框图 UNIX时间戳 初始化结构体 RTC时间结构体 RTC日期结构体 RTC闹钟结构体 进入和退出配置函数 实验环节1:显示日历 常规配置 RTC配置 测试环节 实验现象 实验环节2:闹钟 常规配置 RTC配置 测试环节 实验现象 STM32的RTC外设,实质上是一个 掉电后还继续运

    2024年02月06日
    浏览(40)
  • 【STM32】RTC(实时时钟)

    本质:计数器 RTC中断是外部中断(EXTI) 当VDD掉电的时候,Vbat可以通过电源---实时计时 STM32的RTC外设(Real Time Clock),实质是一个   掉电   后还继续运行的定时器。从定时器的角度来说,相对于通用定时器TIM外设,它十分简单, 只有很纯粹的计时和触发中断的功能 ;但从

    2024年02月03日
    浏览(42)
  • STM32-RTC实时时钟详解

    RTC的本质很简单,就是一个时钟经过精确分频最后得到的一个1Hz的时钟,也可以说是计数器,其他大部分功能都是基于这个计数器设计的数字逻辑。 本文讲的RTC是基于STM32F030来讲的,相比与F1系列的RTC来说,M0的将很多原本需要软件实现的功能硬件化了,使用起来更加便利。

    2024年02月04日
    浏览(39)
  • 【STM32学习】实时时钟 —— RTC

    STM32RTC实时时钟实验讲解,从入门到放弃 【STM32】RTC休眠唤醒(停机模式)、独立看门狗开启状态下 关于STM32使用RTC唤醒停止模式的设置 RTC(Real Time Clock):实时时钟,是指可以像时钟一样输出实际时间的电子设备,一般会是集成电路,因此也称为时钟芯片。总之,RTC只是个能靠电

    2024年02月01日
    浏览(40)
  • STM32-实时时钟RTC-2

                                     

    2024年01月20日
    浏览(38)
  • STM32基础10--实时时钟(RTC)

     目录 前言 RTC框图 STM32实时时钟电路 功能需要 STM32CubeMx配置RTC 配置RCC 配置RTC 配置时间,闹钟,唤醒 开启中断 设置中断优先级 功能代码实现 STM32Cude生成RTC初始化 自定义触发闹钟次数变量  重写周期唤醒回调函数 重写闹钟中断函数         在做51单片机项目时,如果需

    2023年04月11日
    浏览(29)
  • STM32学习笔记(十二)丨RTC实时时钟

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江协科技 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断   

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包