用steam32显示屏做万年历

📅 2026/7/24 17:57:52 👁️ 阅读次数 📝 编程学习
用steam32显示屏做万年历

转动旋转编码器可以改数值,按下可以进入设置模式,平常为普通模式作类似钟表

我使用的是cubemx和cubeide的组合

1.高速外部时钟和低速外部时钟(主要是为了断电后能够继续计数)都需要设为晶振,旋钮有一个编码器模式,我使用的旋转编码器如果通道极性不经过设置会导致顺时针减小逆时针增加

类似于这个原理。通过A通道上升沿确定B通道的电频来确定旋转方向,不同的器件可能不一样,触发控制器有专门的旋转编码器接口

注(来自b站波特律动老师的图)

2.RTC时钟,采用的是32位,可以计数到0-2的32次方,使用的是unix时间戳来转换获取具体的时间,为了掉电也能够进行进行计数,需要吧RTC放在后备区域,有VBAT引脚引出来

但HAL库里关于RTC有个问题,他的日期和时间是分开计数的,也就是断电后时间可以继续计数,但日期就会被重置

因此需要自己写一个RTC时钟库,要对其进行写的操作前需要先进入RTC定义,必须要确定RTOFF是1的时候才能做写入操作,CNF值为1进入写模式,之后再清除CNF,相关的代码可以在网上找,有很多开源的库可以直接拿来用

也可以自己写一个,前面读操作和写操作直接调用HAL库里面的就行,写代码时,分到任务函数和初始化函数,便于阅读和多个任务解耦,但此次工程只有一个主任务

写代码遇到的最大的收益是业务逻辑不能写在模块库,那要实现可以使用回调函数

HAL库属于低层,故,可以在应用层先重新定义回调函数,在HAL库发生相应事件的时候调用回调函数,下面是库里面的函数

下面是应用层重新定义的回调函数,里面有具体逻辑实现

最后在定义里实现

其次,库函数里面用HAL—延时函数时会导致一系列问题,可以用下面函数来代替延时函数的实现作为消抖函数,getTick函数得到的是开机时间一直持续的时间,pressedtime代表按钮按下瞬间的时间,他们时间差要大于我们想要消抖的时间

最终实现如下图,时间和日期都可以改,在退出设置模式的时候时间会照常运行,断电后也会照常运行,像一块手表一样