zhxingyu 发表于 2022-10-10 10:11

HC32L136的flash读写问题

用到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();,读写都正常,都是跟着例程来的。 ...

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

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();读值才正常,试过多次。

zhxingyu 发表于 2022-10-10 14:25

wubangmi 发表于 2022-10-10 13:23
我在例程上加了点东西,完全没有你说的现象。
打印的数据很正确,就是我上次写进去的数据。
...

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

wubangmi 发表于 2022-10-10 16:29

zhxingyu 发表于 2022-10-10 14:25
如果把地址改一下,是否第一次正常,后面不正常?

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

BearSoldier 发表于 2022-10-10 21:59

上电启动后F lash读写操作前是需要初始化的,读写F lash之前有没有对Flash进行初始化?

martinhu 发表于 2022-10-11 19:51

Flash_LockAll()和Flash_UnlockAll()与读flash没有关系。读flash主要是看MCU系统主频,与flashwait cycle是否配置合适,不然执行指令的时候都有可能跑飞……

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操作相关的函数都是调用的库函数。

zhxingyu 发表于 2022-10-12 10:01

wubangmi 发表于 2022-10-12 08:58
你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的 ...

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

wubangmi 发表于 2022-10-12 10:52

zhxingyu 发表于 2022-10-12 10:01
试过,把Flash_LockAll()去掉,加flash初始化,一样的。

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

wubangmi 发表于 2022-10-12 10:53

zhxingyu 发表于 2022-10-12 10:01
试过,把Flash_LockAll()去掉,加flash初始化,一样的。

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

martinhu 发表于 2022-10-12 16:16

wubangmi 发表于 2022-10-12 08:58
你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的 ...
试过了,先读到数组里,再擦除和写入,没问题啊,用的也是2.0.0的库

wubangmi 发表于 2022-10-13 09:26

martinhu 发表于 2022-10-12 16:16
试过了,先读到数组里,再擦除和写入,没问题啊,用的也是2.0.0的库

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

tpgf 发表于 2022-11-1 14:57

对FLASH的读和写的操作,都必须在FLASH初始化之后

nawu 发表于 2022-11-1 15:12

楼主在初始化代码和对flash操作的顺序上感觉有问题

aoyi 发表于 2022-11-1 15:28

请注意flash的编程单位为 4bytes,擦除单位为 8Kbytes

zljiu 发表于 2022-11-1 15:55

读取数据的话 应该是什么时候都可以只不过我认为应该先初始化时钟 否则时序会不正常

gwsan 发表于 2022-11-1 16:40

如果第二次失败的话没有任何错误代码返回是吗
页: [1] 2
查看完整版本: HC32L136的flash读写问题