AVR教程系列一(8):ATmega16 简介(三)_第1页
AVR教程系列一(8):ATmega16 简介(三)_第2页
AVR教程系列一(8):ATmega16 简介(三)_第3页
AVR教程系列一(8):ATmega16 简介(三)_第4页
AVR教程系列一(8):ATmega16 简介(三)_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、ATmega16 简介(三)ATmega16 指令执行时序这一节介绍指令执行过程中的访问时序。AVR CPU 由系统时钟clkCPU 驱动。此时钟直接来自选定的时钟源。芯片内部不对此时钟进行分频。Figure 6 说明了由Harvard 结构决定的并行取指和指令执行,以及可以进行快速访问的寄存器文件的概念。这是一个基本的流水线概念,性能高达1 MIPS/MHz,具有优良的性价比、功能/ 时钟比、功能/ 功耗比。Figure 7 演示的的是寄存器文文件内部访问问时序。在一一个时钟周期期里,ALUU 可以同时时对两个寄存存器操作数进进行操作,同同时将结果保保存到目的寄寄存器中去。ATmega116

2、 复位与与中断处理AVR有不同的的中断源。每每个中断和复复位在程序空空间都有独立立的中断向量量。所有的中中断事件都有有自己的使能能位。当使能能位置位,且且状态寄存器器的全局中断断使能位I 也置位时,中中断可以发生生。根据程序序计数器PCC 的不同,在在引导锁定位位BLB022 或BLBB12 被编编程的情况下下,中断可能能被自动禁止止。这个特性性提高了软件件的安全性。详详见 P2447“ 存储储器编程” 的描述。程程序存储区的的最低地址缺缺省为复位向向量和中断向向量。完整的的向量列表请请参见 P443“中断”。列列表也决定了了不同中断的的优先级。向向量所在的地地址越低,优优先级越高。RRESE

3、T 具有最高的的优先级,第第二个为INNT0 外部中断请请求0。通过过置位MCUU 控制寄存存器 (MCCUCR) 的IVSEEL,中断向向量可以移至至引导Flaash的起始始处。编程熔熔丝位BOOOTRST也也可以将复位位向量移至引引导Flassh的起始处处。具体参见见P234“支支持引导装入入程序 在写的同时时可以读(RRWW,Reead-Whhile-WWrite) 的自我编编程能力”。任一中断发生时全局中断使能位I 被清零,从而禁止了所有其他的中断。用户软件可以在中断程序里置位I 来实现中断嵌套。此时所有的中断都可以中断当前的中断服务程序。执行RETI 指令后I 自动置位。从根本上说有

4、两种类型的中断。第一种由事件触发并置位中断标志。对于这些中断,程序计数器跳转到实际的中断向量以执行中断处理程序,同时硬件将清除相应的中断标志。中断标志也可以通过对其写”1” 的方式来清除。当中断发生后,如果相应的中断使能位为“0”,则中断标志位置位,并一直保持到中断执行,或者被软件清除。类似的,如果全局中断标志被清零,则所有已发生的中断都不会被执行,直到I 置位。然后挂起的各个中断按中断优先级依次执行。第二种类型的中断则是只要中断条件满足,就会一直触发。这些中断不需要中断标志。若中断条件在中断使能之前就消失了,中断不会被触发。AVR 退出中断后总是回到主程序并至少执行一条指令才可以去执行其他被

5、挂起的中断。要注意的是,进入中断服务程序时状态寄存器不会自动保存,中断返回时也不会自动恢复。这些工作必须由用户通过软件来完成。使用CLI 指令来禁止中断时,中断禁止立即生效。没有中断可以在执行CLI 指令后发生,即使它是在执行CLI 指令的同时发生的。下面的例子说明了如何在写EEPROM 时使用这个指令来防止中断发生以避免对EEPROM 内容的可能破坏。汇编代码例程iin r166, SREEG ; 保保存SREGGcli ; 禁止中断断sbi EEECR, EEMWEE ; 启动动 EEPRROM 写操操作sbi EECR, EEWEEout SSREG, r16 ; 恢复SRREG (II

6、 位)C 代码例程cchar ccSREG;cSREGG = SRREG; /* 保存SSREG */* 禁禁止中断*/_CLI();EECCR |= (1EEEMWE); /* 启动 EEEPROM 写操作*/EECR |= (1EEWEE);SREEG = ccSREG; /* 恢恢复SREGG (I 位位) */使使用SEI 指令使能中中断时,紧跟跟其后的第一一条指令在执执行任何中断断之前一定会会首先得到执执行。 汇编编代码例程ssei ; 置位全局中中断使能标志志sleepp ; 进入入休眠模式,等等待中断发生生; 注意: 在执行任任何被挂起的的中断之前MMCU 将首首先进入休眠眠模式

