打印
[技术问答]

HC32L136的flash读写问题

[复制链接]
2104|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhxingyu|  楼主 | 2022-10-10 10:11 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
用到136的flash读写,上电就读flash,读之前一定要先解锁Flash_UnlockAll();,读完不能上锁,Flash_LockAll();如果执行上锁最后几个字节数据不对。如果读之前不解锁读到数据也不对。有时感觉数据第一次读写可以,第二次又不对了。地址为0x0000FE00,啥原因呢?

使用特权

评论回复
沙发
wubangmi| | 2022-10-10 10:47 | 只看该作者
我严重怀疑你代码搞错了,好好翻一下用户手册的FLASH章节,看对flash操作需要注意些什么。

使用特权

评论回复
板凳
zhxingyu|  楼主 | 2022-10-10 11:29 | 只看该作者
wubangmi 发表于 2022-10-10 10:47
我严重怀疑你代码搞错了,好好翻一下用户手册的FLASH章节,看对flash操作需要注意些什么。 ...

谢谢回复!读后如果不上锁Flash_LockAll();,读写都正常,都是跟着例程来的。

使用特权

评论回复
地板
wubangmi| | 2022-10-10 13:23 | 只看该作者
zhxingyu 发表于 2022-10-10 11:29
谢谢回复!读后如果不上锁Flash_LockAll();,读写都正常,都是跟着例程来的。 ...

我在例程上加了点东西,完全没有你说的现象。
打印的数据很正确,就是我上次写进去的数据。

1665379266641.jpg (385.82 KB )

1665379266641.jpg

使用特权

评论回复
5
zhxingyu|  楼主 | 2022-10-10 14:24 | 只看该作者
wubangmi 发表于 2022-10-10 13:23
我在例程上加了点东西,完全没有你说的现象。
打印的数据很正确,就是我上次写进去的数据。
...
void Read_EEPROM_StrData(uint32_t Addr,uint16_t Len,uint8_t *Dat)
{
                uint16_t i;
       
                Flash_UnlockAll();
                for(i=0;i<Len;i++)
                {
                                *Dat = *((volatile uint8_t*)(Addr+i));
                                Dat ++;
                }
                //Flash_LockAll();
}

需要加入Flash_UnlockAll();读值才正常,试过多次。

使用特权

评论回复
6
zhxingyu|  楼主 | 2022-10-10 14:25 | 只看该作者
wubangmi 发表于 2022-10-10 13:23
我在例程上加了点东西,完全没有你说的现象。
打印的数据很正确,就是我上次写进去的数据。
...

如果把地址改一下,是否第一次正常,后面不正常?

使用特权

评论回复
7
wubangmi| | 2022-10-10 16:29 | 只看该作者
zhxingyu 发表于 2022-10-10 14:25
如果把地址改一下,是否第一次正常,后面不正常?

好像是有问题,对FLASH的读和写的操作,都必须在FLASH初始化之后。
直接上来就读FLASH,接下去哪怕正常操作,FLASH都写不成功。

使用特权

评论回复
8
BearSoldier| | 2022-10-10 21:59 | 只看该作者
上电启动后F lash读写操作前是需要初始化的,读写F lash之前有没有对Flash进行初始化?

使用特权

评论回复
9
martinhu| | 2022-10-11 19:51 | 只看该作者
Flash_LockAll()和Flash_UnlockAll()与读flash没有关系。读flash主要是看MCU系统主频,与flashwait cycle是否配置合适,不然执行指令的时候都有可能跑飞……

使用特权

评论回复
10
wubangmi| | 2022-10-12 08:58 | 只看该作者
martinhu 发表于 2022-10-11 19:51
Flash_LockAll()和Flash_UnlockAll()与读flash没有关系。读flash主要是看MCU系统主频,与flashwait cycle是 ...

你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的初始化FLASH,写FLASH,没有写成功。

main函数初始化flash后,能正常的写。
以上所有跟FLASH操作相关的函数都是调用的库函数。

使用特权

评论回复
11
zhxingyu|  楼主 | 2022-10-12 10:01 | 只看该作者
wubangmi 发表于 2022-10-12 08:58
你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的 ...

试过,把Flash_LockAll()去掉,加flash初始化,一样的。

使用特权

评论回复
12
wubangmi| | 2022-10-12 10:52 | 只看该作者
zhxingyu 发表于 2022-10-12 10:01
试过,把Flash_LockAll()去掉,加flash初始化,一样的。

换新的库吧,2.1.0
或者是老的1.9.2,这两个库都没问题,刚好是2.0.0的库会出现这个问题

使用特权

评论回复
13
wubangmi| | 2022-10-12 10:53 | 只看该作者
zhxingyu 发表于 2022-10-12 10:01
试过,把Flash_LockAll()去掉,加flash初始化,一样的。

换新的库吧,2.1.0
或者是老的1.9.2,这两个库都没问题,刚好是2.0.0的库会出现这个问题

使用特权

评论回复
14
martinhu| | 2022-10-12 16:16 | 只看该作者
wubangmi 发表于 2022-10-12 08:58
你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的 ...

试过了,先读到数组里,再擦除和写入,没问题啊,用的也是2.0.0的库

使用特权

评论回复
15
wubangmi| | 2022-10-13 09:26 | 只看该作者
martinhu 发表于 2022-10-12 16:16
试过了,先读到数组里,再擦除和写入,没问题啊,用的也是2.0.0的库

我写的测试代码跟你的这个有一个地方不同,就是我第一次写的时候没有擦。
读完后初始化直接写,没写成功。我还核对过库函数,1.9.2和2.0.0是一样的。
不知道是不是我系统的问题,我用的是虚拟机装的keil。另外,你仿真之前试试把flash全擦一遍掉电后重新上电仿真,会不会出现写不成功的现象。

1665624088106.jpg (258.75 KB )

1665624088106.jpg

使用特权

评论回复
16
tpgf| | 2022-11-1 14:57 | 只看该作者
对FLASH的读和写的操作,都必须在FLASH初始化之后

使用特权

评论回复
17
nawu| | 2022-11-1 15:12 | 只看该作者
楼主在初始化代码和对flash操作的顺序上感觉有问题

使用特权

评论回复
18
aoyi| | 2022-11-1 15:28 | 只看该作者
请注意flash的编程单位为 4bytes,擦除单位为 8Kbytes

使用特权

评论回复
19
zljiu| | 2022-11-1 15:55 | 只看该作者
读取数据的话 应该是什么时候都可以  只不过我认为应该先初始化时钟 否则时序会不正常

使用特权

评论回复
20
gwsan| | 2022-11-1 16:40 | 只看该作者
如果第二次失败的话  没有任何错误代码返回是吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

69

主题

309

帖子

3

粉丝