如何在for循环中按索引切换预设的EEPROM校准地址
循环中动态切换EEPROM写入地址的实现方案
你当前定义的三个校准地址0x1E、0x22、0x26刚好间隔4字节,和你每次写入4字节的操作长度匹配,可通过以下两种方案实现地址随循环索引自动切换:
方案1:地址偏移宏(适用于地址连续等差场景)
直接把宏修改为计算式,无需改动循环逻辑:
// 起始地址为0x1E,每个校准参数占4字节地址空间 #define EEPROM_ADDRESS_cal(i) (0x1E + 4 * (i))
注意修正你代码里的宏名拼写错误:原代码中写的
EEPROM_ADRESS_cal少了一个字母D,正确拼写为ADDRESS,避免编译报错。
方案2:地址查找表(适用于地址不连续场景)
如果后续校准参数地址不是等差排列,可以预先把所有地址存入常量数组,循环时按索引读取:
// 按索引顺序填入对应的EEPROM校准地址 static const uint16_t eeprom_cal_addr_table[] = { EEPROM_ADDRESS_cal0, EEPROM_ADDRESS_cal1, EEPROM_ADDRESS_cal2, 0x2A, // 补全i=3对应的地址 0x2E // 补全i=4对应的地址 };
循环内的写入代码修改为:
mess.Stcal[i] = EEPROM_WRITE(eeprom_cal_addr_table[i], &mess.Stcal[i], 4);
注意事项
- 你当前代码中
EEPROM_WRITE每次写入4字节,请确认所用平台上double类型的长度是否为4字节。如果是8字节,需要把写入长度改为8,同时地址间隔调整为8,避免数据截断或地址冲突。 - 确保用到的EEPROM地址区间没有被其他功能占用,避免数据被覆盖。
内容的提问来源于stack exchange,提问作者Marc Hammer
相关产品推荐
相关产品推荐