7、C 代代码例程_SSEI(); /* 置置位全局中断断使能标志*/_SLEEEP(); /* 进进入休眠模式式,等待中断断发生*/* 注意: 在执行任任何被挂起的的中断之前MMCU 将首首先进入休眠眠模式*/AAVR 中断断响应时间最最少为4 个个时钟周期。44 个时钟周周期后,程序序跳转到实际际的中断处理理例程。在这这4 个时钟钟期期间PCC 自动入栈栈。在通常情情况下,中断断向量为一个个跳转指令,此此跳转需要33 个时钟周周期。如果中中断在一个多多时钟周期指指令执行期间间发生,则在在此多周期指指令执行完毕毕后MCU 才会执行中中断程序。若若中断发生时时MCU 处处于休眠模式式,中断响应应时

8、间还需增增加4 个时时钟周期。此此外还要考虑虑到不同的休休眠模式所需需要的启动时时间。这个时时间不包括在在前面提到的的时钟周期里里。中断返回回需要4 个个时钟。在此此期间PC( 两个字节节) 将被弹弹出栈,堆栈栈指针加二,状状态寄存器SSREG 的的I 置位。 ATmega116 Flaash程序存存储器系统内可编程的的Flashh 程序存储储器ATmeega16具具有16K字字节的在线编编程Flassh,用于存存放程序指令令代码。因为为所有的AVVR指令为116 位或332 位,故故而Flassh 组织成成8K x 16 位的的形式。用户户程序的安全全性要根据FFlash程程序存储器的的两个

9、区:引引导(Booot) 程序序区和应用程程序区,分开开来考虑。FFlash存存储器至少可可以擦写100,000次次。ATmeega16的的程序计数器器(PC)为为13位,因因此可以寻址址8K 字的的程序存储器器空间。引导导程序区以及及相关的软件件安全锁定位位请参见 PP234“ 支持引导装装入程序 在写的同同时可以读(RWW, Read-Whilee-Writte) 的自自我编程能力力” ,而 P247“存存储器编程” 详述了用SSPI 或JJTAG 接接口实现对FFlash 的串行下载载。常数可以以保存于整个个程序存储器器地址空间( 参考LPPM 加载程程序存储器指指令的说明)。取指与执执

10、行时序图请请参见 P111“ 指令令执行时序”。ATmega116 SRAAM数据存储储器SRAM数据存存储器Figgure 99 给出了AATmegaa16 SRRAM 空间间的组织结构构。前1120 个个数据存储器器包括了寄存存器文件、II/O 存储储器及内部数数据SRAMM。起始的996 个地址址为寄存器文文件与64 个I/O 存储器,接接着是10224 字节的的内部数据SSRAM。数数据存储器的的寻址方式分分为5 种:直接寻址、带带偏移量的间间接寻址、间间接寻址、带带预减量的间间接寻址和带带后增量的间间接寻址。寄寄存器文件中中的寄存器RR26 到RR31 为间间接寻址的指指针寄存器。直

11、接寻址范围可达整个数据区。带偏移量的间接寻址模式能够寻址到由寄存器Y 和 Z 给定的基址附近的63 个地址。在自动预减和后加的间接寻址模式中,寄存器X、Y 和Z 自动增加或减少。ATmega16的全部32个通用寄存器、64个I/O寄存器及1024个字节的内部数据SRAM可以通过所有上述的寻址模式进行访问。寄存器文件的描述见 P9“ 通用寄存器文件” 。SRAM数据存存储器访本节节说明访问内内部存储器的的时序。如FFiguree 10 所所示,内部数数据SRAMM 访问时间间为两个cllkCPU 时钟。 ATmega116 EEPPROM数据据存储器ATmega116 包含5512 字节节的EE

