EasyFlash 里的 EF_WRITE_GRAN

本文介绍了SPI存储器W25Q32的写入颗粒特性,特别是关于EF_WRITE_GRAN宏的配置。该宏定义了写入的粒度,当设置为1时表示最小改动为1bit,而设置为8则表示每次写入8位。通过示例代码展示了不同配置下如何更新数据状态,并提到了STM32L1x系列的写入颗粒为8bit。测试表明W25Q32芯片支持1bit的写入颗粒。
摘要由CSDN通过智能技术生成

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, 其他单片机我都没怎么试过.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值