Atmel AVR

<image>

Atmel AVR系列是一种基于改进的哈佛结构、8位元～32位元精简指令集（Reduced Instruction Set Computing，RISC）的微控制器，由Atmel公司于1996年研发。AVR系列是首次采用闪存（Flash Memory）作为数据存储介质的单芯片微控制器之一，同时代的其它微控制器多采用一次写入可编程ROM、EPROM或是EEPROM。

目前AVR处理器发展了六个系列，分别是：tinyAVR，ATtiny系列；megaAVR，ATmega系列；XMEGA，ATxmega系列；Application-specific AVR，面向特殊应用的AVR系列，增加LCD控制器、USB控制器、PWM等特性；FPSLIC，FPGA上的AVR核；AVR32，32位AVR系列，包含SIMD和DSP以及音视频处理特性，与ARM架构形成竞争。

## 发展简史

AVR架构最早由两名挪威理工学院（Norwegian Institute of Technology，NTH）的学生Alf-Egil Bogen和Vegard Wollan共同构思出来。

原始的AVR微控制单元由当地Trondheim的一所特殊应用积体电路（ASIC）工作室Nordic VLSI（现为北欧半导体）负责开发。当时它被称作μRISC（Micro RISC），还可使用Nordic VLSI的硅晶圆等基础材料来制作其芯片。当这些技术被Nordic VLSI卖给Atmel后，其内部架构被当时任职于Atmel挪威子公司的Bogen以及Wollan进一步发展。架构设计者们和来自IAR系统公司的编译器编写者们紧密合作，来确保指令集提供更高效率的高阶程式语言编译。

而在命名上，Atmel解释‘AVR’这个名称不是某几个单词的缩写，也不代表任何特别的事物。AVR的创造者们也没有给出明确的关于‘AVR’之表意的答案。然而，一般认为，‘AVR’表示Alf (Egil Bogen) and Vegard (Wollan)'s RISC processor。而本文里用的‘AVR’一般指8位元RISC的Atmel AVR微控制器的产品线。

首个AVR微控制器的产品线是AT90S8515，拥有和英特尔8051微控制器相同的40针双列直插封装（DIP），包括外部多路位址和资料总线。但RESET线和英特尔8051相反，8051的是高电平有效RESET，而AVR是低电平有效RESET，但除此以外，其它针脚是完全一致的。

## 装置概览

AVR是一个修改过的哈佛架构计算机，程式和资料分别储存在各自的拥有不同定址空间的物理内存系统上，但有能力使用特殊的指令可从程式存储器内读取资料项。

### 基本家族系列

AVR分为六大家族系列：

- tinyAVR — ATtiny系列
- 0.5～16kB的程式内存
- 6～32管脚封装
- 有限的外围装置集合
- megaAVR — ATmega系列
- 4～512kB的程式内存
- 28～100管脚封装
- 扩展指令集（乘法指令和管理更大容量的程式内存管理指令）
- 更多的外围装置集合
- XMEGA — ATxmega系列
- 16～384kB程式内存
- 44～64～100管脚封装（A4、A3、A1）
- 扩展效能特性，像是DMA、‘事件系统’、以及加密支援
- 更多外围装置集，包含类比数位转换器（ADC）
- Application-specific AVR — 面向特殊应用的AVR
- 基于megaAVR搭载其它AVR家族系列上所没有的特殊的功能，例如LCD控制器、USB控制器、进阶PWM、CAN等等
- FPSLIC (AVR with FPGA) — 载于FPGA上的AVR核心
- FPGA 5K 至 40K 个逻辑闸
- AVR程式码使用SRAM，和其它AVR系列不同
- AVR核心可以运作于最高50MHz的时脉速率上
- 32-bit AVRs — 32位元AVR

2006年Atmel发布新的基于32位元的AVR32架构之微控制器。新架构包含单指令流多资料流运算（SIMD）和数字信号处理器（DSP）指令，以及其他音频视频处理功能。这个32位元的装置家族系列将与ARM架构的处理器形成竞争。尽管指令集和其它精简指令集的中央处理核心相似，但与原来的AVR架构和其它ARM核心是不相容的。

### 存储器架构

闪存、电子抹除式可复写只读内存（EEPROM）、以及静态随机存取内存（SRAM）都内建于一颗芯片上，在大部分应用中尽可能无需外部内存。一些装置拥有并列的外部总线选择以允许加入额外的资料内存或内存对映装置。几乎所有的装置（除最小规模TinyAVR芯片以外）拥有串列总线，可以用来连接更大的串列EEPROM或闪存。

#### 程式内存

