跳轉到內容

嵌入式系統/Atmel AVR

來自華夏公益教科書,開放書籍,開放世界
(重定向自 Atmel AVR)

Atmel AVRTM 是由Atmel生產的8位RISC 微控制器系列。AVR架構是由挪威科技大學 (NTH)的兩名學生構思,並在Atmel挪威(由兩位晶片架構師創立的Atmel子公司)得到進一步完善和發展。

記憶體

[編輯 | 編輯原始碼]

Atmel AVR 處理器的記憶體採用 改進的哈佛架構,其中程式和資料記憶體位於不同的總線上,以實現更快的訪問速度和更高的容量。AVR 使用內部記憶體來儲存資料和程式,因此不需要任何外部記憶體。

Atmel AVR 中有四種類型的記憶體:

  • 資料記憶體:暫存器、I/O暫存器和SRAM
  • 程式快閃記憶體
  • EEPROM
  • 熔絲位

所有這些記憶體都在與 CPU 核心相同的晶片上。每種記憶體彼此隔離,位於晶片上的不同位置。資料記憶體中的地址 0 與程式快閃記憶體中的地址 0 和 EEPROM 中的地址 0 不同。

程式記憶體

[編輯 | 編輯原始碼]

一些 AVR 微控制器具有 16 位寬的非易失性快閃記憶體,而另一些則具有 8 位 快閃記憶體,用於程式儲存,從 1 KB 到 256 KB(或 512-128K 典型程式字)。程式記憶體儲存可執行程式操作碼和靜態資料表。程式記憶體是線性定址的,因此不需要像頁面銀行或段暫存器這樣的機制來呼叫任何函式,而不管其在程式記憶體中的位置。

AVR 無法使用外部程式記憶體;晶片上的快閃記憶體是 AVR 核心可用的唯一程式記憶體。SRAM(靜態 RAM)是隨機存取記憶體 (RAM),只要供電,它就會在記憶體中保留資料位。與動態 RAM(DRAM)不同,DRAM 將位儲存在由電容和電晶體組成的單元中,SRAM 不需要定期重新整理。

SRAM 速度非常快;但是,它有很多缺點。1)它需要 4-6 個電晶體來儲存一個位,這使得 SRAM 空間利用率低下,2)由於元件數量多,SRAM 的功耗非常大,3)由於元件數量多和功耗成本高,SRAM 非常昂貴,4)SRAM 是一種易失性記憶體型別,這意味著當電源連線斷開時,SRAM 中的所有資料都會丟失。

可以使用程式設計工具對快閃記憶體程式記憶體進行重新程式設計,最流行的是在原位對晶片進行程式設計的工具,稱為線上程式設計器 (ISP)。Atmel AVR 也可以使用高壓並行或序列程式設計器進行重新程式設計,並且在某些晶片上可以透過 JTAG(也是在原位)進行重新程式設計。AVR 中的快閃記憶體可以至少重新程式設計 10,000 次。

許多較新的 AVR(MegaAVR 系列)能夠自我程式設計快閃記憶體。此功能主要用於 引導載入程式

資料記憶體

[編輯 | 編輯原始碼]

資料記憶體包括暫存器、I/O 暫存器和內部 SRAM。

AVR 有 32 個通用 8 位暫存器(R0 到 R31),其中 6 個可以成對使用作為 16 位指標 (X、Y 和 Z)。

所有 AVR 微控制器都具有一定的 RAM,從 32 位元組到幾個 KB。此記憶體是位元組可定址的。暫存器檔案(通用和專用)對映到第一個地址,因此也可以作為 RAM 訪問。一些最小的 AVR 微控制器只有暫存器檔案作為其 RAM。

資料地址空間由暫存器檔案、I/O 暫存器和 SRAM 組成。工作暫存器被對映為前 32 個記憶體空間 (000016-001F16),然後是最多 64 個 I/O 暫存器的保留空間 (002016-005F16)。實際可用的 SRAM 在這兩個部分之後開始(地址 006016)。(請注意,I/O 暫存器空間在一些更大型的裝置上可能更大,在這種情況下,SRAM 的起始地址將更高。)即使有單獨的定址方案和針對暫存器檔案和 I/O 暫存器訪問的最佳化操作碼,它們仍然可以被定址和操作,就好像它們是 SRAM 一樣。

I/O 暫存器(和程式計數器)在發生復位時重置為其預設起始值。暫存器和 SRAM 的其餘部分具有隨機的初始值,因此程式通常首先做的就是將它們全部清零或載入其他初始值。

無論寫入多少次,暫存器、I/O 暫存器和 SRAM 永遠不會磨損。

外部資料記憶體

[編輯 | 編輯原始碼]

一些引腳數量較多的 AVR 微控制器允許對資料空間進行外部擴充套件,可定址高達 64 KB。當啟用時,外部 SRAM 會被內部 SRAM 覆蓋;對資料空間中地址 000016 的訪問將始終解析為片上記憶體。根據特定 AVR 中存在的片上 SRAM 的數量,從 512 位元組到幾個 KB 的外部 RAM 將不可訪問。這通常不會造成問題。

任何支援外部資料儲存器的器件的資料手冊中都描述了所需的支撐電路,例如 Mega 162 的“外部儲存器介面”部分。支撐電路非常簡單,包括一個 '573 或類似的鎖存器,以及一些晶片選擇邏輯。SRAM 晶片選擇可以連線到永久啟用晶片的邏輯電平,也可以由 AVR 的引腳驅動。對於 32 KB 或更小的 SRAM,一種選擇是使用更高階的地址線來驅動 SRAM 的晶片選擇線。

EEPROM 儲存

[編輯 | 編輯原始碼]

