EasyFlash 里的 EF_WRITE_GRAN

Posted 快乐的老鼠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了EasyFlash 里的 EF_WRITE_GRAN相关的知识,希望对你有一定的参考价值。

EF_WRITE_GRAN 宏是啥意思? 我若使用 W25Q32 芯片, 我该配置成啥?

/* the flash write granularity, unit: bit
 * only support 1(nor flash)/ 8(stm32f4)/ 32(stm32f1) */
#define EF_WRITE_GRAN         1    /* @note you must define it for a value */


static size_t set_status(uint8_t status_table[], size_t status_num, size_t status_index)

    size_t byte_index = ~0UL;
    /*
     * | write garn |       status0       |       status1       |      status2         |
     * ---------------------------------------------------------------------------------
     * |    1bit    | 0xFF                | 0x7F                |  0x3F                |
     * |    8bit    | 0xFFFF              | 0x00FF              |  0x0000              |
     * |   32bit    | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF |  0x00FFFFFF 00FFFFFF |
     */
    memset(status_table, 0xFF, STATUS_TABLE_SIZE(status_num));
    if (status_index > 0) 
#if (EF_WRITE_GRAN == 1)
        byte_index = (status_index - 1) / 8;
        status_table[byte_index] &= ~(0x80 >> ((status_index - 1) % 8));
#else
        byte_index = (status_index - 1) * (EF_WRITE_GRAN / 8);
        status_table[byte_index] = 0x00;
#endif /* EF_WRITE_GRAN == 1 */
    

    return byte_index;

从这可以看出来, 若 EF_WRITE_GRAN 定义为 1 , 则表示最小改动为1bit;

flash一般有个特性, 可以将1写成0, 所以我们可以利用这个特性实现 "值和位表" 的转换

如代码区的注释表格里一样, 若写入颗粒是1bit, 则可以用一个字节表示8种状态.

 

假如我们定义有效数据的标记位0xEF89

当EF_WRITE_GRAN 为1, 可以定义脏数据为0xEF89;

当EF_WRITE_GRAN 为8, 可以定义脏数据为0xEF00;

经过我的测试W25Q32 这样的 SPI 存储器的写入颗粒可以是1bit.

记得STM32L1x系列写入颗粒是8, 其他单片机我都没怎么试过.

 

以上是关于EasyFlash 里的 EF_WRITE_GRAN的主要内容,如果未能解决你的问题,请参考以下文章

带你尝鲜LiteOS 组件EasyFlash

SFUD+FAL+EasyFlash典型场景需求分析,并记一次实操记录

码云最有价值开源项目:EasyFlash

EasyFlash 的使用感受

EasyFlash 的使用感受

EasyFlash V4.0 ENV 功能设计与实现