从 EEPROM 读取
Reading from EEPROM
假设我有 3 个向量:
int16_t v1[8];
int16_t v2[8];
int16_t v3[8];
int8_t lock = 0;
我想将数组的值保存在EEPROM中。为此,这是我所做的:
int i = 0;
uint16_t * j = (uint16_t*) 2 ;
short ratio=0;
for ( i =0; i<8;i++){
v1[i] = 22500;
v2[i] = 10500;
v3[i] = 20888;
}
我想保存如下值:
// .startat at the 3rd byte
// v1[0]v2[0]v3[0]v1[1]v2[1]v3[1] ----------> v1[7]v2[7]v3[7]
for ( i = 0 ; i <8; i++ ){
//printf("j = %d \n",j);
eeprom_update_word (j++, v1[i]);
eeprom_update_word (j++, v2[i]);
eeprom_update_word (j++, v3[i]);
}
为了检查值是否正确保存,我尝试将它们打印出来:
for (i=1; i < 26;i++ ){
ratio =(short)eeprom_read_word((uint8_t*)i);
printf(" WORD %d %d \n", i,ratio);
}
而且我真的不明白输出结果:
WORD 1 -7168
WORD 2 22500
WORD 3 1111
WORD 4 10500
WORD 5 -26583
WORD 6 20888
WORD 7 -7087
WORD 8 22500
WORD 9 1111
WORD 10 10500
WORD 11 -26583
WORD 12 20888
WORD 13 -7087
WORD 14 22500
WORD 15 1111
WORD 16 10500
WORD 17 -26583
WORD 18 20888
WORD 19 -7087
WORD 20 22500
WORD 21 1111
WORD 22 10500
WORD 23 -26583
WORD 24 20888
WORD 25 -7087
知道如何以正确的方式获得它吗?
我扩展了 for 循环,输出看起来只对了一半! ! :
WORD 1 -7168
WORD 2 22500
WORD 3 -4009
WORD 4 22000
WORD 5 9813
WORD 6 21030
WORD 7 -7086
WORD 8 22500
WORD 9 -4009
WORD 10 22000
WORD 11 9813
WORD 12 21030
WORD 13 -7086
WORD 14 22500
WORD 15 -4009
WORD 16 22000
WORD 17 9813
WORD 18 21030
WORD 19 -7086
WORD 20 22500
WORD 21 -4009
WORD 22 22000
WORD 23 9813
WORD 24 21030
WORD 25 -7086
WORD 26 22500
WORD 27 -4009
WORD 28 22000
WORD 29 9813
WORD 30 21030
WORD 31 -7086
WORD 32 22500
WORD 33 -4009
WORD 34 22000
WORD 35 9813
WORD 36 21030
WORD 37 -7086
WORD 38 22500
WORD 39 -4009
WORD 40 22000
WORD 41 9813
WORD 42 21030
WORD 43 -7086
WORD 44 22500
WORD 45 -4009
WORD 46 22000
WORD 47 9813
WORD 48 21030
WORD 49 82
WORD 50 0
WORD 51 0
我无法解释这里发生了什么!
**更新**
将循环更改为 :
后
for (i=1; i < 25;i++ ){
ratio =eeprom_read_word(j);
printf(" WORD %d %d \n", i,ratio);
j = j +2;
}
现在的输出是:
WORD 1 22500
WORD 2 21030
WORD 3 22000
WORD 4 22500
WORD 5 21030
WORD 6 22000
WORD 7 22500
WORD 8 21030
WORD 9 22000
WORD 10 22500
WORD 11 21030
WORD 12 22000
WORD 13 22500
WORD 14 22000
WORD 15 0
WORD 16 0
WORD 17 22500
WORD 18 22000
WORD 19 0
WORD 20 0
WORD 21 22500
WORD 22 22000
WORD 23 0
WORD 24 0
我还是不明白 0
是从哪里来的?
你有 24 个 16 位值,总共 48 个字节,存储在 EEPROM 中,从地址 2 开始,最后一个字节存储在地址 49。读取这些字节,你从地址 1 开始,你没有填充它.你加1但是每次读取两个字节,对吧?
我建议将 i 分配为 short* 类型,这样增量会增加 sizeof(short)。另外,我会修复该起始地址以供阅读。
哦,对于24个值,循环结束值需要修复。
正如donjuedo所说,你正在使用uint16_t类型的指针来更新eeprom中的数据。当您递增此指针时,您将在地址中向前移动 2 个字节。因为,在阅读时,您提供了一个 uint8_t 指针(指向函数 "eeprom_read_word"),它只会增加一个字节。因此,您得到的是备用垃圾值,并且只有总预期值的一半。
希望这可以帮助。
假设我有 3 个向量:
int16_t v1[8];
int16_t v2[8];
int16_t v3[8];
int8_t lock = 0;
我想将数组的值保存在EEPROM中。为此,这是我所做的:
int i = 0;
uint16_t * j = (uint16_t*) 2 ;
short ratio=0;
for ( i =0; i<8;i++){
v1[i] = 22500;
v2[i] = 10500;
v3[i] = 20888;
}
我想保存如下值:
// .startat at the 3rd byte
// v1[0]v2[0]v3[0]v1[1]v2[1]v3[1] ----------> v1[7]v2[7]v3[7]
for ( i = 0 ; i <8; i++ ){
//printf("j = %d \n",j);
eeprom_update_word (j++, v1[i]);
eeprom_update_word (j++, v2[i]);
eeprom_update_word (j++, v3[i]);
}
为了检查值是否正确保存,我尝试将它们打印出来:
for (i=1; i < 26;i++ ){
ratio =(short)eeprom_read_word((uint8_t*)i);
printf(" WORD %d %d \n", i,ratio);
}
而且我真的不明白输出结果:
WORD 1 -7168
WORD 2 22500
WORD 3 1111
WORD 4 10500
WORD 5 -26583
WORD 6 20888
WORD 7 -7087
WORD 8 22500
WORD 9 1111
WORD 10 10500
WORD 11 -26583
WORD 12 20888
WORD 13 -7087
WORD 14 22500
WORD 15 1111
WORD 16 10500
WORD 17 -26583
WORD 18 20888
WORD 19 -7087
WORD 20 22500
WORD 21 1111
WORD 22 10500
WORD 23 -26583
WORD 24 20888
WORD 25 -7087
知道如何以正确的方式获得它吗?
我扩展了 for 循环,输出看起来只对了一半! ! :
WORD 1 -7168
WORD 2 22500
WORD 3 -4009
WORD 4 22000
WORD 5 9813
WORD 6 21030
WORD 7 -7086
WORD 8 22500
WORD 9 -4009
WORD 10 22000
WORD 11 9813
WORD 12 21030
WORD 13 -7086
WORD 14 22500
WORD 15 -4009
WORD 16 22000
WORD 17 9813
WORD 18 21030
WORD 19 -7086
WORD 20 22500
WORD 21 -4009
WORD 22 22000
WORD 23 9813
WORD 24 21030
WORD 25 -7086
WORD 26 22500
WORD 27 -4009
WORD 28 22000
WORD 29 9813
WORD 30 21030
WORD 31 -7086
WORD 32 22500
WORD 33 -4009
WORD 34 22000
WORD 35 9813
WORD 36 21030
WORD 37 -7086
WORD 38 22500
WORD 39 -4009
WORD 40 22000
WORD 41 9813
WORD 42 21030
WORD 43 -7086
WORD 44 22500
WORD 45 -4009
WORD 46 22000
WORD 47 9813
WORD 48 21030
WORD 49 82
WORD 50 0
WORD 51 0
我无法解释这里发生了什么!
**更新** 将循环更改为 :
后for (i=1; i < 25;i++ ){
ratio =eeprom_read_word(j);
printf(" WORD %d %d \n", i,ratio);
j = j +2;
}
现在的输出是:
WORD 1 22500
WORD 2 21030
WORD 3 22000
WORD 4 22500
WORD 5 21030
WORD 6 22000
WORD 7 22500
WORD 8 21030
WORD 9 22000
WORD 10 22500
WORD 11 21030
WORD 12 22000
WORD 13 22500
WORD 14 22000
WORD 15 0
WORD 16 0
WORD 17 22500
WORD 18 22000
WORD 19 0
WORD 20 0
WORD 21 22500
WORD 22 22000
WORD 23 0
WORD 24 0
我还是不明白 0
是从哪里来的?
你有 24 个 16 位值,总共 48 个字节,存储在 EEPROM 中,从地址 2 开始,最后一个字节存储在地址 49。读取这些字节,你从地址 1 开始,你没有填充它.你加1但是每次读取两个字节,对吧?
我建议将 i 分配为 short* 类型,这样增量会增加 sizeof(short)。另外,我会修复该起始地址以供阅读。
哦,对于24个值,循环结束值需要修复。
正如donjuedo所说,你正在使用uint16_t类型的指针来更新eeprom中的数据。当您递增此指针时,您将在地址中向前移动 2 个字节。因为,在阅读时,您提供了一个 uint8_t 指针(指向函数 "eeprom_read_word"),它只会增加一个字节。因此,您得到的是备用垃圾值,并且只有总预期值的一半。 希望这可以帮助。