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

news/2024/12/29 4:31:59/

前言:

 

        关于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);
}

闹钟的效果实现:

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


http://www.ppmy.cn/news/181789.html

相关文章

Linux快速清除命令行

笔记 删除命令行开始至光标处(win) Ctrlu (mac)会直接清除该行命令 删除光标至命令行结尾 Ctrlk 结果只剩下数字。 光标移到最前 Ctrla 光标移到最后 Ctrle 后面这2个最常用。

74HC595芯片应用

文章目录 前言一、74HC595芯片管脚定义功能二、74HC595芯片工作原理三、共阳极及共阴极数码管段码四、74HC595驱动代码总结 前言 74HC595芯片是在单片机系统中常用的芯片之一,他的作用就是把串行的信号转为并行的信号,常用在各种数码管以及点阵屏的驱动…

CH455G驱动数码管

官方硬件原理图 这个芯片可以驱动数码管也可以扫描键盘,这里我们只看数码管驱动,所以原理图参考官方这里就行了。最多只能驱动4个数码管。 官方数码管驱动说明 文档中说了芯片是iic通信控制,时序也是标准的iic时序,所以驱动我们…

计算机网络-层级架构

计网概念 计算机网络将分散的、具有独立功能的计算机系统,通过通信设备与线路连接起来,由软件实现资源共享和信息传递,同时也是一些互联的、自治的计算机系统的集合 计网组成的三种划分方式 硬件、软件、协议 硬件包含主机(端系…

GET http://localhost:8080/xxx/ net::ERR_BLOCKED_BY_CLIENT 解决方法之一

问题描述:在vue使用后端接口时,使用Postman调用的到数据,但是前端收不到,会报错GET http://localhost:8080/xxx/ net::ERR_BLOCKED_BY_CLIENT 问题分析:可能是由于你返回的数据中含图片地址,同时你又安装…

服务器inode使用100%解决

背景:平时服务器就挂着docker容器,一放好几个月没碰,创建文件夹,复制文件和启动新容器时,都有提示“no space left on device” 操作: 使用 df -h 查看硬盘使用量,发现还有20%多,没问…

天钰FP6770S6PTR芯片,VIN范围:2.7V至4.5V,低噪声恒定频率操作

描述 FP6770是一款低噪声DC/DC电荷泵产生调节输出电压的调节器从2.7V到4.5V输入电压。低外部零件计数(一个快速电容器和两个小旁路VIN和VOUT处的电容器)使FP6770成为理想用于小型电池供电应用。 FP6770以恒定频率模式运行开关电容器倍压器,…

2/3 P6770 [USACO05MAR]Checking an Alibi 不在场的证明

https://www.luogu.com.cn/problem/P6770 本题就是输出从结点1到各个有牛的结点的最小时间在M范围内的有牛结点,升序输出其编号。 刚开始没能ac,错误应该在输出格式上。 算法之外的代码应该写的逻辑清晰一点,一个数组尽量只代表一个意思。 &a…