本帖最后由 Sanjay_Wu 于 2019-3-1 16:48 编辑
最近学习easyflash,在移植到stm32的时候存在一些问题和疑惑:
1、使用fal实现easyflash对flash的读写函数,easyflash对flash的写入和读取要求最小单位为4个字节。
2、参考iot_board的easyflash例程代码,移植ef_fal_port.c的flash读取和写入函数:
/**
* Read data from flash.
* @note This operation's units is word.
*
* @param addr flash address
* @param buf buffer to store read data
* @param size read bytes size
*
* @return result
*/
EfErrCode ef_port_read(uint32_t addr, uint32_t *buf, size_t size) {
EfErrCode result = EF_NO_ERR;
EF_ASSERT(size % 4 == 0);
fal_partition_read(part, addr, (uint8_t *)buf, size);
return result;
}
/**
* Erase data on flash.
* @note This operation is irreversible.
* @note This operation's units is different which on many chips.
*
* @param addr flash address
* @param size erase bytes size
*
* @return result
*/
EfErrCode ef_port_erase(uint32_t addr, size_t size) {
EfErrCode result = EF_NO_ERR;
/* make sure the start address is a multiple of FLASH_ERASE_MIN_SIZE */
EF_ASSERT(addr % EF_ERASE_MIN_SIZE == 0);
if (fal_partition_erase(part, addr, size) < 0)
{
result = EF_ERASE_ERR;
}
return result;
}
/**
* Write data to flash.
* @note This operation's units is word.
* @note This operation must after erase. @see flash_erase.
*
* @param addr flash address
* @param buf the write data buffer
* @param size write bytes size
*
* @return result
*/
EfErrCode ef_port_write(uint32_t addr, const uint32_t *buf, size_t size) {
EfErrCode result = EF_NO_ERR;
EF_ASSERT(size % 4 == 0);
if (fal_partition_write(part, addr, (uint8_t *)buf, size) < 0)
{
result = EF_WRITE_ERR;
}
return result;
}
上述函数知,在代码做了一些判断:
EF_ASSERT(size % 4 == 0); 如果写入或读取不是4个字节为单位的话则会断言报错。
3、easyflash对于norflash(SPI-Flash)的写入粒度是1bit,擦除粒度是4K,我在ef_cfg.h定义如下:
/* the minimum size of flash erasure */
#define EF_ERASE_MIN_SIZE (4 * 1024) /* 对于norflash,擦除粒度为4K */
/* the flash write granularity, unit: bit
* only support 1(nor flash)/ 8(stm32f4)/ 32(stm32f1)/ 64(stm32l4) */
#define EF_WRITE_GRAN (1)
/* backup area start address */
#define EF_START_ADDR 0x00000000
/* ENV area size. It's at least one empty sector for GC. So it's definination must more then or equal 2 flash sector size. */
#define ENV_AREA_SIZE (2 * EF_ERASE_MIN_SIZE)
4、问题:
(1)、在移植编译下载后,easyflash初始化成功,但是在setenv的时候存在问题,也就是断言在写入的最小不是4字节:
(2)
如果把读写的函数里面的EF_ASSERT(size % 4 == 0);注释掉,就能够setenv,printenv等操作。我用的norflash使用的是w25q128。
以上,存在此问题,如有知道的朋友麻烦帮你看一下,感谢!
查看更多