您好, 登录| 注册|
论坛导航
您好, 登录| 注册|
子站:
商城:
论坛首页    单片机MCU/嵌入式
  •  发帖
  • 收藏

【每日一坑】万恶的F1,不带完整RTC日历功能的STM32.弃之可惜。。。用之。。。
阅读: 1565 |  回复: 8 楼层直达

2018/05/22 13:39:52
1
s453208[版主]
电源币:1614 | 积分:98 主题帖:35 | 回复帖:107
LV6
团长

QQ截图20160321155901  18号AM:10:00  电源网资深荣誉版主 sometimes与萧山老寿与您相约直播间!约起来!

QQ截图20160321155901  玩大发了! 英飞凌最新无人机套件LARIX免费试用 招募中



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

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

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

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

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

果然不止我独一份。。。

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

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

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

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

标签 STM32 MCU
2018/05/22 13:40:09
2
s453208[版主]
电源币:1614 | 积分:98 主题帖:35 | 回复帖:107
LV6
团长
准备上图。。。
2018/05/22 13:42:33
3
s453208[版主]
电源币:1614 | 积分:98 主题帖:35 | 回复帖:107
LV6
团长

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

2018/05/22 13:45:32
4
s453208[版主]
电源币:1614 | 积分:98 主题帖:35 | 回复帖:107
LV6
团长

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

2018/05/22 13:49:10
5
s453208[版主]
电源币:1614 | 积分:98 主题帖:35 | 回复帖:107
LV6
团长

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

2018/05/22 13:57:38
6
s453208[版主]
电源币:1614 | 积分:98 主题帖:35 | 回复帖:107
LV6
团长

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

2018/05/23 13:56:57
7
电源网-璐璐
电源币:1090 | 积分:67 主题帖:189 | 回复帖:1414
LV10
司令
果然是有点坑呢!使用F1系列的朋友注意点吧
2018/05/23 18:34:57
8
尤小翠
电源币:31 | 积分:12 主题帖:36 | 回复帖:155
LV7
旅长

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的例子少了点,刚上手的时候很懵逼

2018/05/25 12:34:28
9
lihui710884923[实习版主]
电源币:443 | 积分:3 主题帖:134 | 回复帖:412
LV8
师长

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

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

关注我们
新浪微博
官方Q群
客服热线
服务时间:周一至周五9:00-18:00
微信关注
免费技术研讨会
获取一手干货分享

互联网违法不良信息举报

Reporting Internet Illegal and Bad Information
editor@netbroad.com
022-58392381