12、PRROM 数据据存储器。它它是作为一个个独立的数据据空间而存在在的,可以按按字节读写。EEEPROMM 的寿命至至少为1000,000 次擦除周期期。EEPRROM 的访访问由地址寄寄存器、数据据寄存器和控控制寄存器决决定。通过SSPI和JTTAG及并行行电缆下载EEEPROMM数据的操作作请分别参见见 P2600、 P2665及P2550。EEPPROM 读读/ 写访问EEPPROM 读读/ 写访问问EEPROOM 的访问问寄存器位于于I/O 空空间。EEPPROM的写写访问时间由由Tablee 1给出。自自定时功能可可以让用户软软件监测何时时可以开始写写下一字节。用用户操作EEEPROM

13、 需要注意如如下问题:在在电源滤波时时间常数比较较大的电路中中,上电/ 下电时VCCC 上升/ 下降速度度会比较慢。此此时CPU 可能工作于于低于晶振所所要求的电源源电压。请参参见 P200“ 防止EEEPROMM 数据丢失失” 以避免免出现EEPPROM 数数据丢失的问问题。为了防防止无意识的的EEPROOM 写操作作,需要执行行一个特定的的写时序。具具体参看EEEPROM控控制寄存器的的内容。执行行EEPROOM 读操作作时, CPPU 会停止止工作4 个个周期,然后后再执行后续续指令;执行行EEPROOM 写操作作时, CPPU 会停止止工作2 个个周期,然后后再执行后续续指令。EEEP

14、ROM 地址寄存器器 EEAARH和EEARLL ? Bits 15.99 Rees: 保留留保留位,读读操作返回值值为零。? Bits 8.0 EEAAR8.00: EEPPROM 地地址EEPRROM地址寄寄存器 EEEARH和和EEARLL指定了5112字节的EEEPROMM空间。EEEPROM地地址是线性的的,从0 到到511。EEEAR 的的初始值没有有定义。在访访问EEPRROM 之前前必须为其赋赋予正确的数数据。EEPPROM 数数据寄存器 EEDRR? Bits 7.0 EEDDR7.0: EEPRROM 数据据对于EEPPROM 写写操作, EEEDR 是是需要写到EEEAR

15、 单单元的数据;对于读操作作, EEDDR 是从地地址EEARR 读取的数数据。EEPROM 控制寄存器器 EECCR? Bits 7.4 Ress: 保留保保留位,读操操作返回值为为零。? BBit 3 EERRIE: 使使能EEPRROM 准备备好中断若SSREG 的的I 为11,则置位位EERIEE 将使能EEEPROMM 准备好中中断。清零EEERIE 则禁止此中中断。当EEEWE 清零零时EEPRROM 准备备好中断即可可发生。? Bit 22 EEEMWE: EEPROOM 主机写写使能EEMMWE决定了了EEWE置置位是否可以以启动EEPPROM写操操作。当EEEMWE为1时,在

16、在4个时钟周周期内置位EEEWE 将将把数据写入入EEPROOM 的指定定地址;若EEEMWE 为0“,则则操作EEWWE 不起作作用。EEMMWE 置位位后4 个周周期,硬件对对其清零。见见EEPROOM 写过程程中对EEWWE 位的描描述。? BBit 1 EEWWE: EEEPROM 写使能EEEWE 为EEEPROMM 写操作的的使能信号。当当EEPROOM 数据和和地址设置好好之后,需置置位EEWEE以便将数据据写入EEPPROM。此此时EEMWWE必须置位位,否则EEEPROM写写操作将不会会发生。写时时序如下( 第3 步和和第4 步的的次序并不重重要):1. 等待EEEWE 位变

17、变为零2. 等待SPMMCSR 中中的SPMEEN 位变为为零3. 将将新的EEPPROM 地地址写入EEEAR( 可可选)4. 将新的EEEPROM 数据写入EEEDR( 可选)5. 对EECCR 寄存器器的EEMWWE 写11,同时清清零EEWEE6. 在置置位EEMWWE 的4 个周期内,置置位EEWEE在CPU 写Flassh 存储器器的时候不能能对EEPRROM 进行行编程。在启启动EEPRROM 写操操作之前软件件必须检查 Flashh 写操作是是否已经完成成。步骤(22) 仅在软软件包含引导导程序并允许许CPU对FFlash 进行编程时时才有用。如如果CPU 永远都不会会写Fla

