• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

【每日一坑】万恶的F1,不带完整RTC日历功能的STM32.弃之可惜。。。用之。。。

开个帖子讲下基于cube生成的RTC功能,到底有多坑。。。。(仅限F1系列吐槽。。。他弟弟F0都比他强。。。)

其实用CUBE最主要是就是为了省事省心,配置起来,谁知还是有不省心的存在。。。

对于RTC功能或者大部分的其它功能,三步走足以解决,初始化配置,读写等一系列操作,就完活了,最初我也是这么想的,配置好RTC点击生成工程,硬件开启掉电记忆功能,其实就是加个电池(文明人。。。说得好听点。。。)

接下来神一般的操作来了,上电,调用写入时间和写入日期功能。。。然后关掉电源,上电复位。。。

时间还在。。。日期呢。。。。为毛没有了。。。。不会这么奇葩吧,是不是我没配置对,或者调用好呢。。。。思考中。。。算了问度娘。。。

果然不止我独一份。。。

那么别怪我了。。。开始把hal库翻了个底朝天,真相也大白了。。。其实hal有很多不可取的做法,不是因为他想脱裤子放屁。。。而是要兼容一整个家族看起来整齐所致。。。有时候看着就是两头误导,还是仔细比照。。。

图。。。不知道为啥每次我都不能做到文图并茂,只能留给楼下了,先说结论吧。。。

记住了。。。F1系列只有时间掉电记忆。。。没有日期掉电记忆。。。(重要的事情不说三遍了,看底下图就清楚明了了。。。)

想要万年历的筒子们,自己转存一下日期数据吧,或者换个系列,据说F0都OK、、、但没用过,只能是根据大神说了。。。

全部回复(8)
正序查看
倒序查看
2018-05-22 13:40
准备上图。。。
0
回复
2018-05-22 13:42
@程序小白
准备上图。。。

问题的确是存在的,谁用谁知道。。。

0
回复
2018-05-22 13:45
@程序小白
[图片]问题的确是存在的,谁用谁知道。。。

BKP功能 在线仿真正常。。。但是里面有个日期的掉电复位。。。所以本能的以为这也是非掉电记忆。。。

0
回复
2018-05-22 13:49
@程序小白
[图片]BKP功能在线仿真正常。。。但是里面有个日期的掉电复位。。。所以本能的以为这也是非掉电记忆。。。

RTC的初始化函数把本质暴露了,没有任何条件锁定的情况下,初始化就把日期给初始化了,也就是说他真的不带记忆功能,一上电就回到两千年其实在这里。

0
回复
2018-05-22 13:57
@程序小白
[图片]RTC的初始化函数把本质暴露了,没有任何条件锁定的情况下,初始化就把日期给初始化了,也就是说他真的不带记忆功能,一上电就回到两千年其实在这里。

真正核心的来自于这里,这个是设置日期函数的内部说明,在设置日期的时候,读了一下counter,这个才是真正掉电存储的大BOSS,然后转化成小时,看看超过没超过24小时(也就是一天)。如果超过一天了就把超过的天数从counter中减掉,然后把counter写入到真正要记忆的地方,也就是说实际掉电存储没有以天为单位日期的存在。

0
回复
2018-05-23 13:56
果然是有点坑呢!使用F1系列的朋友注意点吧
0
回复
尤小翠
LV.7
8
2018-05-23 18:34

STM32官方HAL这种东西如果使用不当会很麻烦。

窝这边遇到的问题是HAL太占地方了,而且包装太好了一眼看不出底层怎么工作的。

1. GPIO的初始化

HAL_GPIO_Init这个一次能初始化多个脚,请看它的实现,内部可是用循环把一组GPIO里所有脚都走了一边,不管你是不是要初始化这个脚!在单片机启动的时候初始化引脚设定功能肯定没问题,但是有些情况下如果需要切换引脚功能,这个就太慢了,这时候就需要手动寄存器操作。另外切换引脚的时候寄存器操作的顺序一定要注意,否则可能产生Glitch,也就是短时间的无效状态或者不期望的输出。

2. ADC

HAL的ADC部分实在太复杂了,使用它需要使用者自己保存一份ADC的全局结构体,这里面保存了ADC的初始化参数,每个通道的参数,还有一些DMA相关的状态机什么的。如果我只是用单次采样,那这个结构体太重量了,而且初始化的参数留着干啥,不都进寄存器里了么。这个是STM32F030上,每一字节ram和rom都很珍贵。所以果断换LL也就是底层库,这个跟之前的STD库很接近,只不过很多函数都变成了宏和static inline,前者都会被编译器展开,后者在开优化情况下大概率也展开,节省了函数调用时压栈出栈的时间。 ADC的LL库比HAL库少用500字节内存,2k的ROM,这对F7可能不算什么,但是在F030上可就是要命的。

3. STDLIB / NEWLIB

这个不是STM32官方的库,是GCC那边的,我想说,最好别用,除非是比较高级的STM32,因为一行printf占地方24k!想想咱们也不需要多华丽的文本格式化所以还是可以舍弃的。单片机和pc编程还是需要有些不同的考虑的

4. Cubemx

CubeMx很好,但是HAL的例子少了点,刚上手的时候很懵逼

0
回复
2018-05-25 12:34
@尤小翠
STM32官方HAL这种东西如果使用不当会很麻烦。窝这边遇到的问题是HAL太占地方了,而且包装太好了一眼看不出底层怎么工作的。1.GPIO的初始化HAL_GPIO_Init这个一次能初始化多个脚,请看它的实现,内部可是用循环把一组GPIO里所有脚都走了一边,不管你是不是要初始化这个脚!在单片机启动的时候初始化引脚设定功能肯定没问题,但是有些情况下如果需要切换引脚功能,这个就太慢了,这时候就需要手动寄存器操作。另外切换引脚的时候寄存器操作的顺序一定要注意,否则可能产生Glitch,也就是短时间的无效状态或者不期望的输出。2.ADCHAL的ADC部分实在太复杂了,使用它需要使用者自己保存一份ADC的全局结构体,这里面保存了ADC的初始化参数,每个通道的参数,还有一些DMA相关的状态机什么的。如果我只是用单次采样,那这个结构体太重量了,而且初始化的参数留着干啥,不都进寄存器里了么。这个是STM32F030上,每一字节ram和rom都很珍贵。所以果断换LL也就是底层库,这个跟之前的STD库很接近,只不过很多函数都变成了宏和staticinline,前者都会被编译器展开,后者在开优化情况下大概率也展开,节省了函数调用时压栈出栈的时间。ADC的LL库比HAL库少用500字节内存,2k的ROM,这对F7可能不算什么,但是在F030上可就是要命的。3.STDLIB/NEWLIB这个不是STM32官方的库,是GCC那边的,我想说,最好别用,除非是比较高级的STM32,因为一行printf占地方24k!想想咱们也不需要多华丽的文本格式化所以还是可以舍弃的。单片机和pc编程还是需要有些不同的考虑的4.CubemxCubeMx很好,但是HAL的例子少了点,刚上手的时候很懵逼

首先用时钟的话就不要用stm32的内部RTC,就用外部时钟芯片,精度高

HAL库是把标准库给封装了,移植性很高,

0
回复