AVR使用范例--EEPROM使用详解

合集下载

AVR单片机IIC读写范例IIC.C 或者IIC.H

AVR单片机IIC读写范例IIC.C 或者IIC.H

资料简介:本程序简单的示范了如何使用ATMEGA16的TWI 读写AT24C02 IIC EEPROM TWI协议(即IIC协议,请认真参考IIC协议的内容,否则根本就不能掌握)一主多从的应用,M16作主机(M16做从机和多主多从的应用不多,请自行参考相关文档)中断模式(因为AVR的速度很高,而IIC的速度相对较低,采用查询模式会长时间独占CPU,令CPU的利用率明显下降。

特别是IIC速度受环境影响只能低速通讯时,对系统的实时性产生严重的影响。

查询模式可以参考其它文档和软件模拟IIC的文档)AT24C02/04/08的操作特点出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器*/#include <avr/io.h>#include <avr/signal.h>#include <avr/interrupt.h>#include <avr/delay.h>//时钟定为外部晶振7.3728MHz,F_CPU=7372800#include <compat/twi.h>//定义了各种模式下的状态码列表(TWSR已屏蔽预分频位),本文后面附上中文描述//管脚定义#define pinSCL0//PC0 SCL#define pinSDA1//PC1 SDA//为保险起见,最好在SCL/SDA接上1~10K的外部上拉电阻到VCC。

#define fSCL100000//TWI时钟为100KHz//预分频系数=1(TWPS=0)#if F_CPU < fSCL*36#define TWBR_SET 10;//TWBR必须大于等于10#else#define TWBR_SET(F_CPU/fSCL-16)/2;//计算TWBR值#endif#define TW_ACT(1<<TWINT)|(1<<TWEN)|(1<<TWIE)//TWCR只能IN/OUT,直接赋值比逻辑运算(|= &=)更节省空间#define SLA_24CXX0xA0//24Cxx系列的厂商器件地址(高四位)#define ADDR_24C020x00// AT24C02的地址线A2/1/0全部接地,SLAW=0xA0+0x00<<1+0x00,SLAR=0xA0+0x00<<1+0x01 //TWI_操作状态#define TW_BUSY0#define TW_OK 1#define TW_FAIL 2//TWI_读写命令状态#define OP_BUSY0#define OP_RUN 1//TWI读写操作公共步骤#define ST_FAIL0//出错状态#define ST_START1//START状态检查#define ST_SLAW2//SLAW状态检查#define ST_WADDR3//ADDR状态检查//TWI读操作步骤#define ST_RESTART4//RESTART状态检查#define ST_SLAR5//SLAR状态检查#define ST_RDATA6//读取数据状态检查,循环n字节//TWI写操作步骤#define ST_WDATA7//写数据状态检查,循环n字节#define FAIL_MAX20//重试次数最大值//定义全局变量unsigned char ORGDATA[8]={0xAA,0xA5,0x55,0x5A,0x01,0x02,0x03,0x04};//原始数据unsigned char CMPDATA[8];//比较数据unsigned char BUFFER[256];//缓冲区,可以装载整个AC24C02的数据struct str_TWI//TWI数据结构{volatile unsigned char STATUS;//TWI_操作状态unsigned char SLA;//从设备的器件地址unsigned int ADDR;//从设备的数据地址unsigned char*pBUF;//数据缓冲区指针unsigned int DATALEN;//数据长度unsigned char STATE;//TWI读写操作步骤unsigned char FAILCNT;//失败重试次数};struct str_TWI strTWI;//TWI的数据结构变量//仿真时在watch窗口,监控这些全局变量。

AVR内部EEPROM读写实验

AVR内部EEPROM读写实验

A VR内部EEPROM读写实验片内EEPROM读写实险。

1、用内部EEPROM记录CPU启动次数,并在PB 口上显示出来。

2、内部1 M晶振,程序采用单任务方式,软件延时。

3、进行此实验请插上JP1的所有8个短路块,JP7(LED_EN)短路块。

4、通过此实验,可以对对内部EEPROM 有个初步认识,了解EEPROM函数的操作。

5、可过复位键让系统重启,这样就可以更新显示了。

*/#include iom16v.h/*延时函数*/void delay_ms(unsigned char i) {unsigned char a, b;for (a = 1; a i; a++) { for (b = 1; b; b++) { ; } }}/*EEPROM读取函数*//*addr:地址;number:长度;p_buff:读出数据存放指针*/void eprom_read(unsigned int addr, unsigned char number, unsigned char *p_buff) {while(EECR (1 EEWE));EEARH = 0x00;while(number --) { EEARL = addr ++; EECR |= (1 EERE); *p_buff++ = EEDR; }}/*EEPROM写入函数*//*addr:地址;number:长度;p_buff:写入数据存放指针*/void eprom_write(unsigned int addr, unsigned char number, unsigned char *p_buff) {EEARH = 0x00;while(number --) { while(EECR (1 EEWE)); EEARL = addr ++; EEDR = *p_buff ++; EECR |= (1 EEMWE); EECR |= (1 EEWE); }}/*主函数*/void main(void) {unsigned char temp;DDRA = 0x00; /*方向输入*/PORTA = 0xFF; /*打开上拉*/DDRB = 0xFF; /*方向输出*/PORTB = 0xFF; /*电平设置*/DDRC = 0x00;PORTC = 0xFF;DDRD = 0x00;PORTD = 0xFF;delay_ms(250); /*启动延时*/eprom_read(0x10, 0x01, temp); /*读出记录*/PORTB = ~temp; /*显示记录*/temp ++; /*刷新记录*/eprom_write(0x10, 0x01, temp); /*写入记录*/while (1) { ; }}。

