AVR学习笔记之内部EEPROM读写
AVR单片机的多数型号都有芯片内置的EEPROM,这些EEPROM可以用来保护芯片掉电后要保存的数据。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地址开始,读取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;
}
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);
}
程序修改后重新编译下载到单片机后,打开串口调试助手,肯定会发现什么数据都没有,别急,重新按下单片机的复位键就可以看到数据了。因为在主程序中发送数据的指令只执行了一次,速度很快,在你打开串口调试助手前就已经过去了,因此需复位一下才能看到现象。现象如下图所示:
读回的数据分别是00,01,02,03,04,05,06,07,08,09,发现和写入的数据是相同的,那么说明成功的对eeprom进行了读写操作。
只要会了这两个最基本的读写操作,那么Atmega16内部的512字节的eeprom空间就可以为你所用了。
百度搜索“爱华网”,专业资料,生活学习,尽在爱华网