学习笔记之内部eeprom读写
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
程序修改后重新编译下载到单片机后, 打开串口调试助手, 肯定会发现什么数据都没有, 别急, 重新按下单片机的复位键就可以看到数据了。 因为在主程序中发送数据的指令只执行 了一次, 速度很快, 在你打开串口调试助手前就已经过去了, 因此需复位一下才能看到现象。 现象如下图所示:
读回的数据分别是 00,01,02,03,04,05,06,07,08,09,发现和写入的数据是相同的,那么说 明成功的对 eeprom 进行了读写操作。 只要会了这两个最基本的读写操作,那么 Atmega16 内部的 512 字节的 eeprom 空间就 可以为你所用了。
AVR 学习笔记之内部 EEPROM 读写
AVR 单片机的多数型保存的数据。 Atmega16 内置的 EEPROM 的容量是 512 字节, 可以重复擦写的次数 是 10 万次。
AVRGCC 自带的 EEPROM 读写函数可对 Atmega16 内部的 EEPROM 进行读写操作。如果要使用 AVRGCC 中自带的 EEPROM 读写函数,首先要在程序中包含#include<avr/eeprom.h>这个头文件。 AVRGCC 内置 EEPROM 访问函数库如下: (1)void eeprom_read_block(void *buf, unsigned int addr, size_t n):从 EEPROM 的 addr 地址
} void usart_init() { UCSRA=0X00; UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//写 UCSRC, 异步操作, 禁止奇偶校验, 停止位数为 1,8 位字符长度 UBRRH=(F_CPU/BAUD/16-1)/256;//波特率高 4 位 UBRRL=(F_CPU/BAUD/16-1)%256;//波特率低 8 位 UCSRB|=(1<<TXEN);//使能发送,使能接收,使能接受中断 } void usart_put_char(unsigned char TX_data)//发送一个字节的数据 { while(!(UCSRA&(1<<UDRE)));//检测 UDRE 是否为 1, 只有在 UDRE 为 1 的情况下, 才 能向缓冲器 UDR 中写入数据。 UDR=TX_data; } int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++)eeprom_write_byte(i,i); while(1); } 上段程序是对 EEPROM 进行写操作,通过 for(i=0;i<10;i++)eeprom_write_byte(i,i);这段 程序实现的是在地址 0—9 分别写数据 0—9。 那么怎么知道我数据是否成功写入了呢?下面 还要进行读操作,作用是把刚才写入的数据读出来,看看是否和写入的一样,只需要修改主 程序即可。修改后的代码如下: int main() { unsigned char i; port_init(); usart_init(); for(i=0;i<10;i++) usart_put_char(eeprom_read_byte(i)); while(1); }
开始,读取 n 个字节到 buf。 (2)int eeprom_is_ready():宏定义,EEPROM 准备好(EECR =0)返回非 0,否则返回 0。 (3)unsigned char eeprom_read_byte (unsigned int addr):从 EEPROM 读取 addr 地址处的字 节数据, 在以前的版本中为 unsigned char eeprom_rb(unsigned int addr), 新版也兼容旧版本的 函数。 (4)unsigned int eeprom_read_word(unsigned int addr) :从 EEPROM 读取一个整数,低字节 地址 addr,高字节地址(addr+1) ,在以前的版本中为 unsigned int eeprom_rw(unsigned int addr),新版本也兼容旧版本的函数。 (5)void eeprom_write_byte (unsigned int addr, unsigned char val):向 EEPROM 的 addr 地址 处写入字节数据 val, 在以前的版本中为 void eeprom_wb(unsigned int addr, unsigned char val), 新版本也兼容旧版本的函数。 在做读写 EEPROM 实验的时候需要对熔丝位进行正确的设置,应选择熔丝位为“执行 芯片擦除时保留 EEPROM 的内容” ,即 EESAVE=0。 下面就通过实例来调用这些函数。程序代码如下: #include <avr/io.h> #include <avr/iom16.h> #include <string.h> #include <stdio.h> #include<avr/signal.h> #include<avr/interrupt.h> #define F_CPU 16000000 #include <util/delay.h> #include <avr/eeprom.h> #define BAUD 9600 #define delay_us(x) _delay_us(x) //AVR GCC 延时函数 x(us) #define delay_ms(x) _delay_ms(x) //AVR GCC 延时函数 x(ms) void port_init() { DDRD|=(1<<PD1);//把 TXD 端口配置为输出 PORTA=0x00;