twodiamond 发表于 2021-9-9 15:02:55

H743片内NAND擦除和写入需要的时间

请教:
H743主频480MHz,FLASH 使用4个clock延时。测试发现:
1、擦除1个sect,时间为1us(有效内容32字节);
2、调用HAL_FLASH_Program写入32个字节,时间将近1s,太不可思议了,这样如果写入128K,得多长时间呀。

是有没有注意到的什么地方吗(没有使用DCACHE)。

谢谢!

eric2013 发表于 2021-9-9 15:27:31

楼主的是内部Flash吗,自动的那个2MBFlash。
1、这个Flash不是NAND型的,应该属于NOR型的。
2.内部Flash的的扇区大小固定是128KB,你1us是绝对擦除不完的。
3.HAL_FLASH_Program写入32个字节,时间将近1s就更加诡异了。

我建议楼主使用下载器使用MDK,IAR等给你的板子下载几次不同大小的程序,就对这个有个全面的认识了。

另外楼主可以参考下我的这个例子,内部Flash模拟EEPROM的。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980



twodiamond 发表于 2021-9-9 15:35:24

eric2013 发表于 2021-9-9 15:27
楼主的是内部Flash吗,自动的那个2MBFlash。
1、这个Flash不是NAND型的,应该属于NOR型的。
2.内部Fl ...

多谢硬汉!!!
说错了,是内部NOR FLASH(128K)

我用I/O口翻转来测量一个SECT擦除和写入的时间。每次都是先擦除(里面只有上次写入的32个字节),然后写入32个字节,发现擦除只需不到1us(不知是否同有效数据有关),但是写入的确花费1s(HAL_FLASH_Program)。

不知道是不是哪里用得不对?


twodiamond 发表于 2021-9-9 15:36:36

eric2013 发表于 2021-9-9 15:27
楼主的是内部Flash吗,自动的那个2MBFlash。
1、这个Flash不是NAND型的,应该属于NOR型的。
2.内部Fl ...

代码在BANK2运行,擦除BANK1的一个SECT,并写入32个字节

谢谢!

eric2013 发表于 2021-9-9 16:46:37

twodiamond 发表于 2021-9-9 15:35
多谢硬汉!!!
说错了,是内部NOR FLASH(128K)



擦除并写入的话,1s还可以理解。

不能往固定地址写入,你要考虑地址递增,用满128KB了再考虑擦除。

twodiamond 发表于 2021-9-9 16:51:09

eric2013 发表于 2021-9-9 16:46
擦除并写入的话,1s还可以理解。

不能往固定地址写入,你要考虑地址递增,用满128KB了再考虑擦除。

只调用一次HAL_FLASH_Program写入32个字节,需要耗费1s,感觉不可接受呀,用JLINK烧录整个code(100K)都很快的。

硬汉你们有测试过吗?
谢谢!

eric2013 发表于 2021-9-9 17:02:46

twodiamond 发表于 2021-9-9 16:51
只调用一次HAL_FLASH_Program写入32个字节,需要耗费1s,感觉不可接受呀,用JLINK烧录整个code(100K)都 ...

你的描述有问题,你到底是调用HAL_FLASH_Program就需要1s,还是调用SECT擦除再调用HAL_FLASH_Program的总时间是1s,

如果你是仅仅调用HAL_FLASH_Program就是1s显然是不正常。
如果你是擦除1个128KB sect再调用HAL_FLASH_Program,这个是1s,完全正常啊。本身擦除1个sect就需要1s左右。


特别注意一点,你擦除一个1个sect后,首地址写入32字节,然后偏移32字节地址后,再写32字节时是不需要再次擦除的,你是不是这个点没有理解对,我感觉你是这个地方里面偏差了。

twodiamond 发表于 2021-9-9 17:13:32

eric2013 发表于 2021-9-9 17:02
你的描述有问题,你到底是调用HAL_FLASH_Program就需要1s,还是调用SECT擦除再调用HAL_FLASH_Program的总 ...

代码这样的:
      //擦除1个SECT
SetIoOutput(0,0);//io0 输出0电平
        HAL_FLASH_Unlock();
        FLASH_Erase_Sector(FLASH_SECTOR_2, FLASH_BANK_1, VOLTAGE_RANGE_3);
        HAL_FLASH_Lock();
SetIoOutput(0,1);//io0 输出1电平

       //写入32个字节
SetIoOutput(1,0);//io1 输出0电平
        HAL_FLASH_Unlock();
        HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD, writeAddr, (uint32_t)pData);
        HAL_FLASH_Lock();
SetIoOutput(1,1);//io1 输出1电平

用示波器测量发现:
io0 的负脉冲为1us- 表示擦除为1us
io1的负脉冲为1s - 表示写入32个字节为1s

可以这样理解不?
谢谢!

eric2013 发表于 2021-9-9 18:02:47

你这个已经完全异常了,我的测试。

twodiamond 发表于 2021-9-10 15:12:46

eric2013 发表于 2021-9-9 18:02
你这个已经完全异常了,我的测试。

请问硬汉,你的写入函数也是HAL_FLASH_Program吗?
我可以跑一下你的测试工程不?

谢谢!!!

eric2013 发表于 2021-9-10 16:21:04

twodiamond 发表于 2021-9-10 15:12
请问硬汉,你的写入函数也是HAL_FLASH_Program吗?
我可以跑一下你的测试工程不?



就是二楼发你的例子。

twodiamond 发表于 2021-9-10 16:59:01

eric2013 发表于 2021-9-10 16:21
就是二楼发你的例子。

感谢!!!

SRIlyy 发表于 2024-3-30 11:33:07

eric2013 发表于 2021-9-9 18:02
你这个已经完全异常了,我的测试。

硬汉哥您好,针对这个擦除问题,我发现每次擦除用时不同,最大相差60ms,想请教一下您那边测试也会出现这么大时间差么?

eric2013 发表于 2024-4-1 08:21:04

SRIlyy 发表于 2024-3-30 11:33
硬汉哥您好,针对这个擦除问题,我发现每次擦除用时不同,最大相差60ms,想请教一下您那边测试也会出现这 ...

60ms不大,这个属于正常。
页: [1]
查看完整版本: H743片内NAND擦除和写入需要的时间