AVR单片机EEPROM寄存器.(DOC)
avr寄存器详细资料{补充}
avr寄存器详细资料{补充}Atmega16单片机有32个通用I/O口,有PA~PD四组,每组都是8位。
其主要的寄存器有DDRXn(X=A,B,C,D;n=0,2,…,7,下同),PORTXn和PINXn。
I/O组合设置见表1。
表1 I/O组合设置DDRXn PORTXn I/O 上拉电阻说明0 0 输入否I/O三态输入0 1 输入是I/O口带上拉电阻输入1 0 输出否推免0输出1 1 输出否推免1输出1. PA 口寄存器(1)DDRABit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 DDRA7 DDRA6 DDRA5 DDRA4 DDRA3 DDRA2 DDRA1 DDRA0 (2)PORTABit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PORTA7 PORTA6 PORTA5 PORTA4 PORTA3 PORTA2 PORTA1 PORTA0 (3)PINABit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PINA7 PINA6 PINA5 PINA4 PINA3 PINA2 PINA1 PINA02. PB 口寄存器(1)DDRB(2)PORTBBit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0PORTB7 PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 (3)PINBBit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PINB7 PINB6 PINB5 PINB4 PINB3 PINB2 PINB1 PINB03. PC 口寄存器(1)DDRCBit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 DDRC7 DDRC6 DDRC5DDRC4 DDRC3 DDRC2 DDRC1 DDRC0 (2)PORTCBit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PORTC7 PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 (3)PINCBit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PINC7 PINC6 PINC5 PINC4 PINC3 PINC2 PINC1 PINC04. PD 口寄存器(1)DDRD(2)PORTDBit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0 PORTD7 PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 (3)PIND Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0PIND7 PIND6 PIND5 PIND4 PIND3 PIND2 PIND1 PIND0DDRX是方向寄存器,可读可写。
eeprom
}
在这种方式下变量在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 Atmage 系列单片机(中文)寄存器简介
Atmage 8 状态寄存器:SERG (P17)I:全局中断允许位T:位复制存储H:半进位标志位S:符号标志位V:2的补码溢出标志位N:负数标志位Z:0值标志位C:进位标志位SRAM:数据存储区Atmage 8 中断控制寄存器:GICR (P49)IVCE:中断向量表移位允许位IVSEL:中断向量表选择Atmage 8 I/O端口及寄存器I/O 方向寄存器:DDRx (可读写寄存器)I/O 数据寄存器:PORTx (可读写寄存器)I/O 输入引脚寄存器:PINx (只读寄存器)读PINxn 来获取当前引脚电平值Atmage 8 I/O特殊功能寄存器:SFIOR (P54)PUD:上拉电阻禁止位PSR2:T/C2预定比例分频器复位(写1复位,自动清零)ACME:模拟比较器多路使能ADHSM:ADC高速模式Atmage 8 8位T/C0控制寄存器寄存器:TCCR0 (P67)Atmage 8 8位T/C0计数寄存器寄存器:TCNT0 (P67)TCNT0是T/C0的计数值寄存器,可以直接被读写访问16位定时计数器C/T1 同样为TCNT1 (TCNT1H TCNT1L)TCNT2是T/C2 计数值寄存器Atmage 8定时计数器中断屏蔽寄存器:TIMSK (P67)TOIE0:T/C0 溢出中断允许位TICIE1:T/C1 输入捕获中断允许标志位OCIE1A:T/C1 输出比较A匹配中断允许标志位OCIE1B:T/C1 输出比较B匹配中断允许标志位TOIE1:T/C1 溢出中断允许位OCIE2:T/C2输出比较匹配中断允许标志位TOIE2:T/C2溢出中断允许位Atmage 8定时计数器中断标志寄存器:TIFR (P68)TOV0:T/C0 溢出中断标志位(硬件自动清零)ICF1:T/C1 输入捕获中断标志位(硬件自动清零)OCF1A:T/C1 输出比较A匹配中断标志位(TCNT1=OCR1A时)(硬件自动清零)OCF1B:T/C1 输出比较B匹配中断标志位(TCNT1=OCR1B时)(硬件自动清零)OCF2:T/C2输出比较匹配中断标志位(硬件自动清零)TOV2:T/C2溢出中断标志位(硬件自动清零)Atmage 8 16位定时计数器C/T1寄存器(P68)C/T1 时钟源可来自芯片内部也可来自外部引脚T1输入捕获单元:T/C1 的输入捕获单元用于捕获一个外部事件的发生以及世间发生的时间印记(Time-stamp)外部事件发生的触发信号由TCP1 输入,此外,模拟比较器的ACO 单元的输出信号也可作为外部事件捕获的触发信号输出比较寄存器:OCR1AH和OCR1AL OCR1BH和OCR1BL比较匹配输出单元标志位:COM1A COM1BT/C1 计数寄存器:TCNT1L TCNT1H输入捕获寄存器:ICR1H ICR1L组成16位输入捕获寄存器ICR1。
AVR单片机原理及应用
AVR单片机原理及应用AVR(Advanced Virtual RISC)是一种低功耗、高性能的单片机架构,由Atmel公司开发。
AVR单片机具有简单易学、高速、低功耗和丰富的外设等特点,在工业控制、电子设备、通信等领域应用广泛。
1.CPU:AVR单片机的核心部分,包括ALU(运算单元)、寄存器组和控制单元。
ALU负责执行加减乘除等基本运算,寄存器组用于保存数据和中间结果,控制单元用于控制指令执行。
2. 存储器:AVR单片机采用分布式存储器结构,包括程序存储器(Flash)和数据存储器(RAM)。
程序存储器用于保存程序指令,数据存储器用于保存数据和变量。
3.时钟电路:AVR单片机通过时钟电路来同步指令执行。
时钟信号控制着单片机内部各个部件的工作节奏,使其按照预定的频率工作。
4.外设接口:AVR单片机具有丰富的外设接口,包括通用IO口、串口、定时器、ADC(模拟转换器)等。
这些接口可用于连接外部设备,实现与外部环境的信息交互。
1.工业控制:AVR单片机具有高性能和丰富的外设接口,可应用于工业自动化控制领域。
例如,可用于控制温度、湿度、压力等参数,实现工业过程的自动化控制和监测。
2.电子设备:AVR单片机广泛应用于各类电子设备,如电子钟表、电子秤、电子计数器等。
其高速和低功耗特点使其特别适用于电子设备的控制和计算。
3. 通信:AVR单片机可以通过串口接口实现与其他设备的通信。
例如,可以用它来实现蓝牙、WiFi、Zigbee等无线通信模块的控制,实现设备之间的数据传输和通信。
4.智能家居:AVR单片机可应用于智能家居系统。
通过外设接口控制家居设备,如照明、空调、窗帘等,将其变为可远程控制和智能化管理的设备。
5.医疗设备:AVR单片机在医疗设备中的应用广泛,如体温计、血糖仪、血压计等。
通过与传感器结合,可以实现各种医疗参数的测量和监测。
总之,AVR单片机以其高性能、低功耗和丰富的外设接口在各个领域都有着广泛的应用前景。
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的读写分析
1.单片机(AVR)EEPROM的读写分析由于AVR的EEPROM写周期比较长(一般为毫秒级),因此在编程使用过程中要特别注意.对于读EEPROM没什么好说的,读一个字节的数据要耗费4个时钟周期,可以忍受,写就比较麻烦了,虽然放在EEPROM的数据都不是频繁访问的;虽然可以用读-比较-写的机制降低EEPROM的写操作频度,但在写入过程中,过长的写入周期还是会造成一些问题,下面就分析一下几种方式的EEPROM写操作.1.1.循环查询式将地址和数据写入EEPROM相关的寄存器,置写标志后就循环不断查询写完成标志,直到写完成,退出循环,顺序执行其他程序.在置写入标志到写完成的这段时间,程序除了不断查询写完成标志和响应硬件中断之外什么也不干,这段时间就这么浪费了,如果是个实时性要求比较高的应用,浪费的就不仅是时间了,很可能在这段时间里I/O状态的变化不能得到及时的响应,如果一下子要进行多个字节的EEPROM的写入操作,那情况会更糟.针对这种情况,有种解决办法就是,这个写完成查询放在软件的死循环中(无操作系统的情况下,系统启动后都要进入一个死循环),每循环一次查询一次写完成标志,这样就不必一直等待写操作完成而可以干别的事情了,但是这样会带来两个问题.一是,如果死循环周期无法保证,则每一次的EEPROM写操作的完成标志查询也得不到保证,从而进行一次EEPROM写操作的周期也无法保证(最长延迟时间就是一个死循环周期的最长时间);二是,在执行一次EEPROM写入操作到写完成这段时间里死循环里其它的子程序不能进行EEPROM读写操作.第一个问题如果能保证最大循环周期在延迟允许范围内就不是问题了,否则就得采取下面讲到的方式二了;第二个问题的解决方法是每次EEPROM读写操作都要在其中加入对EEPROM写完成标志寄存器的判断,如果有数据正在写入,则等待或退出,但等待和退出又会造成等待延迟和写入操作不成功的问题,解决办法是先放入一个数据缓冲区,待上一次写入操作完成,再从缓冲区里拽出一个字节进行下一次写入周期,但这又会涉及到选择合适的缓冲区大小以及的问题,这个问题在下面中断式操作里继续讨论.1.2.定时查询式在写入EEPROM地址和数据寄存器置写标志后启动定时器,定时查询写完成标志,这种方法继承了方式1的大部分优缺点,唯一的进步就是能够确定写操作延迟时间为定时周期.1.3.中断式编写EEPROM写完成中断子程序,设置一个FIFO缓冲区,要写入的数据先放入这个FIFO,如果EEPROM操作空闲,则从FIFO中揪一字节数据出来写EEPROM,置完写完成标志就返回,然后去干别的事情,EEPROM写完成产生一个中断,在中断服务程序中再从FIFO中揪一个字节去写EEPROM,如此循环直到FIFO空,这种方式虽然能在第一时间完成一次写操作,但是还是有个和和方式1中提到一样的问题,怎么选择这个FIFO的大小.小了,待写入数据可能溢出丢失,大了,多大算大,1K够不够,10K够不够,硬件上有这么多RAM空间么,这就需要根据实际资源和系统需求来定了.如果EEPROM写操作频率很低,比一次EEPROM写操作间隔还要长得多,那么几个单位的FIFO就足够了;如果EEPROM写操作频率可能很高或一次大批量连续写入数据就要求很大的FIFO,达到能够保证数据不丢失,这就要根据批量数据大小和写频率来定了,另外还要考虑可用RAM空间的限制来找出最佳值,同时有FIFO溢出一定要制定相应的应对措施.最后注意两点:1.读写之前一定要检测是否已经有EEPROM写操作;在写完成之后一定要再读出写入的数据校验写入操作是否成功,不成功则EEPROM损坏,要做好应对措施.2.如果要保存一个16位的数据,一定要保证在这16位数据分成的两字节都成功写入了EEPROM再去读该数据,否则在刚写完一个字节就去读该数据,得到的数据显然不是你想要的,如果该数据是一重要参数,后果可想而知.。
AVR单片机的基本结构
AVR单片机的基本结构AVR单片机是一种基于哈佛架构的RISC(精简指令集计算机)微控制器。
它由Atmel公司开发并被广泛应用于各种嵌入式系统中,包括电子设备、家用电器、自动化系统等。
本文将详细介绍AVR单片机的基本结构。
1.中央处理器(CPU):AVR单片机中的中央处理器是一个高度集成的数字逻辑电路,负责执行程序指令。
它包含一个ALU(算术逻辑单元)、控制逻辑单元(CLU)、寄存器堆等组件。
ALU负责执行算术和逻辑运算,CLU负责控制指令的执行流程,寄存器堆用于存储数据和临时结果。
2.存储器:存储器是AVR单片机用于存储程序指令和数据的地方。
AVR单片机一般包括闪存(Flash)和SRAM(Static Random Access Memory)两种类型的存储器。
闪存用于存储程序指令,而SRAM用于存储数据。
3.输入/输出(IO)端口:4.外设接口:AVR单片机通常包含多个外设接口,用于与外部设备进行通信。
常见的外设接口包括串口、SPI(Serial Peripheral Interface)、I2C(Inter-Integrated Circuit)等。
这些接口可以连接到其他外部器件,如传感器、LCD显示屏、EEPROM等。
1.外部时钟源提供时钟信号,控制指令的执行速度。
2.CPU从存储器中取指令,执行指令并根据指令的要求访问存储器或IO端口。
3.存储器中的程序指令被加载到CPU的指令寄存器中,被解码并执行。
4.CPU根据指令的要求进行算术运算、逻辑运算或IO操作。
5.结果存储在寄存器中,可供后续指令使用。
6.程序的执行过程中,CPU与IO端口进行交互来实现与外部设备的通信。
7.程序的运行可以通过中断来打断或启动其他任务。
1.低功耗:AVR单片机采用先进的封装技术、低功耗设计和省电模式,使其适用于依赖电池供电的嵌入式系统。
2.高性能:AVR单片机具有高效的指令集和优化的硬件逻辑,可以实现高速运算和响应。
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(); //调用显示程序}}。
AVR一些常用有关中断寄存器介绍
常配置:●MCU 控制寄存器-MCUCR 外部中断触发方式●SREG:全局中断控制寄存器SEI() ; CLI() ; SREG|=BIT(7);●通用中断控制寄存器- GICR 外部中断请求 INT0 INT1 INT2●定时器/ 计数器中断屏蔽寄存器- TIMSKMCUCSR: MCU 控制与状态寄存器(不常用)表示中断标志的寄存器一般在中断查询时用:●通用中断标志寄存器- GIFR●定时器/ 计数器中断标志寄存器- TIFRMCU 控制寄存器-MCUCR其他各个模块(如定时器,ADC,SPI,IIC,UART,EEPROM,看门狗)的中断控制在其相应的控制寄存器中,状态在其状态寄存器中MCUCSR: MCU 控制与状态寄存器• Bit 6 – ISC2: 中断2 触发方式控制异步外中断2 由外部引脚INT2 激活,如果SREG 寄存器的I 标志和GICR 寄存器相应的中断屏蔽位置位的话。
若ISC2 写0,INT2 的下降沿激活中断。
若ISC2 写1,INT2 的上升沿激活中断。
INT2 的边沿触发方式是异步的。
只要INT2 引脚上产生宽度大于Table 36所示数据的脉冲就会引发中断。
若选择了低电平中断,低电平必须保持到当前指令完成,然后才会产生中断。
而且只要将引脚拉低,就会引发中断请求。
改变ISC2 时有可能发生中断。
因此建议首先在寄存器GICR 里清除相应的中断使能位INT2,然后再改变ISC2。
最后,不要忘记在重新使能中断之前通过对GIFR 寄存器的相应中断标志位INTF2写'1’使其清零。
它的第7位与第四位与I/O 存储器中与边界扫描相关SREG:全局中断控制寄存器GICR:通用中断控制寄存器• B it 7 – INT1: 使能外部中断请求1当INT1 为'1’,而且状态寄存器SREG 的I 标志置位,相应的外部引脚中断就使能了。
MCU 通用控制寄存器– MCUCR的中断敏感电平控制1位1/0 (ISC11与ISC10)决定中断是由上升沿、下降沿,还是INT1 电平触发的。
最新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
以一个实例示范下即可。
基于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 的操作方法不同。
AVR单片机功能模块使用
AVR单片机功能模块使用AVR(Advanced Virtual RISC)是Atmel公司推出的8位和32位单片机微处理器架构,广泛应用于各种嵌入式系统和电子设备中。
AVR单片机具有丰富的功能模块,可以用于实现各种功能和应用。
以下是AVR单片机常用的一些功能模块及其使用方法:1.GPIO模块:GPIO(General Purpose Input/Output)即通用输入输出模块,用于连接外部设备,如开关、LED、继电器等。
可以通过配置寄存器设置引脚的输入或输出功能,并通过操作相应的寄存器进行读写操作。
2.定时器/计数器模块:3.PWM模块:PWM(Pulse Width Modulation)即脉宽调制模块,用于生成具有不同占空比的脉冲信号。
可以用来控制电机的转速、调节LED的亮度等。
可通过设置比较器和计数器的参数来生成不同占空比的PWM信号。
4.ADC模块:ADC(Analog to Digital Converter)即模数转换器模块,用于将模拟信号转换为数字信号。
可以用来测量电位器、光敏电阻等传感器的模拟信号。
可通过配置寄存器设置分辨率、参考电压和采样率等。
5.UART模块:UART(Universal Asynchronous Receiver/Transmitter)即通用异步接收/发送模块,用于与计算机或其他设备进行串口通信。
可以通过配置寄存器设置波特率、数据位、停止位和校验位等。
6.SPI模块:SPI(Serial Peripheral Interface)即串行外设接口模块,用于和外部SPI设备进行通信,如EEPROM、LCD等。
可以通过配置寄存器设置数据位、数据格式、时钟极性和相位等。
7.I2C模块:I2C(Inter-Integrated Circuit)即串行双线制接口模块,用于和外部I2C设备进行通信,如温湿度传感器、实时时钟等。
可以通过配置寄存器设置传输速率、地址选择和数据传输模式等。
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方法
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相关寄存器整理
A VR内核片内相关寄存器配置整理一、全局中断相关寄存器(1)SREG:状态寄存器I:全局中断使能位1:使能全局中断0:失能全局中断(2)GICR:通用中断控制寄存器IVSEL:中断向量选择位0:中断向量位于Flash起始位置1:中断向量位于引导区起始位置【注】修改IVSEL时需要遵照如下过程1. 置位中断向量修改使能位IVCE2. 在紧接的4个时钟周期里将需要的数据写入IVSEL,同时对IVCE写0 IVCE:中断向量修改使能位(1:使能对中断向量选择位IVSEL的修改)【注】该位可以通过写0清零,或在置位4 个时钟周期后自动清零二、外部中断相关寄存器ISC11,ISC10:外部中断1触发控制位ISC01,ISC00:外部中断0触发控制位(2)MCUCSR:MCU控制与状态寄存器ISC2:外部中断2触发控制位0:INT2下降沿产生中断请求1:INT2上升沿产生中断请求(3)GICR:通用中断控制寄存器INTx:外部中断请求使能位1:使能INTx外部中断请求0:使能INTx外部中断请求(4)GIFR:通用中断标志寄存器INTFx:外部中断标志位(1:产生中断请求,使能时进入INTx中断向量并自动清零)【注】该位可以通过写1清零三、系统控制复位及休眠相关寄存器(1)MCUCSR:MCU控制与状态寄存器JTRF:JTAG复位标志位(1:JTAG复位发生)【注】该位可以通过写0清零WDRF:看门狗复位标志位(1:看门狗复位发生)【注】该位可以通过写0清零BORF:掉电检测复位标志位(1:掉电检测复位发生)【注】该位可以通过写0清零EXTRF:外部复位标志位(1:外部复位发生)【注】该位可以通过写0清零PORF:上电复位标志位(1:上电复位发生)【注】该位可以通过写0清零(2)WDTCR:看门狗定时器控制寄存器WDTOE:看门狗修改使能位(1:使能对看门狗使能位WDE的清零操作)【注】该位在置位4个时钟周期后自动清零WDE:看门狗使能位1:使能看门狗0:失能看门狗【注】修改WDE时需要遵照如下过程1. 在同一个指令内对WDTOE和WDE写1,即使WDE已经为12. 在紧接的4个时钟周期之内对WDE写0WDPx:看门狗定时器预分频选择位(3)MCUCR:MCU控制寄存器SMx:休眠模式选择位SE:休眠使能位1:使能休眠模式,可以响应休眠指令0:失能休眠模式四、定时器/计数器0相关寄存器(1)TCCR0:T/C0控制寄存器FOC0:强制输出比较位1:写1时,波形发生器立即进行比较操作,即强制执行比较匹配时执行的工作【注】非PWM模式时有效,CTC模式不清零定时器,读其返回值永远为0,在使用PWM时要对其写0COM0x:比较匹配输出模式选择位当T/C0工作模式为普通模式或CTC模式时当T/C0工作模式为快速PWM模式时当T/C0工作模式为相位修正PWM模式时(2)TCNT0:T/C0数据寄存器MSB—LSB:T/C0数据位【注】记录了当前定时器的数值(3)OCR0:输出比较寄存器0MSB—LSB:T/C0输出比较数据位【注】记录了预设的输出比较数值,匹配事件可以产生比较中断或在OC0引脚产生波形(4)TIMSK:T/C中断屏蔽寄存器OCIE0:T/C0输出比较匹配中断使能位1:使能T/C0的输出比较匹配中断0:失能T/C0的输出比较匹配中断TOIE0:T/C0溢出中断使能位1:使能T/C0的溢出中断0:失能T/C0的溢出中断(5)TIFR:T/C中断标志寄存器OCF0:T/C0输出比较匹配标志位(1:产生比较匹配,中断使能时进入比较匹配中断向量并自动清零)【注】该位可以通过写1清零TOV0:T/C0溢出标志位(1:产生溢出,中断使能时进入溢出中断向量并自动清零)【注】该位可以通过写1清零PSR10:T/C1与T/C0预分频器复位操作位(1:T/C1与T/C0的预分频器复位)【注】该位在操作完成后自动清零,读该位返回值永远为0【注】使用此复位时对T/C0及T/C1两定时器均有影响五、定时器/计数器1相关寄存器(1)TCCR1A:T/C控制寄存器ACOM1xy:通道x比较匹配输出模式选择位当T/C1工作模式为普通模式或CTC模式时当T/C1工作模式为快速PWM模式时当T/C1工作模式为相位修正PWM模式或相频修正PWM模式时FOC1x:通道x强制输出比较位1:写1时,波形发生器立即进行比较操作,即强制执行比较匹配时执行的工作【注】非PWM模式时有效,CTC模式不清零定时器,读其返回值永远为0,在使用PWM时要对其写0 WGM1x:波形发生模式选择位(与TCCR1B寄存器中WGM1x共同决定波形发生模式)(2)TCCR1B:T/C控制寄存器BICNC1:输入捕捉噪声抑制器使能位1:使能输入捕捉噪声抑制器,使输入捕捉更准确,但有4个时钟周期的延迟0:失能输入捕捉噪声抑制器ICES1:输入捕捉触发沿选择位1:ICP1引脚上升沿触发输入捕捉0:ICP1引脚下降沿触发输入捕捉WGM1x:波形发生模式选择位(与TCCR1A寄存器中WGM1x共同决定波形发生模式)【注】详见TCCR1A寄存器中WGM1x位CS1x:T/C1时钟选择位(3)TCNT1H/TCNT1L:T/C1数据寄存器MSB—LSB:T/C1数据位【注】记录了当前定时器的数值(4)OCR1AH/OCR1AL:输出比较寄存器1AMSB—LSB:T/C1输出比较数据位A【注】记录了预设的输出比较数值,匹配事件可以产生比较中断或在OC1A引脚产生波形(5)OCR1BH/OCR1BL:输出比较寄存器1BMSB—LSB:T/C1输出比较数据位B【注】记录了预设的输出比较数值,匹配事件可以产生比较中断或在OC1B引脚产生波形(6)ICR1H/ICR1L:输入捕捉寄存器1MSB—LSB:输入捕捉寄存器1【注】在ICP1引脚捕捉到信号后,将当前TCNT1x存入ICR1x,在ICR1H读取后,两寄存器数据清空【注】部分波形产生模式中,ICR1x作为计数器TOP值,操作时要先写入ICR1H,后写入ICR1L (7)TIMSK:T/C中断屏蔽寄存器TICIE1:T/C1输入捕捉中断使能位1:使能T/C1的输入捕捉中断0:失能T/C1的输入捕捉中断OCIE1x:T/C1输出比较x匹配中断使能位1:使能T/C1的输出比较匹配中断0:失能T/C1的输出比较匹配中断TOIE1:T/C1溢出中断使能位1:使能T/C1的溢出中断0:失能T/C1的溢出中断(8)TIFR:T/C中断标志寄存器ICF1:T/C1输入捕捉标志位(1:出现输入捕捉事件,中断使能时进入输入捕捉中断向量并自动清零)【注】该位可以通过写1清零OCF1x:T/C1输出比较x匹配标志位(1:产生比较匹配,中断使能时进入比较匹配中断向量并自动清零)【注】该位可以通过写1清零TOV1:T/C1溢出标志位(1:产生溢出,中断使能时进入溢出中断向量并自动清零)【注】该位可以通过写1清零六、模数转换相关寄存器(1)SFIOR:特殊功能I/O寄存器ADTSx:ADC自动触发源选择位(2)ADCSRA:ADC控制与状态寄存器AADEN:ADC使能位1:使能ADC转换0:失能ADC转换ADSC:ADC开始转换(1:启动一次ADC转换,在连续转换模式下将启动首次转换)【注】该位在ADC转换结束后自动清零ADA TE:ADC自动触发使能位1:使能ADC自动触发功能,由选定触发源信号触发ADC转换0:失能ADC自动触发功能ADIF:ADC中断标志位(1:ADC转换结束产生中断请求)【注】该位可以通过写1清零ADIE:ADC中断使能位1:使能ADC转换结束中断0:失能ADC转换结束中断(3)ADCH/ADCL:ADC数据寄存器当ADLAR=0时,即为转换结果右对齐时ADCH:ADC高位数据寄存器ADCL:ADC低位数据寄存器当ADLAR=1时,即为转换结果左对齐时ADCL:ADC低位数据寄存器【注】在ADCH读取后,两寄存器数据清空,允许存入新的数据(4)ADMUX:ADC多工选择寄存器REFSx:参考电压选择位ADLAR:ADC转换结果对齐方式选择位1:ADC转换结果左对齐0:ADC转换结果右对齐七、串行SPI相关寄存器(1)SPCR:SPI控制寄存器SPIE:SPI中断使能位1:使能SPI中断,SPI通信结束后会产生中断请求位0:失能SPI中断SPE:SPI使能位1:使能SPI通信0:失能SPI通信DORD:数据次序选择位1:LSB首先发送0:MSB首先发送MSTR:主/从选择位1:选择为主机模式0:选择为从机模式【注】当SS为输入且被拉低时,会自动清零CPOL:时钟极性选择位1:空闲时SCK为高电平0:空闲时SCK为低电平CPHA:时钟相位选择位1:在SCK结束沿采样数据0:在SCK起始沿采样数据SPRx:SPI时钟速率选择位(与SPI2X位共同决定SPI时钟频率)(2)SPSR:SPI状态寄存器SPIF:SPI中断标志位(1:产生SPI中断请求)【注】可以通过读取SPSR后访问SPDR对该位清零WCOL:写碰撞标准位(1:发生写碰撞,即在数据发送中对SPDR写数据)【注】可以通过读取SPSR后访问SPDR对该位清零SPI2X:SPI倍速控制位(1:SPI速率翻倍,主机最大速率可达f OSC/2,从机只可达f OSC/4)【注】详见SPRx位(3)SPDR:SPI数据寄存器MSB—LSB:SPI数据位【注】写数据将启动数据传输,读数据将读取接受缓冲器八、同/异步串行USART相关寄存器(1)UDR:USART I/O数据寄存器(包括RXB部分和TXB部分,共享相同地址)MSB—LSB(RXB/R):USART发送数据缓冲寄存器MSB—LSB(TXB/W):USART接收数据缓冲寄存器【注】写入时对TXB操作,读取时对RXB操作,发送模式未发送数据时写入数据,将启动数据发送(2)UCSRA:USART控制和状态寄存器ARXC:USART接收结束标志位(1:USART接收缓冲器中有未读出数据)【注】该位在读取接收缓冲器后或接收器被禁止时清零TXC:USART发送结束标志位(1:USART发送结束,且发送缓冲器为空)【注】该位可以通过写1清零,在执行发送结束中断后自动清零UDRE:USART数据寄存器空标志位(1:发送缓冲器为空,可以写入新的数据)【注】该位随数据寄存器实时改变,不能被清零FE:帧错误标志位(1:接收到的下一个字符有帧错误,即第一个停止位为0)【注】该位在接收缓冲器被读取后清零,写入数据时要对该位写0DOR:数据溢出标志位(1:接收缓冲器发生数据溢出,即接收缓冲器积存三个以上数据)【注】该位在接收缓冲器被读取后清零,写入数据时要对该位写0PE:奇偶校验错误标志位(1:奇偶校验使能后,接收到的下一个字符有奇偶校验错误)【注】该位在接收缓冲器被读取后清零,写入数据时要对该位写0U2X:倍速发送控制位(1:USART异步通信速率翻倍)【注】该位仅对异步操作有影响,同步操作时对此位写0,详见MPCM:多处理器通信模式使能位1:使能多处理器通讯模式0:失能多处理器通讯模式【注】使能后,接收器接收到的所有不包含地址信息的输入帧都将被忽略,该位对发送器无影响,(3)UCSRB:U SART控制和状态寄存器BRXCIE:接收结束中断使能位1:使能接收结束中断0:失能接收结束中断TXCIE:发送结束中断使能位1:使能发送结束中断0:失能发送结束中断UDRIE:USART数据寄存器空中断使能位1:使能USART数据寄存器空中断0:失能USART数据寄存器空中断RXEN:接收使能位1:使能USART接收功能,启动USART接收器,RXD引脚启动USART功能0:失能USART接收功能TXEN:发送使能位1:使能USART发送功能,启动USART发送器,TXD引脚启动USART功能0:失能USART发送功能【注】数据发送过程中清零该位,会在发送缓冲器中的数据发送完成后关闭USART发送功能UCSZ2:字符长度控制位(与UCSZx共同决定数据帧所包含的数据位数)【注】详见UCSZx位RXB8:接收数据位8【注】在9位帧数据模式下,该位为接收数据的第9位,该位要在读取UDR之前读取TXB8:发送数据位8【注】在9位帧数据模式下,该位为发送数据的第9位,该位要在写入UDR之前写入(4)UCSRC:U SART控制和状态寄存器C(UCSRC与UBRRH共用相同地址)URSEL:寄存器选择位1:写寄存器时写入UCSRC,读寄存器时读出为UCSRC0:写寄存器时写入UBRRH,读寄存器时读出为UBRRH【注】在相邻两时钟周期读取UBRRH与UCSRC,则第一次返回UBRRH的值,第二次返回UCSRC的值UMSEL:USART模式选择位1:同步模式0:异步模式UPMx:奇偶校验模式选择位USBS:停止位选择位1:设置2位停止位0:设置1位停止位UCSZx:字符长度控制位(与UCSZ2共同决定数据帧所包含的数据位数)UCPOL【注】该位仅用于同步工作模式,异步工作模式下写0(5)UBRRH/UBRRL:USART波特率寄存器(UBRRH与UCSRC共用相同地址)URSEL:寄存器选择位1:写寄存器时写入UCSRC,读寄存器时读出为UCSRC0:写寄存器时写入UBRRH,读寄存器时读出为UBRRH【注】在相邻两时钟周期读取UBRRH与UCSRC,则第一次返回UBRRH的值,第二次返回UCSRC的值UBRRx:USART波特率寄存器选择位(数值范围0—4095)【注】同步从机模式由外部时钟驱动,且外部XCK最大时钟频率由公式f XCK < f OSC4限制九、两线串行TWI相关寄存器(1)TWBR:TWI比特率寄存器TWBRx:TWI比特率寄存器(数值范围0—255)【注】工作于主机模式时,TWI工作频率为SCL引脚输出频率,频率为f SCL =f OSC16+2•TWBR•4TWPS【注】工作于从机模式时,TWI工作频率由公式f SCL < f OSC16限制(2)TWCR:TWI控制寄存器TWINT:TWI中断标志位(1:捕捉到TWI事件,如接收或发送一个信号)【注】该位可以通过写1清零,在该位清零后TWI立即开始工作,在进入TWI后不会自动清零TWEA:TWI应答使能位1:使能TWI应答,出现应答条件时,接口发出应答脉冲0:失能TWI应答,器件脱离总线【注】发出应答脉冲的条件1:器件的从机地址与主机发出的地址相符合2:TWI广播识别使能时接收到TWI广播3:主/ 从机接收模式下接收到一个字节的数据TWSTA:TWI STAR T状态位(1:检测TWI总线,直到总线空闲,产生START状态以声明自己为主机)【注】发出STRAT状态后该位必须软件清零TWSTO:TWI STOP状态位(1:主机模式下产生STOP状态,从机模式下从错误状态恢复到未被寻址状态)【注】该位在生效后自动清零TWWC:TWI写碰撞标志位(1:TWINT为0时向数据寄存器写入数据)【注】当TWINT为1时,每次想数据寄存器写入数据时都会清零该位TWEN:TWI使能位1:使能TWI操作,激活TWI接口0:失能TWI操作,TWI传输被终止TWIE:TWI中断使能位1:使能TWI中断0:使能TWI中断(3)TWSR:TWI状态寄存器【注】读取时视数据后面包含三位0,具体状态参考数据手册TWPSx:TWI预分频选择位(4)TWDR:TWI数据寄存器MSB—LSB:TWI数据位【注】根据情况不同,其内容为要发送的下一个字节数据,或接收到的数据(5)TW AR:TWI从机地址寄存器TWAx:TWI从机地址寄存器【注】工作于从机模式时根据此地址响应,主机模式时不需要此地址TWGCE:TWI广播识别使能位1:使能TWI总线广播识别0:失能TWI总线广播识别。
【精品】第2章AVR单片机的基本结构
AVR单片机的基本结构单片机是构成单片机嵌入式系统的核心器件。
本章首先将介绍一般单片机的基本结构和组成,使大家对单片机芯片的内部硬件有基本了解和认识。
掌握了单片机的基本结构和组成,对学习、了解任何一种类型单片机的工作原理,编写单片机的系统软件以及和设计外围电路都是非常重要的.AVR是美国ATMEL公司推出的一款采用RISC指令的8位高速单片机。
本章将以ATmega16为主线,介绍和讲述AVR单片机内核的基本结构、引脚功能、工作方式等.深入的理解和掌握AVR的基本结构,对后续章节的学习、以及对实际的应用AVR单片机都是非常重要的。
2.1单片机的基本组成2.1.1单片机的基本组成结构单片机嵌入式系统的核心部件是单片机,其结构特征是将组成计算机的基本部件集成在一块晶体芯片上,构成一片具有特定功能的单芯片计算机-单片机。
一片典型单片机芯片内部的基本组成结构如图2-1所示。
从单片机的基本组成可以看出,在一片(单片机)芯片中,集成了构成一个计算机系统的最基本的单元:如CPU、程序(指令)存储器、数据存储器、各种类型的输入/输出接口等。
CPU同各基本单元通过芯片内的内部总线(包括数据总线、地址总线和控制总线)连接。
一般情况下,内部总线中的数据总线宽度(或指CPU的字长)也是标定该单片机等级的一个重要指标。
一般讲,低档单片机的内部数据总线宽度为4位(4位机),普通和中档单片机的内部数据总线宽度一般为8位(8位机),高档单片机内部数据总线宽度为16或32位。
内部数据总线宽度越宽,单片机的处理速度也相应的提高,功能也越强.2.1.2单片机基本单元与作用下面分别对单片机芯片中所集成的各个组成部分予以简要介绍.1.MCU单元(MicrocontrollerUnit)MCU单元部分包括了CPU、时钟系统、复位、总线控制逻辑等电路.CPU是按照面向测控对象、嵌入式应用的要求设计的,其功能有进行算术、逻辑、比较等运算和操作,并将结果和状态信息与存储器以及状态寄存器进行交换(读/写)。
嵌入式学习笔记21——AVR单片机之片内EEPROM
嵌入式学习笔记21——AVR单片机之片内EEPROM1. ATmega16 单片机内部具有512 字节的EEPROM,它是一个独立的数据空间。
数据读写以一字节为单位,通过专用的指令来实现对EEPROM 的操作,也可通过ISP,JTAG,并行编程的方式实现EEPROM 的读写;采用内部RC振荡器的1MHz 作为访问的定时时钟,其编程使用周期8848 个周期,时间大约8.5ms;操作过程中尽量关闭中断,保证时序不被打断。
2. EEPROM 存储器相关的寄存器程序中可直接对地址寄存器EEAR 赋值,如EEAR=0x01BA。
控制寄存器EECR 用于控制单片机对EEPROM 的操作位3EERIE:EEPROM 中断准备好使能位。
当EERIE 置1 而且全局中断I 置位时,如果EEWE 为0,则单片机产生一个中断表示写操作完成。
(即置1 后,才能在全中断I 为1,且EEWE 为0 时产生写操作完成中断。
)位2EEMWE:EEPROM 主写使能位。
当EEMWE 为1 时,设置EEWE 为1 将把EEDR 中的数据写入EEAR 所选择的的地址空间中(只是写入地址空间,还没有真正写入到EEPROM)。
如果EEMWE 为0,则EEWE 无效。
EEMWE 在被用户置1 后的4 个时钟周期后被硬件清0。
位1EEWE:EEPROM 写使能位。
当EEPROM 的地址和数据准备好之后,用户必须设置EEWE 为1,才能将数据写入EEPROM 中,在置EEWE 为1 之前,EEMWE 必须置1,否则写入操作无效。
EEPROM 数据的写入操作如下:a 等待EEWE 为0;b 把EEPROM 的地址写入EEAR;c 把EEPROM 的数据写入EEDR;d 置EEMWE 为1;e 在置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 控制寄存器- EECR· Bits 7..4 – Res: 保留保留位,读操作返回值为零。
· Bit 5, 4 – EEPM1 与 EEPM0: EEPROM 编程模式位EEPROM编程模式位的设置决定对EEPE写入后将触发什么编程方式。
EEPROM的编程可以作为一个原子操作来实现擦除老的数据并写入新的数据,也可以将擦除与写操作分为两步进行。
不同编程模式的时序请见 Table2。
EEPE 置位时,对 EEPMn 的任何写操作都将会被忽略。
在复位过程中,除非 EEPROM 处于编程状态,EEPMn 位将被设置为 0b00。
· Bit 3 – EERIE: 使能 EEPROM 准备好中断若 SREG 的 I 为 "1",则置位 EERIE 使能 EEPROM 准备好中断。
清零 EERIE 则禁止此中断。
当 EEPE 清零时 EEPROM准备好中断即可发生。
· Bit 2 – EEMPE: EEPROM 写使能EEMPE决定设置EEPE为"1“是否可以启动EEPROM写操作。
当EEMPE为"1“时,在4个时钟周期内置位 EEPE 将把数据写入 EEPROM 的指定地址;若 EEMPE 为"0“,则EEPE不起作用。
EEMPE置位后4个周期,硬件对其清零。
见EEPROM写过程对EEPE位的描述。
· Bit 1 – EEPE: EEPROM 写使能写使能信号 EEPE 是 EEPROM 的写入选通信号。
当 EEPROM 数据和地址设置好之后,需置位EEPE 以便将数据写入 EEPROM。
此时 EEMPE 必须置位,否则 EEPROM 写操作将不会发生。
写时序如下 ( 第 3 和第 4 步的次序可更改 ):1. 等待EEPE 位变为零2. 等待SPMCSR 中的SPMEN 位变为零3. 将新的EEPROM 地址写入EEAR ( 可选)4. 将新的EEPROM 数据写入EEDR ( 可选)5. 对EECR 寄存器的EEMPE 写"1",同时清零EEPE6. 在置位EEMPE 的4 个周期内,置位EEPE在 CPU 写 Flash 存储器的时候不能对 EEPROM 进行编程。
在启动 EEPROM写操作之前软件必须要检查Flash写操作是否已经完成。
第二步仅在软件包含引导程序,允许CPU对 Flash 进行编程时才有用。
如果 CPU 永远都不会写 Flash,则第二步可以忽略。
请参考P240“Boot Loader 支持 RWW 自编程, ATmega88 与ATmega168”。
(注意:ATmega48 无Boot Loader)注意 : 如有中断发生于步骤 5 和 6 之间将导致写操作失败。
因为此时 EEPROM 写使能操作将超时。
如果一个操作EEPROM的中断打断了另一个EEPROM操作,EEAR或EEDR寄存器可能被修改,引起 EEPROM 操作失败。
建议此时关闭全局中断标志 I。
经过写访问时间之后,EEPE硬件清零。
用户可以凭此位判断写时序是否已经完成。
EEPE置位后, CPU 要停止两个时钟周期才会运行下一条指令。
· Bit 0 – EERE: EEPROM 读使能读使能信号 EERE是 EEPROM的写入选通信号。
当 EEPROM地址设置好之后,需置位EERE 以便将数据读入EEAR。
EEPROM数据的读取只需要一条指令。
读取EEPROM时 CPU 要停止 4 个时钟周期然后才能执行下一条指令。
用户在读取EEPROM 时应该检测EEPE。
如果一个写操作正在进行,就无法读取EEPROM,也无法改变寄存器EEAR。
经过校准的片内振荡器用于EEPROM定时。
标定的振荡器用于 EEPROM 访问定时。
Table3 为 CPU 访问 EEPROM的典型时间。
下面的代码分别用汇编和C函数说明如何实现EEPROM的写操作。
在此假设中断不会在执行这些函数的过程当中发生。
例子同时还假设软件没有引导程序。
若引导程序存在,则 EEPROM 写函数还需要等待正在进行的 SPM 命令的结束。
汇编代码例程EEPROM_write:; 等待上一次写操作结束sbic EECR,EEPErjmp EEPROM_write; 设置地址寄存器 (r18:r17)out EEARH, r18out EEARL, r17; 将数据写入数据寄存器(r16)out EEDR,r16; 置位EEMPEsbi EECR,EEMPE; 置位EEPE 以启动写操作sbi EECR,EEPEretC 代码例程void EEPROM_write(unsigned int uiAddress, unsigned char ucData){/* 等待上一次写操作结束 */while(EECR & (1<<EEPE));/* 设置地址和数据寄存器*/EEAR = uiAddress;EEDR = ucData;/* 置位EEMPE */EECR |= (1<<EEMPE);/* 置位EEPE 以启动写操作*/EECR |= (1<<EEPE);}下面的例子说明如何用汇编和C 函数来读取EEPROM,在此假设中断不会在执行这些函数的过程当中发生。
汇编代码例程EEPROM_read:; 等待上一次写操作结束sbic EECR,EEPErjmp EEPROM_read; 设置地址寄存器 (r18:r17)out EEARH, r18out EEARL, r17; 设置EERE 以启动读操作sbi EECR,EERE; 自数据寄存器读取数据in r16,EEDR retC 代码例程unsigned char EEPROM_read(unsigned int uiAddress){/* 等待上一次写操作结束 */while(EECR & (1<<EEPE));/* 设置地址寄存器*/EEAR = uiAddress;/* 设置EERE 以启动读操作*/EECR |= (1<<EERE);/* 自数据寄存器返回数据 */return EEDR;}在掉电休眠模式下的EEPROM写操作若程序执行掉电指令时EEPROM的写操作正在进行,EEPROM的写操作将继续,并在指定的写访问时间之前完成。
但写操作结束后,振荡器还将继续运行,单片机并非处于完全的掉电模式。
因此在执行掉电指令之前应结束EEPROM 的写操作。
防止EEPROM 数据丢失若电源电压过低,CPU 和EEPROM 有可能工作不正常,造成EEPROM 数据的毁坏( 丢失)。
这种情况在使用独立的EEPROM 器件时也会遇到。
因而需要使用相同的保护方案。
由于电压过低造成EEPROM 数据损坏有两种可能:一是电压低于EEPROM 写操作所需要的最低电压;二是CPU 本身已经无法正常工作。
EEPROM 数据损坏的问题可以通过以下方法解决:当电压过低时保持AVR RESET信号为低。
这可以通过使能芯片的掉电检测电路BOD来实现。
如果BOD 电平无法满足要求则可以使用外部复位电路。
若写操作过程当中发生了复位,只要电压足够高,写操作仍将正常结束。
(注:素材和资料部分来自网络,供参考。
请预览后才下载,期待你的好评与关注!)。