HC32L136的flash读写问题
用到136的flash读写,上电就读flash,读之前一定要先解锁Flash_UnlockAll();,读完不能上锁,Flash_LockAll();如果执行上锁最后几个字节数据不对。如果读之前不解锁读到数据也不对。有时感觉数据第一次读写可以,第二次又不对了。地址为0x0000FE00,啥原因呢?我严重怀疑你代码搞错了,好好翻一下用户手册的FLASH章节,看对flash操作需要注意些什么。 wubangmi 发表于 2022-10-10 10:47
我严重怀疑你代码搞错了,好好翻一下用户手册的FLASH章节,看对flash操作需要注意些什么。 ...
谢谢回复!读后如果不上锁Flash_LockAll();,读写都正常,都是跟着例程来的。 zhxingyu 发表于 2022-10-10 11:29
谢谢回复!读后如果不上锁Flash_LockAll();,读写都正常,都是跟着例程来的。 ...
我在例程上加了点东西,完全没有你说的现象。
打印的数据很正确,就是我上次写进去的数据。
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();读值才正常,试过多次。 wubangmi 发表于 2022-10-10 13:23
我在例程上加了点东西,完全没有你说的现象。
打印的数据很正确,就是我上次写进去的数据。
...
如果把地址改一下,是否第一次正常,后面不正常? zhxingyu 发表于 2022-10-10 14:25
如果把地址改一下,是否第一次正常,后面不正常?
好像是有问题,对FLASH的读和写的操作,都必须在FLASH初始化之后。
直接上来就读FLASH,接下去哪怕正常操作,FLASH都写不成功。 上电启动后F lash读写操作前是需要初始化的,读写F lash之前有没有对Flash进行初始化? Flash_LockAll()和Flash_UnlockAll()与读flash没有关系。读flash主要是看MCU系统主频,与flashwait cycle是否配置合适,不然执行指令的时候都有可能跑飞…… martinhu 发表于 2022-10-11 19:51
Flash_LockAll()和Flash_UnlockAll()与读flash没有关系。读flash主要是看MCU系统主频,与flashwait cycle是 ...
你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的初始化FLASH,写FLASH,没有写成功。
main函数初始化flash后,能正常的写。
以上所有跟FLASH操作相关的函数都是调用的库函数。 wubangmi 发表于 2022-10-12 08:58
你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的 ...
试过,把Flash_LockAll()去掉,加flash初始化,一样的。 zhxingyu 发表于 2022-10-12 10:01
试过,把Flash_LockAll()去掉,加flash初始化,一样的。
换新的库吧,2.1.0
或者是老的1.9.2,这两个库都没问题,刚好是2.0.0的库会出现这个问题 zhxingyu 发表于 2022-10-12 10:01
试过,把Flash_LockAll()去掉,加flash初始化,一样的。
换新的库吧,2.1.0
或者是老的1.9.2,这两个库都没问题,刚好是2.0.0的库会出现这个问题 wubangmi 发表于 2022-10-12 08:58
你可以试一下,默认的4M主频,启动前已经加载过4M主频了,main函数一上来就读FLASH地址的值,然后正常的 ...
试过了,先读到数组里,再擦除和写入,没问题啊,用的也是2.0.0的库
martinhu 发表于 2022-10-12 16:16
试过了,先读到数组里,再擦除和写入,没问题啊,用的也是2.0.0的库
我写的测试代码跟你的这个有一个地方不同,就是我第一次写的时候没有擦。
读完后初始化直接写,没写成功。我还核对过库函数,1.9.2和2.0.0是一样的。
不知道是不是我系统的问题,我用的是虚拟机装的keil。另外,你仿真之前试试把flash全擦一遍掉电后重新上电仿真,会不会出现写不成功的现象。
对FLASH的读和写的操作,都必须在FLASH初始化之后 楼主在初始化代码和对flash操作的顺序上感觉有问题 请注意flash的编程单位为 4bytes,擦除单位为 8Kbytes 读取数据的话 应该是什么时候都可以只不过我认为应该先初始化时钟 否则时序会不正常 如果第二次失败的话没有任何错误代码返回是吗
页:
[1]
2