OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1965|回复: 3

潘多拉L475板的FLASH模拟EEPROM例程是不是代码写错了?使用时发现两个位置有问题,坑啊

[复制链接]

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
发表于 2019-10-16 09:10:12 | 显示全部楼层 |阅读模式
1金钱
第一个问题,例程里原有的是对TEXT_Buffer进行写和读,看着没问题,但是新加一个TEXT_Buffer2,发现没法对TEXT_Buffer2进行写操作,直接就会卡死在一个64位的赋值代码里:STMFLASH_BUF[i + secoff] = pBuffer[i];,注意这里并不是卡死在flash读写中,而是单纯卡死在64位数据的赋值中(因为我把所有flash读写代码都删了试的)。
折腾两天后发现:若TEXT_Buffer2为全局变量,只有当数据长度为4的倍数时才能读写;若TEXT_Buffer2为局部变量,则都可以进行读写。再找手册里写的,对flash操作必须是4字节对齐的。于是把全局变量的TEXT_Buffer2改为__align(4) TEXT_Buffer2就好使了。
所有第一个问题是例程的代码里少添了一个四字节对齐吗?另外我是不是可以这么理解?:当为全局变量时,数据等于是存在flash中的,所以所有数据必须按照flash要求的四字节对齐,而局部变量是临时申请了一块堆,是不需要像在flash里一样四字节对齐的。这么理解对吗?

第二个问题,main函数中字义了u8 datatemp[SIZE];其中SIZE为3,而这个变量用在了STMFLASH_Read(FLASH_SAVE_ADDR, (u32*)datatemp, SIZE * 2);,这显然是不对的吧?把一个u8的长度为3的数组,强转成了32位,还要在里面读出来18个字节,这啥情况呀?例程代码跑起来竟然是可以用的,想不明白这里的逻辑。随后我自己移了一个操作系统的代码,发现能读出来数据,但是会莫名其妙地崩溃,没找到崩溃原理和位置,但如果把u8 datatemp[SIZE];改为u8 datatemp[SIZE*8];或u64 datatemp[SIZE];就不会再崩了。所以我觉得例程中的写法是错的,可能能用,但是一定是自己没开那么大的空间(一共才开了3字节),就占别人的空间了(占了18个字节)。
所以这里是变量定义有误吗?

最佳答案

查看完整内容[请看2#楼]

测试完成,结果说一下,对新手有点儿用: 1、对于第一个问题,我的想法已经验证是对的,代码里就是需要加一个四字节对齐 2、对于第二个问题,代码肯定是错的。改成u8 datatemp;或u64 datatemp;就对了,只不过这套代码里只读写了一个数据,看不出来错,多打几个数据的话就会看到,第一个数组已经占用了第二个数组的空间。 3、对于局部变量,应该是存储空间是连续的,且是自动四字节对齐的。对于全局变量,其存储空间不连续,且不 ...
自在随心
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

84

主题

766

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2775
金钱
2775
注册时间
2015-6-1
在线时间
394 小时
 楼主| 发表于 2019-10-16 09:10:13 | 显示全部楼层
本帖最后由 yuzeyuan1 于 2019-10-17 17:09 编辑

测试完成,结果说一下,对新手有点儿用:
1、对于第一个问题,我的想法已经验证是对的,代码里就是需要加一个四字节对齐
2、对于第二个问题,代码肯定是错的。改成u8 datatemp[SIZE*8];或u64 datatemp[SIZE];就对了,只不过这套代码里只读写了一个数据,看不出来错,多打几个数据的话就会看到,第一个数组已经占用了第二个数组的空间。
3、对于局部变量,应该是存储空间是连续的,且是自动四字节对齐的。对于全局变量,其存储空间不连续,且不是四字节对齐,所以全局变量进flash后代码会崩,而局部变量就可以正常读写flash
4、新增问题3:FLASH有个ECCD检测,详见http://www.stmcu.org.cn/module/forum/thread-617281-1-1.html,解释一下就是,如果整页都是空的,那就可以直接写入数据,如果要写的部分空间是空的,但这个页中的其它部分有数据,则必须强制擦除整页,再写入数据。
链接中的贴子上写的:在对 flash 连续写的过程,ECC 纠错检查会开启,如果这个时候,你往已经写过的区块更新数据(不擦除,再次写),就会触发ECC错误。我是这么理解的,因为 ECC 想帮你纠错,但这又是你主观上的操作,且ECC 监测到错误超过了2个,无法完成纠错,就上报了异常。要想避免 ECCD 错误,就严格遵守 先擦后写 的原则。
自在随心
回复

使用道具 举报

7

主题

163

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2762
金钱
2762
注册时间
2017-5-17
在线时间
430 小时
发表于 2019-10-17 20:41:16 | 显示全部楼层
你好,STM32L4的FLASH驱动确实有点问题,我这边解决好后,再把问题反馈给你。
回复

使用道具 举报

7

主题

163

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2762
金钱
2762
注册时间
2017-5-17
在线时间
430 小时
发表于 2019-11-8 22:14:44 | 显示全部楼层
你好,今天抽时间改了一下STM32L4的FLASH驱动,之前的底层驱动确实有很多问题,可以看一下这个最新的驱动代码,当然例程中的其他FLASH相关驱动都需要改一下。    附件中包含了最新的代码,你可以再测试一下。

实验24 FLASH模拟EEPROM实验.rar

1.75 MB, 下载次数: 26

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-26 08:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表