幾乎所有 AVR 微控制器都具有用於非易失性資料儲存的內部 EEPROM 記憶體。只有 Tiny11 和 Tiny28 沒有 EEPROM。

EEPROM 記憶體不會直接對映到程式空間或資料空間,而是作為外設間接訪問,使用 I/O 暫存器。許多可用於 AVR 的編譯器隱藏了訪問 EEPROM 的部分或全部細節。IAR 的 AVR C 編譯器在變數宣告中識別特定於編譯器的關鍵字 __eeprom。之後,使用者編寫程式碼以使用與普通變數(在 RAM 中)相同的標準 C 語法讀取和寫入該變數,但編譯器會生成程式碼以訪問 EEPROM 而不是常規資料記憶體。

Atmel 的資料手冊表明,EEPROM 可以至少重寫 100,000 次。如果應用程式頻繁寫入 EEPROM,以至於在達到裝置預期壽命之前就會達到寫入限制,則應用程式必須實現磨損均衡方案。AVR 出廠時 EEPROM 已擦除,即 EEPROM 中每個位元組的值為 FF16

許多 AVR 在某些電源條件下(通常在 掉電 期間)寫入 EEPROM 地址 0 存在錯誤,因此 Atmel 建議程式不要使用 EEPROM 中的該地址。

保險絲設定

[編輯 | 編輯原始碼]

保險絲是一個 EEPROM 位,它控制低階功能和引腳分配。保險絲無法透過程式訪問;它們只能透過晶片程式設計器更改。保險絲控制晶片可以從復位狀態退出並開始執行程式碼之前必須設定的功能。

最常修改的保險絲包括

  1. 振盪器/晶體特性,包括驅動強度和啟動時間。
  2. 用於 JTAG 或 GPIO 的 JTAG 引腳
  3. RESET 引腳用作復位輸入、debugWire 或 GPIO
  4. 掉電檢測 (BOD) 使能和 BOD 電壓觸發點

還有一個保險絲用於啟用序列系統程式設計,預設情況下它已設定。如果設定不正確,唯一可以對晶片進行程式設計的方法是使用高壓程式設計器,例如 STK-500、AVR Dragon 或第三方程式設計器。因此,開發人員在操作保險絲時應謹慎。

AVR 的 RESET 引腳是一個低電平有效輸入,它會強制復位處理器及其整合外設。該線可以由外部上電覆位發生器、電壓監控器(當電源電壓下降到預定義閾值以下時會斷言 RESET)或較大系統中的另一個元件驅動。例如,如果 AVR 在大型整合系統中管理一些感測器和伺服器,則另一個控制器可能會觀察到一些需要復位 AVR 的條件;它可以透過斷言 AVR 的 RESET 線來做到這一點。

AVR 還包括一個 看門狗定時器,它可以在超時時復位處理器。必須定期復位看門狗定時器以防止它超時。未能復位看門狗定時器通常表明程式程式碼已失敗(鎖定、進入無限迴圈或其他錯誤),應復位處理器。在一些 AVR 中,可以將看門狗程式設計為發出中斷而不是復位處理器。此功能可用於喚醒 AVR 從休眠模式。

RESET 引腳用於系統內部序列程式設計、作為 GPIO 或用於 debugWIRETM 低引腳計數除錯,具體取決於晶片和保險絲位的程式設計。如果停用該引腳的復位功能,則無法透過系統內部序列程式設計恢復它,必須使用其他方法,例如高壓程式設計。

AVR 支援多種中斷源,包括內部中斷和外部中斷。中斷可能是由內部外設達到特定狀態(即 UART 上接收到字元)引起的,也可能是由外部事件(如引腳上的特定電平)引起的。每個中斷源都會導致跳轉到記憶體中的特定位置。該位置應包含 RETI(從中斷返回)指令,以實質上忽略中斷,或跳轉到實際的中斷處理程式。

大多數 AVR 至少有一個專用外部中斷引腳 (INT0)。較舊的 AVR 可以透過高電平或低電平,或透過下降沿觸發中斷。較新的 AVR 添加了更多選項,例如在上升沿或任一沿觸發。此外,許多較新的 AVR 為每組 8 個引腳實現了引腳變化中斷,從而消除了對 輪詢 引腳的需要。引腳變化中斷處理程式必須檢查與該中斷向量關聯的引腳狀態,並確定要執行的操作。

由於按鈕抖動問題,將按鈕或其他使用者輸入直接連線到中斷引腳被認為是設計不良;必須插入一些去抖動或其他訊號調節,以便來自按鈕的訊號不會違反中斷引腳上所需的建立時間和保持時間。

通用 I/O 埠

[編輯 | 編輯原始碼]

通用 I/O 或 GPIO 引腳是 AVR 系列的數字 I/O。這些引腳是真正的推輓式輸出。AVR 可以驅動高電平或低電平,也可以將引腳配置為具有或不具有上拉的輸入。GPIO 被分組到最多 8 個引腳的“埠”中,儘管某些 AVR 沒有足夠的引腳來提供特定埠中的所有 8 個引腳,例如 Mega48/88/168 沒有 PortC7 引腳。控制暫存器用於設定資料方向、輸出值(或上拉使能)以及讀取引指令碼身的值。可以使用按位操作指令訪問單個引腳。

每個埠都有 3 個與之關聯的控制暫存器:DDRx、PORTx 和 PINx。這些暫存器中的每個位控制一個 GPIO 引腳,即 DDRA 中的位 0 控制 PortA0(通常簡寫為 PA0)的資料方向,而 PORTA 中的位 0 將控制 PA0 的資料(或上拉)。

