基于STM32F1的超级终端显示日历程序思路分析
一、准备
- 洋桃电子 M1 核心板;
- 用户程序中的“1-2-13-超级终端串口控制程序”;
- HyperTerminal 超级终端软件。
二、知识点
- RTC( 实时时钟) 和后备寄存器;
- 串口操作,包括中断
三、业务说明
-
需求说明:
打开超级终端软件,连接对应的 COM 口,接收到日历的提示信息如图所示:
其中,按下回车键更新时间;
键盘输入"c" 或 "C
" 时,初始化时钟;
如果需要重新设置时间,则按照“年月日时分秒”的形式输入,如20210417173500
,按下回车键确定。
四、业务逻辑分析
- 总体的思路是在串口中断里判断接收到的命令,确定是显示时间还是重新初始化或者是设置时间,如果都不是则输出指令错误的信息;
- 该项目涉及到了时钟的精准走时,由于内部的 RC 低速振荡器存在温漂的问题,因此要使用外部的低速晶振(32.768K)用来精确的显示时间;
- STM32 的 RTC 只是用一个 32 位的计数器来计时,而不是用年月日时分秒的分组寄存器。这个计数器每增加 1 就代表增加了 1 秒,32 位计数器都填满对应的时间大约为 136 年;
- 该项目加入了 RTC 的相关函数,用户需要调用的函数有 RTC 初始化(
RTC_Config
)、写入时间函数(RTC_Set
)和读出时间函数(RTC_Get
)。其余的功能比如判断某一年份是否为闰年、通过年月日推算星期几等则在内部函数中封装好了; - 写入时间函数思路:将收到的 14 位数据进行拆分,前 4 位为年,后面每 2 位一拆分分别为月、日、时、分和秒,然后将每一部分转换为对应的秒。平年为 31536000 秒,闰年为 31622400 秒,以此类推,将月、日、时、分、秒分别转换成秒,和前一个数量级进行相加,将换算好的数据通过标准库函数
RTC_SetCounter
写入 RTC 计数器; - 读出时间函数思路:用标准库函数
RTC_GetCounter
读取 RTC 计数器中的数值,读到的该数值为当前时间的秒数,需要将该数值转化为年、月、日、时、分、秒的形式。每一天有 24 小时,对应的秒数为 86400 ,用读取到的数值对 86400 整除,得到该数值可转换的整的天数,再根据闰年和平年计算出时间到哪一年和余出来多少天,用余出来的天数换算成月份和日期;用读取到的数值对 86400 取余,得到的是非整天的时、分和秒。