AVR单片机教程19—第十九课 ATMEAG16L的内部EEPROM读写编程

AVR单片机教程19—第十九课 ATMEAG16L的内部EEPROM读写编程

——————————————————————————第十九课ATMEAG16L的内部EEPROM读写编程本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书实验器材,可登陆周兴华单片机培训中心网购部自助购买!11.1 ATMEAG16L的内部EEPROMATmegal6L单片机片内有512个字节的EEPROM,它作为一个独立的数据空间存在。

ATmegal6L的EEPROM采用独立线性编址,其地址范围为0~511。

ATmegal6L通过对相关单片机培训寄存器的操作实现对EEPROM按字节进行读写。

ATmegal6L的EEPROM至少可以擦写100000次。

ATmegal6L的EEPROM的写入时间约花数毫秒,取决于VCC的电压。

电源电压越低,写周期越长。

11.2 与EEPROM相关的寄存器——————————————————————————l.EEPROM地址寄存器—EEARH、EEARLEEPROM地址寄存器EEARH、EEARL用于指定某个EEPROM单元的地址。

512个字节的EEPROM线性编址为0~511。

地址寄存器EEARH、EEARL可读可写,初始值没有定义,访问前必须赋予正确的地址。

2.EEPROM数据寄存器—EEDREEPROM数据寄存器EEDR用于存放即将写入EEPROM或者从EEPROM读出的某个单元的数据。

写入或者读出的地址由EEPROM的地址寄存器EEARH、EEARL给出。

EEPROM按字节进行读写。

EEPROM数据寄存器EEDR可读可写,初始值为0x00。

3.EEPROM控制寄存器—EECR——————————————————————————EEPROM控制寄存器EECR用于控制单片机对EEPROM的操作。

位7~4:保留位。

读这些位时总为0。

位3:EERIE位为EEPROM中断准备好使能位。

AVR单片机内部EEPROM应用方法

AVR单片机内部EEPROM应用方法

AVR 单片机内部EEPROM 应用方法
AVR 单片机内部集成了EEPROM,但是在GCC 写编写EEPROM 应用
程序的时候,经常会出现读写EEPROM 时程序出错,或重启等不正常现象。

在软件仿真时也许结果是正确的,但是在片上运行的时候就不正常。

困扰很
久,终于发现原因在于编译器,已经我们对EEPROM 操作说明的理解不正确
或不仔细。

操作EEPROM 对时序的要求较高。