DDR(資料方向暫存器)控制引腳是輸入還是輸出。當引腳配置為輸出時,PORT 暫存器中的相應位將控制引腳的驅動電平,高電平或低電平。當引腳配置為輸入時,PORT 暫存器中的位將控制該引腳是否啟用上拉。PIN(埠輸入)暫存器在早期 AVR 中是隻讀的,用於讀取埠引腳上的值,無論資料方向如何。較新的 AVR 允許寫入 PIN 暫存器以切換相應的 PORT 位,這在位邦定介面時可以節省一些處理器週期。

定時器/計數器

[編輯 | 編輯原始碼]

所有 AVR 至少都具有一個 8 位定時器/計數器。為了簡便起見,定時器/計數器通常簡稱為定時器。

一些 Tiny 系列只有一個 8 位定時器。在 Mega 系列的頂端,有一些晶片有多達六個定時器(兩個 8 位和四個 16 位)。

定時器可以直接由系統時鐘、由系統時鐘的分頻結果或由外部輸入(上升沿或下降沿)進行時鐘驅動。一些 AVR 還包括使用與系統時鐘非同步的外部晶體的選項,該選項可用於使用 32.768 kHz 晶體保持即時時鐘。

在正常模式下,定時器向上計數到頂 FF8(或 FFFF16),回滾到零,並設定溢位位,如果啟用,該位可能會導致中斷。在中斷例程中,除了所需的任何其他處理外,還可以將計數器載入為所需的值。

比較時清除定時器 (CTC) 模式允許定時器在達到比較暫存器中的值之前被清除,而不是在定時器達到頂端並溢位之前。在溢位之前清除定時器會操作定時器解析度,從而可以更精確地控制比較匹配的輸出頻率。它還可以簡化外部事件的計數。

可以隨時讀取定時器的值,即使它正在執行。(資料手冊中記錄了讀取 16 位定時器的特定順序,以便返回一致的結果,因為 AVR 只能一次移動 8 位。)透過將定時器的時鐘輸入更改為“無時鐘源”,可以暫時停止定時器,然後透過重新選擇先前的時鐘輸入來恢復定時器。

PWM(脈衝寬度調製)

[編輯 | 編輯原始碼]

許多 AVR 包含一個比較暫存器,至少用於定時器之一。當定時器值與比較暫存器中的值匹配時,該比較暫存器可用於觸發中斷和/或切換輸出引腳(例如定時器 1 的 OC1A)。這可以在溢位中斷之外進行,從而支援脈衝寬度調製 (PWM) 的使用。

一些 AVR 還包括用於相位校正 PWM 或相位和頻率校正 PWM 的選項。許多電機需要相位校正。

ATtiny26 獨特之處在於它包含一個 64 MHz 高速 PWM 模式。64 MHz 時鐘由 PLL 生成,與處理器時鐘無關且非同步。

一些 AVR 還包括適合控制某些電機的互補輸出。死區時間發生器 (DTG) 在一個訊號下降和另一個訊號上升之間插入延遲,因此兩個訊號永遠不會同時為高電平。高階 AT90PWM 系列允許將死區時間程式設計為系統時鐘週期數,而其他具有此功能的 AVR 僅使用 1 個時鐘週期作為死區時間。

輸出比較調製器

[編輯 | 編輯原始碼]

輸出比較調製器 (OCM) 允許生成一個以載波頻率調製的訊號。OCM 需要兩個定時器,一個用於載波頻率,另一個用於要調製的訊號。OCM 在某些 Mega 系列中可用。

序列通訊

[編輯 | 編輯原始碼]

AVR 微控制器通常能夠支援大量序列通訊協議和序列匯流排標準。確切的序列通訊支援型別在 AVR 微控制器系列的不同成員之間有所不同。

除了硬體支援之外,通常還可以選擇完全在軟體中實現特定的序列通訊機制。這通常用於 AVR 控制器在硬體上不支援某些序列通訊機制、特定硬體已在使用(例如,當需要兩個 RS-232 介面但硬體只支援一個時)、或晶片的硬體無法使用,因為它與其他晶片功能共享引腳,並且這種功能已被用於特定硬體。後者經常發生在使用 DIP 封裝的低引腳數 AVR 上。

最後,還可以使用額外的邏輯來實現序列通訊功能。例如,大多數 AVR 不支援 USB 匯流排(某些後來的 AVR 支援)。當使用不支援 USB 的 AVR 時,電路設計師可以使用固定功能晶片(例如 FTDI232 USB 到 RS-232 轉換晶片)或通用 USB 介面(例如 PDIUSB11)新增 USB 功能。對於某些支援的通訊協議,實際上需要新增額外的電子元件,例如符合標準的 RS-232 通訊需要新增電壓電平轉換器,例如 MAX232。

特定 AVR 支援的序列通訊可能性數量有時會令人困惑,尤其是在引腳與其他晶片功能共享的情況下。強烈建議深入研究特定 AVR 的資料手冊。以下各節將討論 AVR 上最常見的序列通訊功能。

通用同步非同步收發器 (USART)

[編輯 | 編輯原始碼]

最近的 AVR 通常內建了通用同步非同步收發器 (USART)。USART 是一塊可程式設計硬體,能夠生成和解碼各種序列通訊協議。USART 是以下單詞的首字母縮寫

通用
可在許多不同的序列通訊場景中使用
同步
可用於同步序列通訊(傳送方和接收方透過特定時鐘訊號同步)
非同步
可用於非同步序列通訊(傳送方和接收方沒有透過時鐘訊號明確同步,而是透過資料訊號同步)。
接收器
AVR 中的硬體可以接收序列資料
傳送器
硬體可以傳送序列資料

