使用stm32CubeMX配置RTC失败转用寄存器配置

1.最近学习hal库开发stm32,练习到了RTC时钟这一块,感觉真的是踩了个大坑,没想到会花费我两天的时间忙里忙外!
2.先说下总结性的:我使用hal库始终只能把时间写进RTC计数器,日期没成功过。然后放弃了hal库的这一套处理RTC计数器生成日历的逻辑,只保留其最基础的功能:比如使能时钟,
取消备份域写保护之类的这种已经包装好的易用的耦合性低的工具函数。
利用这些函数再加上直接操作寄存器,最终实现了数据写入RTC计数器,之后就是解码数据变成想要的日历。(使用AI生成代码,我快速阅读个大概,然后跑机修改)
3.再说一下阅读hal库RTC内部代码的一些结论:首先我发现进入MX_RTC_Init()初始化函数之后,它会自动地设置时间日期,每次上电都会跑到那个地方,于是在这里用了一个return退出了

image
其次就是我发现有一个函数没被“显示”调用,搞了半天才发现是在底层的时候通过回调函数调用了这个函数了,我就说怎么那么重要的使能PWR还有使能备份寄存器之类为什么就放哪儿不用。

image
然后说发现hal库的设置时间和日期的两个函数由猫腻,时间和日期的结构体进来之后都会经过校验,然后调用同一个函数写入RTC计数器。问题就在于RTC计数器只能接受一次的写入,
要么写时间,要么写日期,更离谱的是,我时间写不进去!(也没更多时间研究为啥写不进去了)
不管是先写时间在写日期,还是说先写日期在写时间,通过寄存器读出来的数值始终只有时间的,确实搞得我有点崩溃。然后尝试在豆包的帮助下用寄存器写入,
写完之后发现还是只有时间(可能这一次的试验hal库用得比较多?但是解锁写保护,然后寄存器写入数值之类的,总感觉流程也是对的啊)

image
image
总之最后发现之所以日期读不到就是因为存放日期的是一个存放在ram中的数据,上电就丢失,而时间则是存在了RTC计数器中,只要不去下后备电池,寄存器里的数据就不会丢失。
(顺便一提,寄存器就是:由晶体管组成特定的电路结构用于实现不同功能+锁存器两者结合起来的特殊存储单元,存储空间跟ram不同没有固定的位数,
所以你能看淡数据手册上不同的寄存器虽然都有32位或者共用32位,但是有些位是空的,无法使用,因为实际上就没有这个地址的锁存器啊!)
image
image
image
最后我是放弃了使用hal库现成的函数实现RTC了,因为我失败了一天半啊!然后使用了独立的日历转换函数,将总秒数转化为日历,读取出来。
这里是我工程的实现:https://gitee.com/liang-deping/restart-stm32/tree/780f1aca22158f07a1c55b848f497bee9251b9b4
最后的最后突然想到:使用hal库之所以失败,是因为即便想存入总秒数,它给出的两个函数也没用啊,时间存入前会校验,存不了那么大的总秒数,日期就更不用说了,它“好像”存不进RTC计数器。

posted @ 2026-04-02 15:58  青春猪头青年  阅读(4)  评论(0)    收藏  举报