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