早期 AVR 具有一個 UART,它不支援同步序列通訊,因此縮寫詞中沒有“S”。

USART 或 UART 使用邏輯電壓電平,而例如 RS-232 協議需要比 AVR 電路中常見的 5V 或 3.3V 電源電壓電平大得多。從這些電壓電平到這些電壓電平的轉換是由一個額外的晶片執行的,該晶片通常被稱為線路驅動器或線路介面。

使用正確的線路介面,AVR 的 USART 可以例如用於與 RS-232、RS-485、MIDI、LIN 匯流排或 CAN 匯流排裝置通訊,僅舉幾個流行協議的例子。

有關更多詳細資訊,請參見機器人學:計算機控制:介面:網路

RS-232 訊號

[編輯 | 編輯原始碼]

RS-232 規範要求使用負電壓表示“1”位,使用正電壓表示“0”位。該規範允許電平為 +3 到 +15V 以及 -3 到 -15V,但通常使用 +/-12V。AVR 無法在其任何 GPIO 引腳上驅動負輸出電壓,因此使用電平轉換器(例如 MAX232)來與 PC 和嚴格的 RS-232 裝置通訊。有關 RS-232 佈線的更多詳細資訊,請參見序列程式設計:RS-232 連線

RS-232 的最大電纜長度相對較短。對於更長的電纜距離,請考慮在 USART 上使用RS-485 訊號。

雙線介面

[編輯 | 編輯原始碼]

TWI 是飛利浦 I²C 匯流排介面的變體。I²C 包含兩根線,稱為 SDA(序列資料)和 SCL(序列時鐘),它們使用開漏驅動器,因此需要上拉至邏輯 1 狀態。I²C 使用公共地,因此總線上的所有裝置應處於相同的接地電位,以避免接地迴路。TWI 使用 7 位定址,允許多個裝置連線到匯流排。

許多 TWI 裝置至少將地址的最高四位硬編碼,其餘位可以透過某種方式配置,例如將專用地址引腳連線到電源或接地;這通常只允許總線上存在 2-8 個型號的 X 裝置。AVR 的 TWI 硬體可以充當主裝置或從裝置,並且可以滿足 400 kbit/s 的規格。

序列外設介面 (SPI)

[編輯 | 編輯原始碼]

SPI,即序列外設介面匯流排,是一種主從同步序列協議。這意味著存在一條時鐘線,它決定何時取樣脈衝,並且其中一方始終負責啟動通訊。它至少使用三根線,分別稱為

MISO
主裝置輸入從裝置輸出。
MOSI
主裝置輸出從裝置輸入。
SCK
序列時鐘。

從概念上講,SPI 是一個雙向移位暫存器;當在 MISO 或 MOSI 上移出位時,在另一條線上移入位。主裝置始終控制時鐘。

SPI 從裝置具有一個從裝置選擇 (SS) 訊號,該訊號通知從裝置應響應來自主裝置的訊息。SS 通常為低電平有效。如果只有一個主裝置和一個從裝置,則從裝置的 SS 線可以接地,並且主裝置不需要驅動它。如果存在兩個或多個從裝置,則主裝置必須對每個從裝置使用單獨的從裝置選擇訊號。這種方法的缺點是,主裝置只能定址與其額外輸出數一樣多的從裝置(不使用單獨的譯碼器)。

硬體實現 大型 AVR 微控制器內建 SPI 收發器(從 ATmega8 開始)。序列時鐘來自處理器時鐘,提供多個分頻器。資料長度始終為 8 位。可以配置時鐘極性和相位,導致何時將資料移入和移出晶片的四種可能的組合。這種介面非常流行,並且廣泛存在於各種其他處理器和外設上。

用於 SPI 匯流排的引腳也用作透過 ISP(線上程式設計)程式設計晶片的方式(Mega128 除外)。

通用序列介面 一些 AVR,尤其是在 Tiny 系列中,提供通用序列介面 (USI) 而不是 SPI。USI 能夠作為 SPI 執行,但也可以作為 I2C 控制器執行,並且只要付出一些額外的努力,就可以作為 USART 執行。傳輸的位長可以配置,時鐘驅動器也是如此。時鐘可以由軟體驅動,由定時器 0 溢位驅動,或由外部源驅動。

軟體實現 SPI 可以使用I/O 線的位邦定 來實現。透過將 SCLK 連線到外部中斷源,可以實現從裝置的有效實現。

特定 AVR 的資料手冊提供了該晶片上 SPI 或 USI 控制器的框圖。

協議問題

[編輯 | 編輯原始碼]

SPI、RS-232、I2C 和其他序列介面只定義了傳輸位和位元組的方法;它們對應於 OSI 模型 中的第 1 層,即物理層。位元組可以是任何東西:溫度讀數(以攝氏度或華氏度表示,具體取決於您的感測器)、來自壓力感測器的讀數、用於關閉泵的控制訊號或 JPEG 影像的位元組。一些這些含義可以透過使用序列通訊協議來分配。

序列協議必須處理各種各樣的使用條件,並提供從故障中恢復的方法。例如,如果兩個感測器連線到一個微控制器(例如室內和室外溫度),則該協議為序列線路另一端的接收器提供一種方法來區分哪個讀數屬於哪個感測器。如果在傳輸過程中電纜被拔掉,或者由於線路噪聲而丟失了一個位元組,則該協議可以提供一種方法來重新同步傳送器和接收器。

Serial Programming 華夏公益教科書中包含了更多關於序列協議的討論。

模擬介面

[編輯 | 編輯原始碼]

模數轉換

[編輯 | 編輯原始碼]

