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查看内部内容,是如何定义函数的。

结构体的操作方法与数组类似:(一般简单应用中,你用不到下面的知识,看不懂没有关系,不要被吓倒了)
∙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; //旗帜结构
*/。

合集下载

AVR单片机内部EEPROM方法

AVR单片机内部EEPROM方法
Hidden 16
uchar
DispTab[17]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0
xC6,0xA1,0x86,0x8E,0xFF};uchar
BitTab[6]={0x7F,0xBF,0xDF,0xEF,0xF7,0xFB};uchar DispBuf[6];//显示缓冲区
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!
temp=eeprom_read_byte(Addr);DispBuf[5]=temp;if(++Count==1000){Count=0;
Counter++;eeprom_write_bytgt;=10)Counter=0;//计数
值在0~9之间循环disp(); //调用显示程序}}
intmain(void){unsignedintCount=0;unsignedcharAddr=1;//向地址1里面写数
字uint8_ttemp=0;io_init();DispBuf[0]=Hidden;DispBuf[1]=Hidden;DispBuf[2]
=Hidden;DispBuf[3]=Hidden;DispBuf[4]=0;//次低位显示0while(1){
voidmDelay(uintDelayTim){uinti;for(;DelayTim>0;DelayTim--){for(i=0;ivoid
disp(){uchari;uchartmp;if(++i>=6)i=0;PORTC=0xff;//关闭显示tmp=DispBuf[i];
PORTA=DispTab[tmp];tmp=BitTab[i];PORTC=tmp;mDelay(1); //延时1ms}

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常用操作

AVR常用操作

IAR编译器配置(AVR )一、EEPROM 区域数据存储:__eeprom unsigned char a;//定义一个变量存放在EEPROM空间__eeprom unsigned char a @ 0x8;//定义一个变量存放在EEPROM空间0X08单元__eeprom unsigned char p[] @ 0x22//定义一个数组存放在EEPROM空间,开始地址为0X22单元__eeprom unsigned char a @ 0x08=9;//定义一个常数存放在EEPROM空间0X08单元__eeprom unsigned char p[] @0x22={1,2,3,4,5,6,7,8};EEPROM操作宏取函数:在comp_a90.h intrinsics.h头文件里有详细说明。

自动生成.eep文件置:在Project->Options->linker->config>的linker command line中观察该Project使用了哪个XCL文件。

本文使用M8编译,使用文件是”TOOLKIT_DIR$\src\template\cfgm8.xcl”-Ointel-extended,(CODE)=.hex-Ointel-extended,(XDATA)=.eep二、FLASH 区域数据存储:用关键字__flash 控制来存放,__ flash 关键字写在数据类型前后效果一样__flash unsigned char a @ 0x8;//定义变量存放在flash 空间0X08单元__flashunsigned char p[] @ 0x22//定义数组存放在flash 空间,开始地址为0X22单元__flash unsigned char a @ 0x08=9;//定义常数存放在flash 空间0X08单元__flash unsigned char p[] @ 0x22={1,2,3,4,5,6,7,8};unsigned int __flash * p;//定义个指向flash 空间地址的指针,16位。

AVR片内EEPROM模拟FLASH的优化方法

AVR片内EEPROM模拟FLASH的优化方法

AVR片内EEPROM模拟FLASH的优化方法概述在AVR片内(内置)的EEPROM模拟FLASH存储的过程中,我们需要考虑如何优化代码以提高性能和效率。

本文档将介绍一些简单的优化方法,以确保良好的性能和稳定的EEPROM模拟FLASH储存过程。

优化方法1. 合理使用EEPROM和FLASH存储根据实际需求,合理使用EEPROM和FLASH存储。

EEPROM 存储器可以用于存储需要频繁修改的数据,而FLASH存储器则适合存储不频繁修改的数据。

2. 使用EEPROM指针使用EEPROM指针来快速访问EEPROM存储器中的数据。

通过使用指针来读取和写入EEPROM存储器中的数据,可以提高读写速度和效率。

3. 批量读写操作在进行EEPROM模拟FLASH储存时,尽可能使用批量读写操作,而不是逐个读写。

这样可以减少读写次数,提高存储过程的效率。

4. 数据压缩对需要存储的数据进行压缩可以减少存储空间,提高存储效率。

使用有效的压缩算法可以将数据压缩到最小的空间,同时保证数据的完整性。

5. 数据校验在进行数据读取和写入时,使用合适的校验算法来保证数据的完整性和准确性。

可以使用CRC或校验和等算法对数据进行校验,以确保存储过程的可靠性。

结论通过合理使用EEPROM和FLASH存储、使用EEPROM指针、批量读写操作、数据压缩和数据校验等优化方法,我们可以提高AVR片内EEPROM模拟FLASH存储的性能和效率。

在实际应用中,根据具体需求和场景选择合适的优化方法,将有助于提升系统的稳定性和性能。

(Word count: 201)。

AVR单片机内部EEPROM应用方法

AVR单片机内部EEPROM应用方法

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

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

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

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

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

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使用的流程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、校验写入的数据等操作。

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

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 状态位被清除时触发的。

最新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 读取的数据。

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
以一个实例示范下即可。

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