程式指令被存储于非易失性的闪存上。尽管微控制器只有8位元，但每指令可以存取1至2个16位元的字节。

程式内存的容量大小常用于装置命名（如ATmega64x产品线拥有64KB的闪存，ATmega32x产品线拥有32KB的闪存）

不支援扩充程式内存，所有由AVR核心执行的程式码皆需要储存于内部的内存。然而AT94 FPSLIC AVR/FPGA芯片没有这种限制。

#### 内部资料内存

资料定址空间由暂存器档案、输出/输入暂存器、和SRAM组成。

#### 内部暂存器

<image>

AVR拥有32个的暂存器，分别为( R0 到 R31 )并被归类为8位元RISC装置。

在大部分AVR架构上，工作暂存器被对映为首位的32个内存位址（000016–001F16）接着是64个输出/输入（I/O）暂存器（002016–005F16）。

实际上SRAM是在这些暂存器分段（定址为006016）后开启。（注意输出/输入暂存器空间在一些扩展装置上或许更大，使得载入内存对映I/O暂存器将占用一部分SRAM的定址空间）

虽然有这些分开的定址解决方案和最佳化的暂存器档案和I/O暂存器存取操作码，但它们全部都可以被加以处理和操作，就像它们都在SRAM上。

在XMEGA系列上，工作暂存器档案并没有对映到资料定址空间上；正因为如此，不能将XMEGA的工作暂存器像是在SRAM上那样对待。作为替代，I/O暂存器被对映到资料定址空间内非常靠前的位置上。另外，资料定址空间中用作I/O暂存器的总数上大幅增加，容量达到4096字节（000016–0FFF16）。然而，正如前代产品一样，快速I/O操作指令只可到达首先的64个I/O暂存器位置（首位的32个位置是给位元运算指令使用的）。往后的I/O暂存器，XMEGA系列预留了一个4096位元宽度位址空间范围，可被选作将内建EEPROM对映至资料定址空间上（100016–1FFF16）。实际可用的SRAM位于这些被占用的定址空间以后，从200016开始。

#### EEPROM

几乎所有的AVR微控制器都拥有内建的EEPROM，用来提供半永久的资料存储。和闪存一样，EEPROM可在断电以后维持其内存储的资料。

在大部分的AVR架构中，内部EEPROM内存并没有对映到微控制单元的可定址内存空间上。它只可和外挂的外围装置一样使用特别的指针暂存器和读/写指令来存取，这使得EEPROM的存取速度要比其它内建的随机存取内存（RAM）要慢不少。

然而，某些SecureAVR（AT90SC）家族系列的装置使用了一种特殊的EEPROM根据相关配置设定对映至资料或程式内存。XMEGA家族系列也允许EEPROM对映至西辽定址空间上。

因EEPROM的擦写次数不是无限的——Atmel的技术细明规格表上标明是100,000次擦写周期——一个设计精良的EEPROM擦写常程序应比较EEPROM位址上的内容和请求写入的内容并在需要进行改变的位置处才真正执行写入操作。

注意，在很多情况下擦除和写入是分开执行的，以字节为单位进行，这有助于延长其使用寿命，因位元仅需全被设定为‘1’（擦除）或选择性地置‘0’（写入）。

### 程式执行

Atmel的AVR核心拥有二阶单级管线设计。这意味着处理器可以在执行现在的指令同时将下一个指令读取。绝大部分的指令执行仅需一到两个时钟周期，使AVR核心在众多8位元微控制器中是最快的。

AVR核心被设计为能够高效运行经编译的C语言程式，还内建了数个指针指令与之相适配。

### 指令集系统

AVR指令集系统相比其它大多数的位元微控制器的，正交指令集要多出不少，尤其是AVR当下的竞争对手英特尔8051以及其仿制品和PIC微控制器。然而，这不完全是固定的：

- 指针暂存器 R26 至R31 是X、Y和Z拥有的定址能力，彼此是不同的
- 暂存器位置R0至R15和暂存器R16至R31拥有不同的定址能力
- 输出/输入埠0～31和埠32至63拥有不同的定址能力
- 当SER不影响标志时CLR会影响标志，即使它们是互补指令。CLR设定所有位元为“零”而SER指令则设定所有位元为“一”。（注意，CLR指令是EOR R, R的虚假操作；SER指令是LDI R,$FF的短指令。数学运算时当遇到搬移/载入/存储/分支，像是EOR会变更标志而像是LDI的则不会）
- 读取存储在程式内存（快闪型）的唯独资料时要用到特殊的LPM指令；闪存总线会为指令内存保留。

