请教关于Fls写数据问题。
-
之前在z20上跑通过Fls +LittleFs文件系统。本以为移植过来很简单因为都是Fls。
移植过来后文件系统挂载不了,之后试跑官方Fls例程是可以的,再把例程移植到自己的工程后也是通的。
调试过程中有时候会出现连接错误:
size(block DATA_RAM_block) = 256 (0x100)
size(block DATA_RAM_rom_block) = 252 (0xfc)
查看论坛帖子后,把DATA_FLASH 和 DATA_RAM都改为aligned (8)后此现象消失,但文件系统还是不行。虽然例程是通的,但例程在擦除dflash扇区后,写操作数据量是0x800,即2048字节,如果改为32,128等数,写操作似乎是失效的,但读操作没有影响,或许这就是文件系统挂载失败的原因。烦请帮忙解决一下,谢谢了。
// step I :擦除一个扇区 Fls_Erase(0, 2048); do{ Fls_MainFunction(); } while (Fls_GetStatus() != MEMIF_IDLE); // step II: 写数据 for(LoopCnt= 0; LoopCnt< 0x800; LoopCnt++)Fls_WriteData[LoopCnt] = LoopCnt%0x100U; Fls_Write(128, Fls_WriteData, 32); do{ Fls_MainFunction(); } while (Fls_GetStatus() != MEMIF_IDLE); // step III:读数据 for(LoopCnt = 0; LoopCnt < 128; LoopCnt++) Fls_ReadData[LoopCnt] = 0; Fls_Read(128, Fls_ReadData, 32); do{ Fls_MainFunction(); } while (Fls_GetStatus() != MEMIF_IDLE);
-
应该是扇区擦不掉,所以write也不行。原代码是这样的:
static int32_t mflash_drv_sector_erase(uint32_t sector_addr) { // 扇区对齐 if (0 == mflash_drv_is_sector_aligned(sector_addr)){ while(1); } if(Fls_Erase(sector_addr, MFLASH_SECTOR_SIZE) != E_OK){ while(1); } while(MEMIF_IDLE != Fls_GetStatus()){ Fls_MainFunction(); } if(Fls_GetJobResult() != MEMIF_JOB_OK){ while(1); } return 0; }
但云图平台下调用Fls_GetJobResult()会失效。
-
Autosar的Fls模块将MCU的Fls抽象为逻辑sector, 从而操作理论上应该都按照逻辑sector的概念进行。
-
houjun_xiao 这里面提到的flash sector指的应该就是物理扇区,云途ic的dflash扇区固定是1K。不应该是YTC里面的FlsSector尺寸。
但实际上云途提供的Fls_Erase()必须按FlsSector尺寸进行擦除。结果就是为移植128KB文件系统,就需要用YTC手动创建128个1K字节的FlsSector
-
操作上有需求把多个物理sector抽象为一个逻辑的setor,那么理论上被抽象的这几个sector可以认为是一个逻辑整体,从而在被擦除的时候作为整体操作是否更方便管理一些。当然你提的这个sector的问题我再核对一下标准,后面可以根据标准进行处理。如果你现在需要按照物理sector长度擦除DFLASH,需要按照1k大小配置flash sector.
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...