Atmel_AVR

**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』表示 **A**lf (Egil Bogen) and **V**egard (Wollan)'s **R**ISC 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 組成。

#### 內部暫存器

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 的裝置，分支操作會比之前的裝置慢上一個時脈。

### 開發

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 裝置上。

## 參見

* Arduino
* 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 官方网站. [2011-03-28]. （原始內容存檔於 2010-11-22） （英語）.
* Atmel AVR homepage（頁面存檔備份，存於網際網路檔案館）
* AVR-Libc homepage（頁面存檔備份，存於網際網路檔案館）
* AVR Freaks community（頁面存檔備份，存於網際網路檔案館）
* Atmel AVR Serial Port Programmer（頁面存檔備份，存於網際網路檔案館）
* Arduino community（頁面存檔備份，存於網際網路檔案館）
* 開放式目錄計劃中和 Atmel 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（頁面存檔備份，存於網際網路檔案館）