模數轉換使用數字來表示取樣模擬訊號的比例。例如,透過將 3 V 應用於滿量程範圍為 5 V 的 ADC 的輸入,將導致數字輸出為數字輸出滿量程的 60%。數字可以由 ADC 表示為 8 位或 10 位。8 位轉換器將提供從 0 到 ,或 255 的輸出。10 位將提供從 0 到 的輸出。

10 位取樣: 在 ADCH:ADCL 中,或

8 位取樣: 在 ADCL 中

許多 AVR 包含一個 ADC,具體來說是一個 逐次逼近 ADC。ADC 參考電壓(如上例中的 5 V)可以是外部電壓,也可以是內部固定的 1.1 V 參考電壓。

帶有 ADC 的 AVR 具有多個模擬輸入,這些輸入透過模擬多路複用器連線到 ADC。在任何給定時間,只能轉換一個模擬輸入。ADC 控制器提供了一種順序轉換輸入的方法,因此 AVR 可以輕鬆地在每秒數千次的情況下迴圈遍歷多個源。AVR 可以連續地執行 ADC 轉換,也可以使用特殊的“ADC 休眠”模式來在轉換過程中停止處理器,以最大程度地減少來自 MCU 其餘部分的電壓干擾。

模擬比較器外設

[編輯 | 編輯原始碼]

幾乎所有 AVR 微控制器都具有一個模擬比較器,它可用於在那些沒有 ADC 的 AVR 上實現 ADC,或者如果所有 ADC 輸入都已在使用中。Atmel 提供了使用比較器作為低速 ADC 的示例程式碼和文件。要測量的訊號連線到反相輸入,參考訊號連線到同相輸入。當訊號低於或高於參考值時,AVR 將生成中斷。

模擬比較器的一個常見用途是檢測電池電壓,以提醒使用者電池電量不足。

其他整合硬體

[編輯 | 編輯原始碼]

除了可以認為是微控制器典型外設(UART、SPI、ADC)之外,一些 AVR 還包括用於特定應用的更專門的外設。

LCD 驅動器

[編輯 | 編輯原始碼]

在像 ATmega169(如 AVR Butterfly 中所見)這樣的大型型號中,集成了 LCD 驅動器。LCD 驅動器控制 AVR 的多個埠以驅動顯示器的列/行連線。液晶體必須注意的一個特殊特性是,不能透過它施加直流偏壓。直流偏壓或在泵送交流電時更多電子單向透過,會化學分解液晶體。AVR 的 LCD 模組使用精確的定時來驅動畫素向前和向後相等。

USB 介面

[編輯 | 編輯原始碼]

AT90USB 系列包括一個片上 USB 控制器。一些型號是“功能”型,而另一些則具有 On-The-Go 功能,可以充當 USB 主機(用於與其他從裝置連線)或 USB 從裝置(用於與 USB 主機連線)。

沒有內建 USB 的 AVR 可以使用外部晶片,如 PDIUSB12,或者對於低速和最小功能裝置,可以使用僅韌體的方法。

兩種僅韌體的 USB 驅動程式是

  • obdev,它在某些限制下可以在符合開源許可證下使用,以及
  • USBtiny,它在 GPL 許可證下使用。
  • 在 MIT 許可證下發布的 LUFA 庫允許支援 USB 的 AVR 微控制器充當 USB 主機、從機或 OTG 裝置。[1]

雖然這些軟體實現提供了新增 USB 連線的非常便宜的方法,但它們僅限於低速傳輸,並佔用相當多的 AVR 資源。其他將 USB 訊號轉換為 AVR 的 RS-232(序列)的硬體 IC 可從 FTDI 等供應商處獲得。這些 IC 的優點是可以卸除管理 USB 連線的繁重任務,缺點是受限於 AVR 序列埠的速度。有關此類 USB 介面晶片的更多詳細資訊,請參見 Embedded Systems/Particular Microprocessors#USB 介面

溫度感測器

[編輯 | 編輯原始碼]

一些較新的型號內建了一個連線到 ADC 的溫度感測器。

AVR 選擇

[編輯 | 編輯原始碼]

AVR 微控制器分為三組

  • tinyAVR
  • AVR(經典 AVR)
  • megaAVR

這些裝置之間的差異主要在於可用功能。tinyAVR 微控制器通常是與 megaAVR 相比具有較低引腳數或功能集縮減的裝置。所有 AVR 裝置都具有相同的基本指令集和記憶體組織,因此從一種裝置遷移到另一種 AVR 裝置通常很簡單。

經典 AVR 大部分已停產,因此新設計應使用 Mega 或 Tiny 系列。一些經典 AVR 在 mega 系列中具有替代部件,例如 AT90S8515 被 mega8515 替代。

Atmel 提供了一個 引數產品表,它比較了整個 AVR 產品線上的記憶體、外設和可用功能。

硬體設計注意事項

[編輯 | 編輯原始碼]

Atmel 提供了 AVR 硬體設計注意事項 來幫助硬體設計師。 本文件還展示了標準的線上序列程式設計聯結器。

AVR 開發/應用板

[編輯 | 編輯原始碼]

Butterfly 演示板

[編輯 | 編輯原始碼]

AVR Butterfly 是一款自成一體的、電池供電的演示板,執行著 ATMEL AVR ATmega169V 微控制器。 該板包括 LCD 螢幕、操縱桿、揚聲器、序列埠、RTC、快閃記憶體晶片、溫度、光線和電壓感測器。 該板背面有一個襯衣別針,可以戴在身上作為名牌。

AVR Butterfly 預裝了軟體,用來演示微控制器的功能。 工廠韌體可以滾動顯示您的姓名、顯示感測器讀數,以及顯示時間。 此外,AVR Butterfly 還配備了壓電蜂鳴器,可以再現聲音。

