c - 读取 EEPROM AVR

标签 c avr avr-gcc

当我从 eeprom 接收数据时遇到问题。

首先我编写了以下代码:

#include <avr/io.h>
#include <avr/eeprom.h>

char     NAME[5]   EEMEM   = "a001";
char     UNIT[2]   EEMEM   = "C";
uint16_t CYCLICITY EEMEM   = 2000;

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}

从中我提取了 .hex 和 .eep 文件。然后我用avrdude写了这个文件。首先,我写错了,因为我只将 .hex 文件放在 eerpom:w 上,并且破坏了一些字节,这并不那么重要。之后,我使用正确的命令进行写入,并看到部分数据,如下一个打印屏幕所示。

dumpeeprom

我正在保存一个数字、一个 C 和 a001 。正如您在第一行看到的那样,有 ..C.a001。这是我写的9个字节。

现在在另一个程序中!我尝试这样做:

char     EEMEM NAME[5]  ;  
char     EEMEM UNIT[2]  ;
uint16_t EEMEM CYCLICITY; 

void _vReadEEPROM(char *au8Name,char *au8Unit,uint16_t *u16Cyclicity)
{
  eeprom_read_block((void *)&au8Name,(const void *)NAME,5);
  eeprom_read_block((void *)&au8Unit,(const void *)UNIT,2);
  *u16Cyclicity = eeprom_read_word(&CYCLICITY);
}

参数位于全局结构中:

typedef struct 
{
    uint16_t u16Cyclicity;
    uint16_t u16Value;
    char     pu8Name[5];
    char     pu8Unit[2];
}EEH_layout;

在我发送“损坏的UART”的主要内容时(我有另一个主题)。在此代码之前,USART 发送了良好的值和垃圾。但是当我输入此代码时,USART 没有发送任何内容,并且我相信这是由于从 eeprom 读取 0(空)而导致的。 CPU 正在工作,因为我有一个 1 秒定时器,可以中断 LED 闪烁。这是有效的,所以问题是我从 EEPORM 得到了 0。

另外,我不确定我是否理解如何写入 EEPROM,因为到处都有很多关于 EEPROM 的教程,但没有任何地方告诉我们如何配置 EEPROM 并且只读取。我不想在我的代码中包含这些参数,我希望它们来自 eeprom,我将单独编写!

编辑:uint16参数没问题,我设法通过UART读取它,它是2000;但字符不行,它是空的。

编辑: 测试正常,问题是函数的参数没有使用正常。我用 pau8Name[] 而不是 *pau8Name 更改函数,因为指针初始化错误!!

最佳答案

始终注意指针!

问题出在未初始化的指针上。请参阅帖子中的编辑!

关于c - 读取 EEPROM AVR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24127172/

相关文章:

c - AVR 8 位定时器 - 当比较值不适合寄存器时该怎么办?

timer - AVR/Arduino : reading timer toggled port pin

c - AVR GCC、汇编 C stub 函数、eor 和所需的常量值

c++ - NULL 指针参数有多昂贵?

c - avr-gcc:循环 >= 比 > 检查快

c - 减法运算不起作用

c - 在 C 中传递、编辑和返回变量

c - 在 AVR Atmega88-PA 上设置 UART 时遇到问题

c - 这个函数宏安全吗?

c - 在c中传递引用?