FAL

关于easyflash4.0的写入和读取norflash一些疑惑咨询

发布于 2019-03-01 16:30:34
    本帖最后由 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。

以上,存在此问题,如有知道的朋友麻烦帮你看一下,感谢!



正常图片.jpg
出错图片.jpg

查看更多

关注者
0
被浏览
1.1k
0 个回答
暂无答案,快来添加答案吧

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友