AVR Butterfly 透過執行一個 14 段、6 個字母數字字元顯示來演示 LCD 驅動。 但是,LCD 介面消耗了大量的 I/O 引腳。

Butterfly 的 ATmega169 CPU 的速度最高可達 8 MHz,但是為了節省紐扣電池的續航時間,它在出廠時透過軟體設定為 2 MHz。

Ecros Technology 生產了一款 Butterfly 的載板,它提供電源、方便的 I/O 埠連線、DB-9 序列埠(帶電平轉換器)和一個大型原型區域。

STK500 入門套件

[編輯 | 編輯原始碼]

STK500 入門套件和開發系統具有 ISP 和高電壓程式設計功能,適用於所有 AVR 器件,無論是直接連線還是透過擴充套件板連線。 該板配備了 DIP 插座,適用於所有以 DIP 封裝提供的 AVR。

STK500 板有多種擴充套件模組可供選擇。 它們包括

  • STK501 - 新增對 64 引腳 TQFP 封裝的微控制器的支援。
  • STK502 - 新增對 64 引腳 TQFP 封裝的 LCD AVR 的支援。
  • STK503 - 新增對 100 引腳 TQFP 封裝的微控制器的支援。
  • STK504 - 新增對 100 引腳 TQFP 封裝的 LCD AVR 的支援。
  • STK505 - 新增對 14 引腳和 20 引腳 AVR 的支援。
  • STK520 - 新增對 AT90PWM 系列的 14 引腳和 20 引腳微控制器的支援。

第三方板

[編輯 | 編輯原始碼]

第三方有許多基於 AVR 的開發和/或應用板,這裡不可能列出所有這些板。

  • Arduino 是圍繞 ATmega328(在舊板中是 ATmega8 或 ATmega168)構建的,旨在與開源開發環境一起使用。
  • 斯坦福大學 Pascal Stang 先生的 基於 AVR 的支援和應用板
  • GPMPU40 支援許多不同的 Atmel AVR 晶片
  • Futurlec 2313 板(請注意,AT90S2313 已過時,並已被 ATtiny2313 取代。)
  • Olimex 生產許多基於 AVR 的開發和原型製作板,並提供了一份指向 示例專案 的連結列表。
  • Protostack 擁有 28 引腳 AVR 微控制器(atmega8 等)的開發板和套件,以及許多 AVR 教程

程式設計介面

[編輯 | 編輯原始碼]

有很多方法可以將程式程式碼寫入 AVR。

線上程式設計

[編輯 | 編輯原始碼]

從功能上來說,ISP 是透過 SPI 完成的,在重置方面有一些調整。 只要 AVR 的 SPI 引腳沒有連線到任何干擾性內容,AVR 晶片就可以在重新程式設計時焊接在板上。 需要的只是一個 6 針插頭和一個經濟實惠的 PC 介面卡。 這是 AVR 開發中最常用的方法。

Atmel 的 AVR ISP mkII 連線到 PC 的 USB 埠,並使用 Atmel 的軟體執行線上程式設計。

avrdude(AVR 下載上傳器)在 Linux、FreeBSD、Windows 和 Mac OS X 上執行,並支援各種線上程式設計硬體,包括 Atmel AVR ISP mkII、Atmel JTAG ICE、舊的 Atmel 序列埠程式設計器以及各種第三方和“自己動手”程式設計器。

高電壓序列程式設計

[編輯 | 編輯原始碼]

HVSP 主要是在較小的 AVR 上的備份模式。 一個 8 針封裝沒有留出多少獨特的訊號組合來啟動 AVR 進入程式設計模式。 HVSP 在處理 AVR 時至關重要,這些 AVR 的 RESET 引腳被停用,以允許將其用作另一個通用 I/O 引腳。 由於 RESET 不再具有用於 SPI 程式設計的內建功能,因此 12 伏訊號允許可靠地發出程式設計應進行的訊號,因為它是在正常執行期間晶片不應該看到的訊號。

高電壓並行程式設計

[編輯 | 編輯原始碼]

HVP 是較大 AVR 上的備份模式。 它可能是與具有瘋狂振盪器熔絲設定的 AVR 通訊的唯一方法。 並行程式設計也可能更快,如果您有一條適度的生產線,這很有用。

引導載入程式程式設計

[編輯 | 編輯原始碼]

大多數 AVR 型號可以保留一個引導載入程式區域,大小為 256 B - 2 KB,重新程式設計程式碼可以駐留在該區域。 在通電時,引導載入程式首先執行,並進行一些使用者程式設計的判斷,以確定是否要重新程式設計,還是跳轉到主應用程式。 程式碼可以透過任何可用的介面進行重新程式設計,它可以讀取透過乙太網介面卡加密的二進位制檔案,如果它喜歡的話。 Atmel 有關於從 RS-232 及以後的任何介面的應用筆記和程式碼。

引導載入程式在第 引導載入程式和引導扇區 章中進行了詳細介紹。

完全不程式設計

[編輯 | 編輯原始碼]

AT90SC 系列 AVR 可提供帶掩碼 ROM 而不是快閃記憶體的程式儲存器。 [2]

由於前期成本高且最低訂購量大,掩碼 ROM 僅在大規模生產執行中才具有成本效益。

除錯介面

[編輯 | 編輯原始碼]

AVR 為除錯提供了多種選擇,主要涉及晶片在目標系統中執行時的片上除錯。

JTAG 在晶片在目標系統中執行時提供了對片上除錯功能的訪問。 JTAG 允許訪問內部記憶體和暫存器,在程式碼上設定斷點,以及單步執行以觀察系統行為。

