蓝桥杯嵌入式(G4系列):RTC时钟

前言:

 

        关于RTC时钟的HAL库配置我也是第一次,之前都是用库函数的写法,这里写下这篇博客来记录一下自己的学习过程。

STM32Cubemx配置:

        首先点击左侧的Timers的RTC,勾选以下选项

        进入时钟树配置

         进入时间设置,这里我把时间设置为了2023年3月12日20点20分,但是我圈出来的地方一定要注意,125✖6000刚好是750Mhz,一秒发生一次中断

         到此为止,我们的STM32Cubemx配置就算是结束了,直接点击生成代码,接下来就是写代码了。

代码部分:

        这里有几点需要给大家强调一下,获取RTC时间或者日期时,必须先获取时间,再获取日期,顺序不能颠倒(会获取失败),而且时间和日期调用的时候不能单独调用,必须两个同时调用,否则出错,这是我实践得出的结果,即使我也不是太懂为啥。

RTC_TimeTypeDef sTime;				
RTC_DateTypeDef sDate;


while (1)
  {
	 HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
	 HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
 
	 sprintf((char *)LCD_dispaly,"%02d:%02d:%02d--%02d:%02d:%02d",sDate.Year,sDate.Month,sDate.Date,sTime.Hours,sTime.Minutes,sTime.Seconds);
	 LCD_DisplayStringLine(Line9,LCD_dispaly);	
  }

额外功能:

        暂停功能,起始暂停功能我一开始是没有想起来的,后来才想到,把RTC给关了,那不就暂停了吗

__HAL_RCC_RTC_DISABLE();

        恢复计时功能:

__HAL_RCC_RTC_ENABLE();

最终实现效果:

        

设定闹钟:

        RTC 时钟其中一大功能就是闹钟中断,我们在SM32Cubemx中进行如下配置

         将闹钟触发的时间设置为20:20:3,也就是初始时间的3秒后

        这里我们一定要注意一下,我相当于使用了秒中断,一定要把前三个给使能了,这三个选项是匹配日期,指的是所设闹钟需检测年月份日期,我们只用秒中断,所以只用这样配置就OK了

         然后我们使能中断

代码部分:

        这里设置闹钟的话就需要对代码进行封装了

        我们需要重新写一个GET_Time()函数,还有一个SET_Alarm()函数,同时要需要重新写一下RTC中断的回调函数

        这里一开始我是不打算去写GET_Time()函数的,我决定直接用前面提到的两个函数不就可以了吗,结果报了两个警告,保险起见,我还是把这两个函数封装一下:

         GET_Time():

void GET_Time(void)
{
	HAL_RTC_GetTime(&hrtc, &sTime, RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc, &sDate, RTC_FORMAT_BIN);
}

        SET_Alarm(),这个函数其实是我复制了MX_RTC_Init()里面的内容,然后更改一下就可以了,让每次中断的时候读取当前秒数,读取到的秒数再加上1就是下一次中断的触发时间。

RTC_AlarmTypeDef sAlarm;

void SET_alarm(void)
{
  sAlarm.AlarmTime.Hours = 0x22;
  sAlarm.AlarmTime.Minutes = 0x0;
  sAlarm.AlarmTime.Seconds = sTime.Seconds+1;
  sAlarm.AlarmTime.SubSeconds = 0x0;
  sAlarm.AlarmMask = RTC_ALARMMASK_DATEWEEKDAY|RTC_ALARMMASK_HOURS
                              |RTC_ALARMMASK_MINUTES;
  sAlarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_ALL;
  sAlarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_DATE;
  sAlarm.AlarmDateWeekDay = 0x1;
  sAlarm.Alarm = RTC_ALARM_A;
  if(sAlarm.AlarmTime.Seconds==60)sAlarm.AlarmTime.Seconds=0;
  HAL_RTC_SetAlarm_IT(&hrtc, &sAlarm, RTC_FORMAT_BIN);//这里要注意,我们选择的是十进制
}

 

         之后,我们在RTC的回调函数中书写服务函数

void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *hrtc)
{
	GET_Time();
	SET_Alarm();
	sprintf(string,"%02d:%02d:%02d\n",sTime.Hours,sTime.Minutes,sTime.Seconds);
	HAL_UART_Transmit(&huart1,(unsigned char *)string,strlen(string),50);
}

闹钟的效果实现:

        每一秒向串口助手发送当前时间

<think>好的,我需要处理用户关于蓝桥杯嵌入式竞赛中RTC实时时钟的问题。首先,用户希望查找相关资料和问题,我需要结合提供的引用内容来整理信息。 根据引用1和3,RTC蓝桥杯嵌入式系统中主要用于日历功能,包括设置时间和日期。引用1中的代码示例展示了如何获取时间和日期,使用HAL库的函数HAL_RTC_GetTime和HAL_RTC_GetDate。引用3提到RTC包含日历、闹钟和自动唤醒,但重点在日历功能,尤其是时间寄存器的结构。 接下来,用户可能需要了解如何初始化RTC,配置步骤,常见问题如时间设置错误或读取不更新。引用2中的代码展示了获取时间的函数,可能需要检查硬件配置是否正确,比如时钟源和备份域。此外,年份用两位数表示可能是个需要注意的点,如引用1所述。 然后,生成相关问题需要考虑常见的应用场景和问题。例如,如何显示时间到LCD,如何校准RTC,断电后如何保持时间等。需要确保问题覆盖配置、调试和应用方面,帮助用户深入理解。 最后,要确保回答结构清晰,分点说明,并正确引用来源。同时,使用LaTeX格式时注意行内公式用$...$,独立公式用$$...$$,但当前内容可能较少涉及数学公式,但需检查是否有变量或代码需要高亮。</think>### 蓝桥杯嵌入式RTC实时时钟相关资料与问题整理 #### 一、RTC基本功能与配置 在蓝桥杯嵌入式竞赛中,RTC(实时时钟)主要用于实现日历功能,包括时间(时、分、秒)和日期(年、月、日、星期)的获取与设置[^3]。其核心操作步骤如下: 1. **初始化配置** - 启用RTC时钟源(通常选择LSE低速外部时钟) - 配置备份域寄存器(RTC_BKP)以保持数据在系统复位后不丢失 2. **时间/日期设置** 通过`HAL_RTC_SetTime`和`HAL_RTC_SetDate`函数初始化基准时间,例如: ```c RTC_TimeTypeDef sTime = {0}; sTime.Hours = 12; //初始小时 sTime.Minutes = 0; //初始分钟 HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN); ``` 3. **实时读取** 使用`HAL_RTC_GetTime`和`HAL_RTC_GetDate`函数获取当前时间与日期,需注意**两个函数必须成对调用**以避免寄存器同步问题[^1][^2]。 #### 二、常见问题与注意事项 1. **年份设置限制** 蓝桥杯嵌入式平台中,年份字段(`Year`)仅支持两位数表示(如2024年需写为24)。 2. **时间读取不更新** 若发现时间读取后未变化,需检查是否遗漏了`HAL_RTC_GetDate`的调用,因为该操作会更新RTC影子寄存器[^3]。 3. **断电保持** 确保已配置备份电池(VBAT)并为RTC供电,否则断电后时间数据会丢失。 #### 三、典型应用场景 1. **竞赛题目中的计时功能** 例如倒计时器、数据记录时间戳等,需结合LCD显示模块输出格式化时间字符串。 2. **周期性任务触发** 通过RTC闹钟或自动唤醒功能实现定时操作,如每10秒采集一次传感器数据。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值