更加Datasheet 里的写操作范例程序:while(EECR &amp; (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
EECR |= (1
EECR |= (1 以上代码在GCC 中的编译结果,发现EECR |= (1while(EECR &amp; (1EEAR = address; //设置地址和数据寄存器
EEDR = data;
asm volatile(SBI 0x1C,2 \n\t);
asm volatile(SBI 0x1C,1 \n\t);。

AVR单片机EEPROM读写过程

AVR单片机EEPROM读写过程

EEPROM: 单片机内部可用软件读写的数据存储空间,掉电后数据不丢失,可擦写10万次。

ATmega16 内部有512字节的EEPROM数据空间,地址空间由0-511,由EEPROM 地址寄存器EEAR指定,数据寄存器EEDR用于存储要读写的数据。

写操作步骤:
一、查询上一个数据是否写完:while (EECR&(1<<EEWE)) ; //如果EEWE位为1,就在原地等待
二、将要写如数据的地址送到EEAR: EEAR=address(范围0-0x1ff) ;
三、把要写入的数据送到EEDR: EEDR=data;
四、主机写入允许:EECR|=(1<<EEMWE);
五、启动写入:EECR|=(1<<EEWE);
读操作步骤:
一、等待上一个数据写完:while(EECR&(1<<EEWE));
二、指定要读出数据的地址:EEAR=adress;
三、使能读:EECR|=(1<<EERE);
四、从EEDR中读取数据:data=EEDR;
小企鹅diy 科学探究学习网
更多文章转到/wqb_lmkj/blog文章分类单片机。

AVR单片机内部EEPROM方法

AVR单片机内部EEPROM方法

AVR单片机内部EEPROM方法/**************************************************************;eeprom.c 在AVR单片机中可以用在ATMEGA16和ATMEGA8中都可以用,在GCC下;编译通过。

09年11月1号! 陈永飞已测试过!;读/写atmega8515内部EEPROM的例子;将数据0....9写入eeprom中,再读出用数码管显示出来***************************************************************/#include ;#include ;#define uchar unsigned char#define uint unsigned int#define Hidden 16ucharDispTab[17]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xFF}; uchar BitTab[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};uchar DispBuf[6]; //显示缓冲区 unsigned char Counter=0; void io_init(void){// PortAPORTA = 0xff;DDRA = 0xff;// PortBPORTB = 0x0;DDRB = 0x0;// PortCPORTC = 0xfc;DDRC = 0xfc;// PortDPORTD = 0x0;DDRD = 0x0;}void mDelay(uint DelayTim) {uint i;for(;DelayTim>;0;DelayTim--) {for(i=0;i;=6)i=0;PORTC=0xff; //关闭显示tmp=DispBuf[i];PORTA=DispTab[tmp];tmp=BitTab[i];PORTC=tmp;mDelay(1); //延时1ms}int main(void){unsigned int Count=0;unsigned char Addr=1; //向地址1里面写数字uint8_t temp=0;io_init();DispBuf[0]=Hidden;DispBuf[1]=Hidden;DispBuf[2]=Hidden;DispBuf[3]=Hidden;DispBuf[4]=0; //次低位显示0while(1){temp=eeprom_read_byte (Addr);DispBuf[5]=temp;if(++Count==1000){Count=0;Counter++;eeprom_write_byte(Addr,Counter); }if(Counter>;=10)Counter=0; //计数值在0~9之间循环disp(); //调用显示程序}}。

eeprom使用的流程

eeprom使用的流程

EEPROM使用的流程1. 简介EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种特殊的非易失性存储器,可以通过电子擦除的方式对其中的数据进行修改。

EEPROM 的使用可以在许多应用中存储重要的配置信息或用户数据,并在需要时进行读取、修改和擦除。

2. EEPROM流程概述使用EEPROM时,通常需要遵循以下基本流程:1.初始化EEPROM2.写入数据到EEPROM3.从EEPROM中读取数据4.擦除EEPROM中的数据下面将详细介绍每个流程的步骤和注意事项。

3. 初始化EEPROM在使用EEPROM之前,需要对其进行初始化。

初始化的过程可以包括确定EEPROM的地址、设置相关的控制寄存器等操作。

以下是初始化EEPROM的一般步骤:•确定EEPROM的地址:根据硬件设计和连线的方式,确定EEPROM 的地址。

通常情况下,EEPROM都会有一个唯一的I2C地址,可以通过连接敏感引脚或编程进行设置。

•设置控制寄存器:根据EEPROM的型号和规格,设置相关的控制寄存器。

这些寄存器可以包括写使能、擦除使能、写保护等设置。

根据具体的硬件平台和开发工具,设置方法可能会有所不同。

•验证初始化:在进行后续的写入和读取操作之前,需要验证EEPROM的初始化是否成功。

这可以通过读取控制寄存器的值或执行简单的读取操作来实现。

4. 写入数据到EEPROM一旦EEPROM初始化完成,可以开始向其中写入数据了。

写入数据到EEPROM通常需要注意以下几个步骤:•选择写入的地址:根据EEPROM的规格和需求,选择要写入数据的地址。

EEPROM通常被分为多个字节或页面,每个页面都有其唯一的地址。

•编写写入算法:根据需要,编写适合特定EEPROM型号的写入算法。

这些算法可能包括将数据按字节或页面写入EEPROM、校验写入的数据等操作。

根据具体的硬件平台和开发工具,写入算法可能会有所不同。

arm eeprom编程

arm eeprom编程

EEPROM(Electrically Erasable Programmable Read-Only Memory)是一种可以通过电子方式擦除和编程的非易失性存储器。

在ARM微控制器上,通常使用内置的EEPROM模块或外部EEPROM芯片来存储数据。

下面是一个简单的示例,演示如何在ARM微控制器上编程EEPROM。

1.硬件连接首先,需要将EEPROM芯片连接到微控制器的I/O引脚上。

通常,EEPROM芯片会有一些特定的引脚用于数据输入/输出、地址选择和擦除/编程控制。

根据EEPROM芯片的数据手册,将相应的引脚连接到微控制器的相应I/O引脚上。

2.配置微控制器在编程EEPROM之前,需要配置微控制器的一些参数,例如I/O引脚的工作模式、时钟频率等。

根据EEPROM芯片的数据手册,设置微控制器的一些特定寄存器。

3.EEPROM编程函数下面是一个简单的示例EEPROM编程函数的代码:c复制代码#include<stdio.h>#include<stdint.h>#include"eeprom.h"// EEPROM库的头文件void eeprom_write(uint32_t address, uint8_t data) {// EEPROM编程函数,写入单个字节的数据// 具体实现取决于使用的EEPROM库和微控制器型号eeprom_write_byte(address, data); // 使用库函数将数据写入EEPROM }int main() {uint32_t address = 0x0000; // EEPROM地址uint8_t data = 0x12; // 要写入的数据eeprom_write(address, data); // 调用EEPROM编程函数return0;}在这个示例中,eeprom_write()函数是用来写入单个字节数据的函数,它的实现取决于所使用的EEPROM库和微控制器型号。

AVR104 缓存和中断方式EEPROM写入

AVR104 缓存和中断方式EEPROM写入

AVR104: 缓存和中断方式EEPROM写入翻译:邵子扬 2006年8月18日shaoziyang@1特点●多字节 EEPROM 缓存●高效 EEPROM 访问●缓存访问控制●EEPROM 缓存重写2介绍许多应用中使用了 AVR 单片机内置的 EEPROM 来保存和恢复参数。

存放单个字节到 EEPROM 的编程时间在 3 到 8.5 ms 左右,在这个写入时间里写入访问被禁止。

传统上是使用查询法来判断 EEPROM 写入是否完成的,这篇应用笔记介绍一种使用缓存和中断方法,明显的提高了程序的性能,和查询法相比还减少了电源的功耗(在等待期间可以进入休眠模式)。

提高性能和降低功耗直接关系到系统。

当执行 EEPROM 写访问查询时,所有资源(除了中断)都被查询所占用,而中断法在“等待” EEPROM 写入完成中断时,可以将单片机释放出来去执行其它代码。

与查询法相比,中断驱动写每字节的 EEPROM 最多可以释放 8.5 ms 时间–依赖于芯片编程时间和系统时钟频率。

3理论AVR 单片机既可以通过中断方式也可以通过查询方式写内部的 EEPROM,两种方法有各自的优点,但是从执行性能看要选择中断方式。

3.1 轮询法轮询就是在读写时,查询 EEWE 状态标志位来保证写周期已经完成。

如果写周期还在进行中,单片机将等待并不停检查标志位,直到标志位被清楚后才继续进行。

检查自编程是否被激活也是必要的,在需要时,要等待 SPM 操作完成。

如果不使用自编程,可以忽略这个步骤。

一旦标志位被清除,就可以启动下一个 EEPROM 操作了。

轮询法的优点是代码紧凑,主要缺点是单片机在等待 EEPROM 写入时浪费了很多时间。

一个典型的单字节写子程序如下:EEPROM_WR: ;EEPROM Write Sub-Routinesbic EECR, EEWE ;If EEWE Not Clearrjmp EEPROM_WR ;Wait LongerSPM_BUSY: ;(Omit if Self-Programming is Not Used) sbic SPMCR, SPMEN ;If SPMEN Not Clearrjmp SPM_BUSY ;Wait Longerout EEARH, r16 ;Output Address Byte (High)out EEARL, r17 ;Output Address Byte (Low)out EEDR, r18 ;Output Data Bytecli ;Disable Global Interruptssbi EECR, EEMWE ;Set Master Write Enablesbi EECR, EEWE ;Set EEPROM Write Strobe;This instruction takes four clock;cycles.sei ;Enable Global Interruptsret ;Return From Sub-Routine3.2 中断法在中断驱动法,不需要查询 EEWE 状态位确定 EEPROM 写入完成,EEPROM 就绪中断是 EEWE 状态位被清除时触发的。

IAR FOR AVR EEPROM读写程序

IAR FOR AVR  EEPROM读写程序

#include <iom32.h> //Free_Bird#include <intrinsics.h>//这个头文件包含了EEPROM操作的库函数/*------------------PDF中的两个示例函数--------------------------*/unsigned char EEPROM_read(unsigned int uiAddress){/* 等待上一次写操作结束*/while(EECR & (1<<EEWE));/* 设置地址寄存器*/EEAR = uiAddress;/* 设置EERE 以启动读操作*/EECR |= (1<<EERE);/* 自数据寄存器返回数据*/return EEDR;}void EEPROM_write(unsigned int uiAddress, unsigned char ucData){/* 等待上一次写操作结束*/while(EECR & (1<<EEWE));/* 设置地址和数据寄存器*/EEAR = uiAddress;EEDR = ucData;/* 置位EEMWE */ /* 同时清零EEWE */EECR = (1<<EEMWE);/* 置位EEWE 以启动写操作*/EECR |= (1<<EEWE);}/*---------------------变量在EEPROM空间的声明和定义方法----------------------*/__eeprom unsigned char a1 = 0x35;//默认会被分配到0x0000单元__root __eeprom unsigned char a2 = 0x55;__no_init __eeprom unsigned char a3;/*---------------------变量在EEPROM空间的绝对定位有两种方法----------------------*/ __root __eeprom unsigned char a4 @ 0x102 = 0x00; //方法1#pragma location = 0x110__root __eeprom unsigned char a5 = 0x00; //方法2//宏定义一个EEPROM “起始地址”#define ADDR 0x100void main(){/*---------------------------------------------------------*/// 0-----变量定义/*---------------------------------------------------------*/unsigned char i = 0;unsigned char Temp = 0xff;unsigned char EEP_data[20] = {0};/*---------------------------------------------------------*/// 1-----PDF上示例函数应用/*---------------------------------------------------------*/for(i = 0; i < 20; i++)//将EEPROM空间的0x100~0x114 区间都写成0xaa{EEPROM_write((ADDR+i),0xaa);}for(i = 0; i < 20; i++)//将EEPROM里0x100~0x114区间的数据读出并依次赋给数组{EEP_data[i] = EEPROM_read((ADDR+i));}/*---------------------------------------------------------*/// 2-----IAR自带库函数应用前提是#include <intrinsics.h>/*---------------------------------------------------------*/__EEPUT(0x110,0x22); //写0x22到EEPROM区间的0x110单元__EEGET(Temp,0x102); //读EEPROM区间0x102单元的数据并赋给变量Temp/*---------------------------------------------------------*/// 3-----对定义到EEPROM空间的变量操作,IAR会自动完成读写工作/*---------------------------------------------------------*/a1++;Temp = a1;while(1);}。

最新AVR单片机EEPROM寄存器汇总

最新AVR单片机EEPROM寄存器汇总

A V R单片机E E P R O M寄存器ATmega88包含512字节的EEPROM数据存储器。

它是作为一个独立的数据EEPROM 的寿命至少为 100,000 次擦除周期。

EEPROM 的访问由地址寄存器,数据寄存器和控制寄存器决定。

具体的 SPI 及并行下载 EEPROM 数据请参见P254“存储器编程”。

EEPROM 读/ 写访问EEPROM 读/ 写访问EEPROM 的访问寄存器位于I/O 空间。

EEPROM的写访问时间由Table 3给出。

自定时功能可以让用户软件监测何时可以开始写下一字节。

用户操作EEPROM 需要注意如下问题:在电源滤波时间常数比较大的电路中,上电/ 下电时VCC 上升/ 下降速度会比较慢。

此时CPU 可能工作于低于晶振所要求的电源电压。

请参见P20“ 防止EEPROM 数据丢失” 以避免出现EEPROM 数据丢失的问题。

为了防止无意识的EEPROM 写操作,需要执行一个特定的写时序。

具体参看EEPROM控制寄存器的内容。

执行EEPROM 读操作时, CPU 会停止工作4 个周期,然后再执行后续指令;执行EEPROM 写操作时, CPU 会停止工作2 个周期,然后再执行后续指令。

EEPROM 地址寄存器- EEARH和EEARL· Bits 15..9 – Res: 保留保留位,读操作返回值为零。

· Bits 8..0 – EEAR8..0: EEPROM 地址EEPROM 地址寄存器– EEARH和EEARL指定了 512 字节的EEPROM。

EEPROM 地址是线性的,从 0 到 511 。

EEAR 的初始值没有定义。

在访问EEPROM 之前必须为其赋予正确的数据。

EEAR8 在 ATmega48 中为无效位,必须始终将其赋值为”0”。

EEPROM 数据寄存器- EEDR· Bits 7..0 – EEDR7.0: EEPROM 数据对于EEPROM 写操作, EEDR 是需要写到EEAR 单元的数据;对于读操作,EEDR 是从地址EEAR 读取的数据。

基于EEPROM电子密码锁(AVR)

基于EEPROM电子密码锁(AVR)
{
delay(5);
l=PIND;
if(l==0xfb)
{
while(l!=0xff){l=PIND;};
miao--;
if(miao==-1)
miao=59;
}
}
}
if(knum==2)
{
uchar table2[]={" Unlock OK! "};
uchar table3[]={" ERROR ! "};
uchar table4[]={"You Can Be Serve"};
uchar table5[]={" New PassWord: "};
uchar table6[]={" PassWord Saved!"};
{
if(l==0xfd)
{
delay(5);
l=PIND;
if(l==0xfd)
{
while(l!=0xff){l=PIND;};
miao++;
if(miao==60)
miao=0;
}
}
if(l==0xfb)
{
delay(5);
l=PIND;
if(l==0xfb)
{
while(l!=0xff){l=PIND;};
fen--;
if(fen==-1)
fen=59;
}
}
}
if(knum==3)
{
if(l==0xfd)
if(l==0xfd)
{
delay(5);

AVR单片机EEPROM的读写

AVR单片机EEPROM的读写

AVR单片机EEPROM的读写
一AVR 存储类型不要外挂方便使用
1.FLASH 存储程序代码
2.EEPROM 运行的数据掉电不丢失的数据存储分页的数据
3.SRAM 运行的临时数据
EEPROM:读写以字节为单位通过专用指令或SPI、JTAG 直接读写
使用RC 震荡作为时钟,典型值为8.5ms
有时数据丢失的原因:刚上电电压不稳就操作、读写时被中断打断、程序跑飞了
怎样预防:
熔丝位的电压检测设置:低于电压就停止
熔丝位系统时钟的设置:设置上电暂停时间长一点
双字节存储,或加校验位
操作时尽量关中断
二相关寄存器
存储器需要数据和地址来操作以及相应的控制寄存器
地址寄存器EEARH EEARL
数据寄存器EEDR
控制寄存器EECR
* ** * EERIE EEMWE EEWE EERE
以一个实例示范下即可。

第十二章AVR看门狗及EEPROM

第十二章AVR看门狗及EEPROM
令。 n 用户在读取EEPROM 时应该检测EEWE。 n 如果一个写操作正在进行,就无法读取EEPROM,也无法改变
寄存器EEAR。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
AVR 内置EEPROM
n EEPROM 数据寄存器 - EEDR
n 对于EEPROM 写操作, EEDR 是需要写到 EEAR 单元的数据;
n 对于读操作, EEDR 是从地址EEAR 读取的 数据。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n 从EEPROM 指定位置处开始写"size"个字节写的内容由"ptr."指向 的缓冲区提供
第十二章AVR看门狗及EEPROM
ICC读写EEPROM内置函数原型
unsigned char EEPROMread( int location) {
EEAR = location;
EECR |= 0x01; strobe
n EERIE: 使能EEPROM 准备好中断
n 当EEWE 清零时EEPROM 准备好中断即可发 生。
第十二章AVR看门狗及EEPROM
AVR 内置EEPROM
n EEPROM 控制寄存器- EECR
n EEMWE: EEPROM 主机写使能
n EEMWE决定了EEWE置位是否可以启动EEPROM写 操作。
n 当EEMWE为“1”时,在4个时钟周期内置位EEWE 将把数据写入EEPROM 的指定地址;

基于AVR单片机中的EEPROM和FLASH的区别及使用方法解析

基于AVR单片机中的EEPROM和FLASH的区别及使用方法解析

extern uint8_t eeprom_read_byte (const uint8_t *addr);//读取指定地址的 一个字节 8bit 的 EEPROM 数据 extern uint16_t eeprom_read_word (const uint16_t *addr);//读取指定地址 的一个字 16bit 的 EEPROM 数据 extern void eeprom_read_block (void *buf, const void *addr, size_t n); //读取由指定地址开始的指定长度的 EEPROM 数据 extern void eeprom_write_byte (uint8_t *addr, uint8_t val);//向指定地 址写入一个字节 8bit 的 EEPROM 数据 extern void eeprom_write_word (uint16_t *addr, uint16_t val);//向指定 地址写入一个字 16bit 的 EEPROM 数据 通过串口向单片机发送配置命令,单片机收到指令后,利用函数 write_EEPROM_config()将相应的配置信息存放于 EEPROM 中。系统初始 化时,利用函数 read_EEPROM_config()从 EEPROM 中取出相应的数据,
RAM 用作程序运行时的数据存储器; EEPROM 用于存放数据,是用来保存掉电后用户不希望丢的数据,开机 时用到的参数。运行过程中可以改变。 FLASH 是用于存储程序代码的,有些场合也可能用它来保存数据,当然 前提是该单片机的 FLASH 工艺是可以自写的(运行中可擦写),但要注意 FLASH 的擦写次数通常小于一万次,而且通常 FLASH 只能按块擦除。 EEPROM 不能用来存程序,通常单片机的指令寻址不能到这个区域。 EEPROM 的擦写次数应有百万次,而且可以按字节擦写。EEPROM 在一个 PAGE 内是可以任意写的,FLSAH 则必须先擦除成 BLANK,然后再写入, 而一般没有单字节擦除的功能,至少一个扇区擦除。 2.2 结构上的区别 EEPROM 和 FLASH 都是非易失性存储器。 FLASH 的全称是 FLASH EEPROM,但跟常规 EEPROM 的操作方法不同。

EEPROM

EEPROM
EEPROM_write(4000,kk1);
EEPROM_write(4005,kk2);*/
}
}
if(PINF!=0XFF)
{
delayms(20);
if(PINF!=0xff)
AVR(ATMEGA128/16)内部EEPROM读写默认
下面这程序是128的
/****************************内部EEPROM头文件***************************/
#ifndef __eeprom_H__
#define __eeprom_H__
8、全局中断控制位GIE置1,放开总中断屏蔽位(如果打算利用EEIF中断功能)。
9、清除写操作允许位WREN,在本次写操作没有完毕之前禁止重开新的一次写操作。
10、当写操作完成时,控制位WR被硬件自动清零0,中断标志位EEIF被硬件自动置1。
如果本次写操作还没有完成,那么可以用软件查询EEIF位是否为1,或者查询WR位是否为0,来判定写操作是否结束。
/*EEPROM写子入程序*/
//写一个字节
void EEPROM_write(unsigned int Address, unsigned char Data)
{
while(EECR & (1<<EEWE)); /* 等待上一次写操作结束 */
EEAR = Address; /* 设置地址和数据寄存器*/
内部EEPROM读写操作步骤
从EEPROM中读取数据步骤:
1、把地址写入到地址寄存器EEADR中,注意该地址不能超过所用PIC1687X型号 单片机内部EEPROM实际容量。

AVR内部EEPROM使用

AVR内部EEPROM使用

AVR單片機內部EEPROM詳解使用EEPROM倒是挺簡單的,無非是讀和寫操作,首先需要判斷是否在讀寫中,判斷讀寫忙標志,然後要保證讀寫時不能被打斷即要關中斷,接著要寫入到寫數據的地址,接著寫數據,再將地址和數據控制位置位下,數據就寫進了,最後別忘了開中斷。

讀數據時,只要寫入地址,然後將讀控制位置位,再從寄存器EEDR中讀出數據即可。

以上用法是簡單用法,當然這種用法不能用在實際工程應用中的,因爲寫數據需要8ms的時間,系統當然不允許一直等待這8ms的,在本文下面介紹了一種比較好的方式,來安排系統工作的時間。

當然前提是要理解清楚最簡單的工作模式。

一、簡單的工作模式void EEPROM_write(unsigned int uiAddress,unsigned char ucData){while(EECR&(1<<EEWE)); //判斷讀寫忙標志CLI();EEAR = uiAddress; //寫入地址EEDR = ucData; //送入數據EECR |=(1<<EEMWE); //地址和寫控制位鎖存,即可EECR |=(1<<EEWE);SEI();}unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //判斷讀寫忙標志CLI();EEAR = uiAddress; //送入地址EECR |=(1<<EERE); //讀位置位SEI();return EEDR; //返回數據}讀和寫的操作如下面所示讀寫數據時要從0x01開始,00地址有bug(數據手冊上講的)temp=EEPROM_read(0x01);EEPROM_write(0x01,temp);二、提升篇-使用緩衝機構的操作思路是這樣的:首先建立讀寫緩衝區,把需要寫的數據放入到寫緩衝區中,由于在AVR單片機中,寫一個數據時比較慢的大概要8ms吧,這麽長的時間肯定不能一直while等下去,因此我們用中斷在處理,等單片機EEPROM程序寫好了就有ready中斷,這時就能讀\寫操作了,寫的時候從寫緩衝區中取出數據,寫的時候要注意不允許讀,經過一段時間後就完成了,而且我們發現寫的時候只是把數據送入到單片機中的一個寄存器中,至于EEPROM什麽時候來讀這個寄存器直至寫完,我們也沒有必要管他,因爲他操作好了會中斷告訴我們,從而這8ms還可以用來執行其它的程序了,就這樣直到所有的數據都寫完了。

AVR使用范例--EEPROM使用详解

AVR使用范例--EEPROM使用详解

AVR使用范例--EEPROM使用详解本页关键词:什么是eeprom spi eeprom eeprom程序eeprom资料eeprom结构eeprom 读写eeprom的读写本页详细介绍ICC自带EEPROM操作函数的操作方法,包括单字符读写,数组读写,结构体读写。

程序代码:下载相关文件∙void main(void)∙{∙ unsigned char temp1,temp2;/*定义变量*/∙ unsigned char buffer[10];/*定义数组*/∙ unsigned char buf[]="AVR与虚拟仪器";/*定义字符串*/∙∙ EEPROMwrite(0x10,'a');/*单字符写入到0x10,注意是单引号*/∙ temp1 = EEPROMread(0x10);/*读一个字符到temp1*/∙∙∙ EEPROM_WRITE(0x20,"abcdefg");/*写字符串到0x20*/∙ EEPROM_READ(0x20,temp2);/*读字符到temp2,temp2=a*/∙ EEPROM_READ(0x20,buffer);/*读字符串到数组中 buffer[10]=abcdefg */∙∙ EEPROM_WRITE(0x30,buf);/*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/∙∙ while(1)∙ ;∙}∙调试后的效果:调试eeprom的时候,记住设置Avr studio保护eeprom数据,否则每次都会将eeprom中的数据改为0xFF。

如下图:打开调试选项:钩选保护eeprom数据选项:打开相关观测窗口:按F10逐条语句运行,查看运行结果。

1. 地址10上的值被改写为“a”2. temp1的值变为a,及读取了地址0x10的值a:3. abcdefg写入20开始的地址:4. temp2的变为地址20的值a:5. 以0x20开始的值都读入buffer数组中:6. 预定义的数组中的值写到EEPROM中:7. 设置不保护EEPROM的值之后,停止调试再开始调试,EEPROM中的值改为0XFF:通过以上的观察,我想你已经对EEPROM的操作有了一定的认识,同时,你可以打开eeprom.h查看内部内容,是如何定义函数的。

avr操作eeprom

avr操作eeprom

AVR如何将数据写入EEPROM用ICCAVR编译程序,对EEPROM的操作很简单,只要在头文件中包含eeprom.h文件即可。

读取数据调用EEPROMread(addr) 函数,用addr指明读取的地址,该地址的数据在返回值中;写入数据调用EEPROMwrite(addr,x),即将x写入地址addr中。

以上是大前提。

面向具体应用,由于我们想做密码锁,密码锁的初始密码与修改密码都需要保存到EEPROM中,否则,每次上电的密码都会是初始密码。

而数据保存在EEPROM中,依然需要先写再读,若写函数与读函数都写在flash主函数中,像下面的写法,那么依然解决不了“上电变初始”的问题。

uchar pw[]={1,2,3,4,5,6};void writeROM(void){ EEPROMwrite(0x20,pw[0]);EEPROMwrite(0x21,pw[1]);EEPROMwrite(0x22,pw[2]);EEPROMwrite(0x23,pw[3]);EEPROMwrite(0x24,pw[4]);EEPROMwrite(0x25,pw[5]);}void readROM(void){ pw[0]=EEPROMread(0x20);pw[1]=EEPROMread(0x21);pw[2]=EEPROMread(0x22);pw[3]=EEPROMread(0x23);pw[4]=EEPROMread(0x24);pw[5]=EEPROMread(0x25);}void main(){……writeROM();readROM();……}遇到这个困惑后,求助,得到这样的一个回答:编程器就支持直接对EEPROM的编程的,建个Bin或Hex文件,烧录进去就行了。

恍然大悟,于是这样解决的。

先保留着pw[]的赋值语句和writeROM()语句,烧写flash。

然后AVRfighter中有个“读EEPROM”按钮,点击,就可以在“EEPROM内容”中看到EEPROM 中的数据,然后点击右边的“保存”按钮,可以将EEPROM中的数据保存为bin或hex格式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本页详细介绍ICC自带EEPROM操作函数的操作方法,包括单字符读写,数组读写,结构体读写。

程序代码:下载相关文件
∙void main(void)
∙{
∙ unsigned char temp1,temp2; /*定义变量*/∙ unsigned char buffer[10]; /*定义数组*/∙ unsigned char buf[]="AVR与虚拟仪器"; /*定义字符串*/∙
∙ EEPROMwrite(0x10,'a'); /*单字符写入到0x10,注意是单引号*/
∙ temp1 = EEPROMread(0x10); /*读一个字符到temp1*/


∙ EEPROM_WRITE(0x20,"abcdefg"); /*写字符串到0x20*/
∙ EEPROM_READ(0x20,temp2); /*读字符到temp2,temp2=a*/
∙ EEPROM_READ(0x20,buffer); /*读字符串到数组中 buffer[10]=abcdefg */

∙ EEPROM_WRITE(0x30,buf); /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/

∙ while(1)
∙ ;
∙}

调试后的效果:
调试eeprom的时候,记住设置Avr studio保护eeprom数据,否则每次都会将eeprom中的数据改为0xFF。

如下图:
打开调试选项:
钩选保护eeprom数据选项:
打开相关观测窗口:
按F10逐条语句运行,查看运行结果。

1. 地址10上的值被改写为“a”
2. temp1的值变为a,及读取了地址0x10的值a:
3. abcdefg写入20开始的地址:
4. temp2的变为地址20的值a:
5. 以0x20开始的值都读入buffer数组中:
6. 预定义的数组中的值写到EEPROM中:
7. 设置不保护EEPROM的值之后,停止调试再开始调试,EEPROM中的值改为0XFF:
通过以上的观察,我想你已经对EEPROM的操作有了一定的认识,同时,你可以打开eeprom.h查看内部内容,是如何定义函数的。

结构体的操作方法与数组类似:(一般简单应用中,你用不到下面的知识,看不懂没有关系,不要被吓倒了)
∙EEPROMWriteBytes(0x10,&red_flag,sizeof(red_flag)); //将结构写入EEPROM
∙EEPROMReadBytes(0x10,&red_flag,sizeof(red_flag)); //从EEPROM中将结构全部读出来
∙旗帜的结构为
∙/*
∙typedef struct
∙{
∙uint8 position; //0 底 1~180:中间 180:顶
∙uint8 fangxiang; //0 静止中 'u' : 向上 'd':向下
∙uint8 T; //0 总时间
∙uint8 t; //0 已经耗去的时间
∙uint8 S; //0 目标路程
∙uint8 s; //0 已经走过的路程
∙uint8 move_flag; //0 是否运动中
∙uint8 half_mode; //0 非半旗 1:半旗
∙uint8 purse; //0 没有暂停 1:暂停状态
∙uint8 half_short_or_long;//0 1:半旗长路程中 2:半旗短路程中∙uint16 maichong; //0 脉冲数目
∙}QIZHI;
∙QIZHI red_flag; //旗帜结构
*/。

相关文档
最新文档