Atmel 為 AVR 提供了一系列 JTAG 介面卡。

  1. JTAGICE 介面卡 透過標準序列埠與 PC 連線。 它的價格對於業餘愛好者來說有點貴,大約 300 美元,但比許多其他微控制器模擬系統便宜得多。 JTAGICE 已 停止生產,儘管它仍在 AVR Studio 和其他工具中得到支援。
  2. JTAGICE mkII 取代了 JTAGICE,價格也類似。 JTAGICE mkII 透過 USB 與 PC 連線,並支援 JTAG 和較新的 debugWIRE 介面。
  3. AVR Dragon 是 JTAGICE mkII 的低成本(約 50 美元)替代品,適用於某些目標器件。 AVR Dragon 提供線上序列程式設計、高電壓序列程式設計和並行程式設計,以及 JTAG 或 debugWIRE 模擬,適用於程式儲存器容量小於 32 KB 的器件。

還有幾個第三方 JTAG 偵錯程式/重新程式設計器,價格約為 40 美元,例如來自 Ecros 和 Olimex 的偵錯程式,以及 DIY 專案,包括 EvertoolAquaticus。這些都是原始 JTAGICE 的克隆。

JTAG 也可用於執行 邊界掃描 測試 [3],該測試檢查 AVR 與系統中其他支援邊界掃描的晶片之間的電氣連線。邊界掃描非常適合生產線;業餘愛好者可能更適合使用萬用表或示波器進行測試。

debugWIRE

[edit | edit source]

debugWIRETM 是 Atmel 用於透過單個微控制器引腳提供片上除錯功能的解決方案。它對引腳數量較少的部件特別有用,因為這些部件無法提供 JTAG 所需的四個“備用”引腳。JTAGICE mkII 和 AVR Dragon 支援 debugWIRE。debugWIRE 是在原始 JTAGICE 釋出後開發的,並且沒有一個 JTAG 克隆支援它。

模擬

[edit | edit source]

模擬本身不是除錯介面,但軟體中的模擬可以作為在將設計提交到物理硬體之前有效的除錯輔助工具。

Atmel Studio 在組合語言級別模擬 AVR 核心,並允許檢視和操作所有內部暫存器。 HAPsim 是一組虛擬裝置,可以插入 AVR Studio。它提供 LCD、LED、按鈕和啞終端。

還存在其他軟體包,它們提供 AVR 核心和外設的軟體模擬。

  • VMLab 提供全電路模擬以及虛擬示波器。偵錯程式提供單步執行 C 程式碼以及編輯和重建 WinAVR 程式的功能。從 3.12 版開始,VMLab 是免費軟體。
  • AVRora 是一個“AVR 模擬和分析框架”。
  • Proteus 提供原理圖捕獲、PCB 編輯和微控制器模擬,包括 AVR。模擬器將程式碼“下載”到模擬的 AVR 核心。模擬器還支援各種虛擬外設。
  • Simulavr 是一個免費(GPLv2)模擬器,它與 GDB 協同工作,通常與 AVR-GCC 一起使用。

韌體程式設計

[edit | edit source]

沒有 韌體,微控制器就做不了什麼;程式程式碼來告訴微控制器該做什麼。AVR 的韌體可以用多種語言編寫。Atmel 釋出了 AVR 開發初學者指南,是 Atmel 應用雜誌 2001 年夏季 的一部分,它提供了使用 AVR Studio 進行組合語言程式設計的簡要教程。

AVR 組合語言

[edit | edit source]

AVR 微處理器的某些功能只能透過組合語言訪問。

與其他編譯語言相比,組合語言幾乎總是生成最小的程式碼,因此它是在必須適應非常小的程式碼空間的應用程式中的一種流行選擇。

AVR Studio 免費提供,但該程式只能在 Windows 上執行,並且其原始碼不可用。用於 AVR 的兩個特別的免費/開源彙編器是 AVRAToms AVR Assembler

  • B# 是一種現代的面嚮物件語言,專為小型嵌入式系統設計。

BASIC

[edit | edit source]
  • BASCOM-AVR 開發環境 是用於 AVR 系列的 BASIC 編譯器。IDE 包括編輯器、編譯器、模擬器和許多庫函式。演示版限於 4K 程式碼。bascomp.exe 命令列在 Wine 中工作。
  • BASIC to C 有一個免費的入門 ATMEL AVR BASIC,名為 RVK-BASIC,它在 Windows 上執行。下載的版本限於 100 行程式碼。
  • EEBasic 是在 AVR Mega644 上實現的 BASIC,它只需要終端或終端模擬器來進行程式設計;不使用基於 PC 的編譯器(或其他 IDE)。語言擴充套件提供了對片上外設的使用。
  • AttoBASIC 是針對 AVR ATmega88、ATmega168、ATmega328、ATmega2560、ATmega32U4 和 AT90USB1286 微控制器的面向硬體的 Tiny BASIC 的免費實現。這包括使用支援的 AVR 的所有 ARDUINO 產品,以及 TEENSY++2.0。所有支援的 AVR(或 ATmega32U4 和 AT90USB1286 USB 介面)都透過 UART 進行通訊。它包含對 ADC、PWM、SPI、TWI 和 1-Wire 介面的支援,以及輸入捕獲功能(可門控時間選擇的脈衝計數器)、透過單個埠位切換進行的直接數字合成 (DDS) 方波、nRF24L01 射頻收發器和 DHT 溫度和溼度感測器。程式可以透過檔案系統儲存到 EEPROM 並從 EEPROM 載入到 EEPROM,並且自啟動功能允許在啟動時自動執行儲存在 EEPROM 中的程式。LUFA(DFU 和 CDC 模式)和 OptiBoot 引導載入程式已整合到專案中。對於 ATmega88、ATmega168、ATmega328、ATmega2560、ATmega32U4 和 AT90USB1286,可在 4、8、16 和 20 MHz 時鐘速度下獲得預構建的 HEX 檔案。提供帶有和不帶有 OptiBoot-loader(或 LUFA)的構建,以及用於 ATmega32U4 和 AT90USB1286 UART 或 USB 的構建,用於序列 I/O。提供了完整的原始碼以及示例程式。舊版本還支援 ATMEGA163 和 ATMEGA8515/AT90S8515,以及 ATTINY2313/AT90S2313。
  • GCC 也支援 AVR 上的 C++。