18、ssh,步骤(2) 可省省略。请参见见P234“支支持引导装入入程序 在写的同时时可以读(RRWW, RRead-WWhile-Writee)的自我编编程能力” 。注意:如如果在步骤55 和6 之之间发生了中中断,写操作作将失败。因因为此时EEEPROM 写使能操作作将超时。如如果一个操作作EEPROOM的中断打打断了另一个个EEPROOM操作,EEEAR 或或EEDR寄寄存器可能被被修改,引起起EEPROOM 操作失失败。建议此此时关闭全局局中断标志II。经过写访访问时间之后后,EEWEE 硬件清零零。用户可以以凭借这一位位判断写时序序是否已经完完成。EEWWE 置位后后, CPUU 要停止

19、两两个时钟周期期才会运行下下一条指令。? Bit 0 EERE: EEPROM 读使能EERE为EEPROM读操作的使能信号。当EEPROM地址设置好之后,需置位EERE以便将数据读入EEAR。EEPROM 数据的读取只需要一条指令,且无需等待。读取EEPROM后CPU 要停止4 个时钟周期才可以执行下一条指令。用户在读取EEPROM 时应该检测EEWE。如果一个写操作正在进行,就无法读取EEPROM,也无法改变寄存器EEAR。 经过校准的片内振荡器用于EEPROM定时。Table 1 为CPU访问EEPROM的典型时间。 下面的代码分别别用汇编和CC 函数说明明如何实现EEEPROMM 的写

20、操作作。在此假设设中断不会在在执行这些函函数的过程当当中发生。同同时还假设软软件没有Booot Looader。若若Boot Loadeer 存在,则则EEPROOM 写函数数还需要等待待正在运行的的SPM 命命令的结束。汇编代码例程EEPROM_write:; 等待上一次写操作结束sbic EECR,EEWErjmp EEPROM_write; 设置地址寄存器 (r18:r17)out EEARH, r18out EEARL, r17; 将数据写入数据寄存器(r16)out EEDR,r16; 置位EEMWEsbi EECR,EEMWE; 置位EEWE 以启动写操作sbi EECR,EEWE

21、retC 代码例程void EEPROM_write(unsigned int uiAddress, unsigned char ucData)/* 等待上一次写操作结束 */while(EECR & (1EEWE);/* 设置地址和数据寄存器*/EEAR = uiAddress;EEDR = ucData;/* 置位EEMWE */EECR |= (1EEMWE);/* 置位EEWE 以启动写操作*/EECR |= (1EEWE); 下面的例子说明如何用汇编和C 函数来读取EEPROM,在此假设中断不会在执行这些函数的过程当中发生。汇编代码例程EEPROM_read:; 等待上一次写操作结束

22、sbic EECR,EEWErjmp EEPROM_read; 设置地址寄存器 (r18:r17)out EEARH, r18out EEARL, r17; 设置EERE 以启动读操作sbi EECR,EERE; 自数据寄存器读取数据in r16,EEDRretC 代码例程unsigned char EEPROM_read(unsigned int uiAddress)/* 等待上一次写操作结束 */while(EECR & (1EEWE);/* 设置地址寄存器*/EEAR = uiAddress;/* 设置EERE 以启动读操作*/EECR |= (1EERE);/* 自数据寄存器返回数据 */return EEDR; 在掉电休眠模式下的EEPROM写操作若程序执行掉电指令时EEPROM 的写操作正在进行, EEPROM 的写操作将继续,并在指定的写访问时间之前完成。但写操作结束后,振荡器还将继续运行,单片机并非处于完全的掉电模式。因此在执行掉电指令之前应结束EEPROM 的写操作。防止EEPROOM 数据丢丢失若电源电压过低低,CPU 和EEPRROM 有可可能工作不正正常,造成EEEPROMM 数据的毁毁坏( 丢失失)。这种情情况在使用独独立的EEPPROM 器器件时也会遇遇

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论