AVR使用范例EEPROM使用详解

合集下载

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}

eeprom

eeprom
while(1);
}
在这种方式下变量在EEPROM 存储器内的具体地址由编译器自动分配。相对方式一,数据在EEPROM 中的具体位置是不透明的。
为EEPROM 变量赋的初始值,编译时被分配到.EEPROM 段中,可用avr-objcopy 工具从.elf文件中提取并产生ihex 或binary 等格式的文件。
段.initN 和段.finiN 是个程序块,它不会象函数那样返回,所以汇编或C 程序不能调用。
const char flash_str1[] PROGMEM = “全局定义字符串”;
int main(void)
{
int I;
char *flash_str2=PSTR(“函数内定义字符串”);
while(1)
{
scanf(“%d”,&I);
printf_P(flash_str1);
int main(void)
{
unsigned char val2;
EEPROM_busy_wait();
EEPROM_write_byte (&val1, 0xAA); /* 写 val1 */
EEPROM_busy_wait();
val2 = EEPROM_read_byte(&val1); /* 读 val1 */
2.2 I/O 寄存器操作
I/O 专用寄存器(SFR)被编址到与内部SRAM 同一个地址空间,为此对它的操作和SRAM 变量操作类似。
SFR 定义文件的包含:
#include
io.h 文件在编译器包含路径下的avr 目录下,由于AVR 各器件间存在同名寄存器地址有不同的问题,io.h 文件不直接定义SFR 寄存器宏,它根据在命令行给出的 –mmcu 选项再包含合适的 ioxxxx.h 文件。

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

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(); //调用显示程序}}。

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

  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:。

相关文档
最新文档