由於實現某些 C++ 特性所需的記憶體量,它們不適合在像 AVR 這樣的小型微處理器上使用;這些特性包括異常和模板。但是,當使用合適的 C++ 子集時,生成的程式碼大小與其 C 語言等效程式碼相當。AVR 上 C++ 的一個顯著應用是 Arduino

  • ByteForth (wiki) (購買) – 包括一個(反)彙編器、模擬器、ISP 程式設計器,並支援迄今為止幾乎所有 AVR 微控制器。許多庫函式和示例程式。它附帶一個完整的 (荷蘭語) 語言手冊。然而,有一個英文版本,其中包含免費但完整的 2 kB 演示版本 的速成課程。ByteForth 在 DOS 或任何支援工作 DOS 盒子的系統下執行,如 Linux、Windows 95、Windows 98SE 等。
  • amforth: ATmega forth 是一個用於 AVR ATmega 微控制器的緊湊型 Forth。它是在 GPL 2 下發布的,並以 ANS 94 為模型。
  • Avise (Atmel VIrtual Stack Engine) 是“Forth 程式語言的修改版本”。Avise 只能以 HEX 檔案的形式獲得,以程式設計到支援的 AVR 中;原始碼不可用。作者的網站還包括一些與 Avise 一起使用的 PCB 佈局。
  • PFAVRpForth 到 AVR 的移植版本(GNU GPL)。
  • avrforth 是一個用於 Atmel AVR 系列微控制器的 16 位子程式執行緒 Forth 核心。
  • FlashForth 是一個用於 Atmel Atmega 系列微控制器的 16 位子程式執行緒 Forth 系統。
  • MikroForth 針對 ATtiny(文件為德語)
  • asforth 一個類似子程式執行緒 Forth 的系統

請注意,一些 Forth 環境在 AVR 上以互動方式執行。例如,Avise 在 AVR 的 UART0 上提供一個控制檯,可以接受新的單詞定義並執行操作。PC 上不需要任何軟體(除了終端模擬器)。

  • NanoVM - 用 C 編寫的 Java 虛擬機器,適用於具有至少 8k 快閃記憶體的 Atmel AVR 微控制器。
  • MCU Java 原始碼 - Java 原始碼到 C 原始碼的轉換器,允許用 Java 編寫 MCU 程式。

JavaScript

[編輯 | 編輯原始碼]
  • Espruino - 用於 STM32F1-F4 ARM Cortex 微控制器的 JavaScript 直譯器。
  • uLisp - 用於 Arduino 的 Lisp 直譯器。基於 Common Lisp 的子集,支援 ATmega328、ATmega2560 和 ATmega644/1284。
  • AVRco 開發環境 – IDE 還包括模擬器和帶有 JTAG-ICE 的 HLL 偵錯程式。包括大量庫函式。
  • MikroPascal – 包括 AVR 特定庫,以及幫助和示例。免費版本限於 4 kB。
  • 嵌入式 Pascal – 在 Windows 95、98 和 NT 下執行的 IDE。語言擴充套件提供在 Pascal 程式碼中混合 AVR 彙編程式碼。
  • Micro Python 是 Python 3 程式語言的精簡快速實現,經過最佳化可在微控制器上執行。
  • PyMite 是 Python 的一個子集,可以在“任何具有至少 64 KiB 程式記憶體和 4 KiB RAM 的 AVR 系列裝置”上執行。

Atmel 官方網站

[編輯 | 編輯原始碼]

程式設計和教育網站

[編輯 | 編輯原始碼]

郵件列表和論壇

[編輯 | 編輯原始碼]
  • Muhammad Ali Mazidi - AVR 微控制器和嵌入式系統:使用匯編和 C,Pearson Education。
  • Dhananjay Gadre - 程式設計和定製 AVR 微控制器,McGraw-Hill,2000。
  • Richard H. Barnett、Sarah A. Cox、Larry D. O'Cull - 嵌入式 C 程式設計和 Atmel AVR,Thomson Delmar Learning,2002。
  • John Morton - AVR:入門課程,Newnes,2002。
  • Claus Kuhnel - AVR RISC 微控制器手冊,Newnes,1998。
  • Joe Pardue - 微控制器的 C 程式設計,以 ATMEL 的 AVR Butterfly 和免費的 WinAVR 編譯器為特色,Smiley Micros,2005。 Smiley Micros
  • Chuck Baird - 使用匯編語言程式設計微控制器,Lulu.com,2006。 cbaird.net
  • Richard H. Barnett - 嵌入式 C 程式設計和 Atmel AVR,Delmar Cengage Learning;第 2 版(2006 年 6 月 5 日)

大學課程

[編輯 | 編輯原始碼]

以下課程已知將 Atmel AVR 作為課程的一部分。

大學課程

[編輯 | 編輯原始碼]

以下課程已知將 Atmel AVR 作為課程的一部分。

AVR 專案

[編輯 | 編輯原始碼]
華夏公益教科書