此外，一些芯片差异会影响代码的生成。代码指针（包括在堆叠上的返回位址）在芯片上是两个字节长度以及有高达128KB的闪存，但在一些更大的芯片上变成3个字节长度;并不是所有的芯片都有硬件乘法器；拥有超过8KB闪存的芯片拥有分支和附带更大范围的传唤指令；或者四者都有。

通常的规则指令集使得可直接使用C（或者甚至Ada）编译器来对AVR进行编程。GCC也在离目前相当长的时间以前就支援包括AVR在内的多种微控制器，而且还被广泛使用。事实上，Atmel也从为小型微控制器用的编译器的主要开发者当中征集并导入他们的作品。以确定高阶程式语言编译器中最常用的指令集特性。

### MCU速度

AVR系列可以很好地支援0～20MHz的时脉，某些装置更达到32MHz。更低功耗的作业一般需要一个较低的时脉。所有最近的AVR装置（Tiny、Mega、以及Xmega，但90年代的产品除外）有内建石英振荡器、可以不需要外接时钟或震荡器电路。一些AVR装置还有一个系统时钟预定标器，提升系统时钟至1024。这个预定标器可以被软件执行时重新配置，允许对时脉进行最佳化作业。

因所有在暂存器R0至R31位址的运算作业仅需一个时脉，AVR可以拥有每兆赫（MHz）最高每秒一百万指令（MIPS），换言之一颗8MHz的AVR处理器拥有8MIPS的效能。从内存载入和储存资料需要两个时脉，分支也需要两个时脉。在一些较新的‘3字节PC’上，像是ATmega2560的装置，分支操作会比之前的装置慢上一个时脉。

### 开发

<image>

AVR由于开发工具可轻易免费或低价获得，包括一些合适价格的开发板装置和免费的开发软件，而拥有庞大的开发群体。AVR也以众多不同的名义贩售，但它们都使用相同的基本核心，只是周边设备和内存的搭配不一样。每个系列的不同芯片之间的相容性相当好，尽管输出输入控制器的搭配会有所不同。

更多可参见#外部链接一节中与AVR开发的相关站点。

## 编程界面

有多种方法可将程式载入至AVR芯片上。不同AVR家族系列的程式写入方法都各有不同。

### 高电压平行

高电压平行编程（High voltage parallel programming，HVPP）是作为‘最后手段’来使用，亦可能是以坏熔丝设定修复AVR芯片的唯一方法。

### 开机载入程式（Bootloader）

大部分的AVR型号可以保留一个开机载入程式区域，有256字节至4KB的大小，可储存多次编程的程式码。在复位后，首先执行bootloader，然后终止一些使用者运行的程式，当需要重新变成或跳转至主程式时。在任何界面可用时，程式码便可以进行重新编程，像PXE（预启动执行环境）一样，透过以太网适配器能读取加密处理的二进制资料。Atmel有关于许多总线界面的应用程序注释及源码。

### ROM

AT90SC系列的AVR芯片可以使用原厂掩模ROM而不使用闪存来作为程式内存。因为在大批量生产基于AVR的特定功能控制器时，比起在开发阶段使用价格较高的闪存，在生产阶段使用掩模ROM可以有效提高成本效益。

### aWire

aWire是一种新的单线除错界面，可用于新版UC3L AVR32装置上。

## 扩展阅读

- Embedded C Programming and the Atmel AVR; Richard H Barnett, Sarah Cox, Larry O'Cull; 560 pages; 2006; ISBN 978-1-4180-3959-2.
- C Programming for Microcontrollers Featuring ATMEL's AVR Butterfly and WinAVR Compiler; Joe Pardue; 300 pages; 2005; ISBN 978-0-9766822-0-2.
- Atmel AVR Microcontroller Primer : Programming and Interfacing; Steven F Barrett, Daniel Pack, Mitchell Thornton; 194 pages; 2007; ISBN 978-1-59829-541-2.
- Arduino : A Quick Start Guide; Maik Schmidt; 276 pages; 2011; ISBN 978-1-934356-66-1.

## 外部链接

主要资源

- Atmel AVR homepage
- AVR-Libc homepage
- AVR Freaks community
- Atmel AVR Serial Port Programmer
- Arduino community
- Computers/Hardware/Components/Processors/AVR/, numerous AVR links
- Why you need a clock source for the AVR?
- AVR Basics - AVR guide for beginners
- Simplest AVR programmer Using LPT Port
- Atmega8 Breadboard Tutorial
- AVR DIP-Package Pinout Diagrams: ATtiny44/45/84/85, ATmega328P, ATmega644P, ATmega1284P
- AVR TQFP-Package Pinout Diagrams: ATmega328, ATmega2560, ATmega32U4