AVR.1 基本架構
AVR 90S4414是一顆Embedded Controller, 它是由下列單元組成 : CPU核心 (包括算術邏輯單元ALU, 程式計數器PC, 指令解碼器, 32個一般用途暫存器, 堆疊指標SP), 資料寬度為16-bit的程式記憶體 (共2K Words), 256 bytes SRAM和各式周邊I/O
32個一般用途暫存器 (General Purpose Working Registers)
AVR的CPU一共有32個一般用途的暫存器,分別是R0 ~ R31,屬於資料記憶空間的一部分; 這32個暫存器是一個多埠 (Multi-Port) 記憶體,可同時讀取2個暫存器, 並寫回一個暫存器, 例如 : ADD R16,R17; 就是同時讀取暫存器R16和暫存器R17, 最後寫回暫存器R16
算術邏輯單元 (Arithmetic Logic Unit, ALU)
算術邏輯單元ALU直接連接到32個一般用途暫存器, ALU負責暫存器與暫存器之間的運算, 或是暫存器與常數之間的運算; ALU的運算可分為3種類型 : 算術的運算, 邏輯的運算和位元的運算
程式計數器 (Program Counter, PC)
程式計數器PC連接到程式記憶體的Address Port, 作為程式讀取的指標; 讀取完一個Word的指令後,PC會自動加1, 指向下一行指令, 即PC + 1; 但是如果遇到相對分支指令, 如RJMP, RCALL時, PC還會再加K, 即PC+K+1; 另一種是絕對分支指令, 如IJMP, ICALL, PC的計數情形是PC+K
指令解碼器 (Instruction Decoder)
指令解碼器將指令碼 (或稱機械碼) 轉為控制信號, 控制CPU內其他各個單元, 例如ALU和暫存器及PC
堆疊指標 (Stack Pointer, SP)
也是屬於AVR的CPU核心之一, 它實際的位址在I/O暫存器中, 在6-5節會進一步介紹
AVR的記憶空間 (Memory Space)
AVR的記憶空間分別是程式記憶空間和資料記憶空間, 這兩個記憶空間是各自獨立的兩部分, 這種架構屬於 Havard architecture (圖6-2所示)
Havard architecture使得CPU可同時存取程式及運算所需的資料, 相較於另一種架構方式V--- architecture (共用同一個記憶空間), 前者有較好的執行效率 (在6-8節有進一步的描述)
程式記憶空間
|
Program FLASH (2K x 16)
|
$000
$7FF |
資料記憶空間
|
32個 一般用途 暫存器 |
$0000
$001F $0020
$005F $0060
$015F $0160
$FFFF |
|
64個I/O 特殊用途 暫存器
|
|
|
內部 SRAM (256x8)
|
|
|
外部 SRAM
|
|
|
|
程式記憶空間 (Program Memory Space, 2K x 16-bits)
90S4414的程式記憶空間最多容納2K Words指令碼, 位址從$000 ~ $7FF, 其中$000 ~ $00C是作為中斷向量之用, 所以程式最好在$00D之後開始放置, 不要佔據中斷向量的空間
資料記憶空間 (Data Memory Space, 8-bits)
包括32個一般用途暫存器, 64個I/O暫存器, 256個內建SRAM, 並且可另外擴充一顆外建SRAM, 它們的特性和相關的指令如下 :
32個一般用途暫存器
|
R0 |
|
R1 |
|
R2 |
|
.... |
|
R29 |
|
R30 |
|
R31 |
|
I/O暫存器
|
|
$ 00 |
|
$ 01 |
|
$ 02 |
|
.... |
|
$ 3D |
|
$ 3E |
|
$ 3F |
資料記憶空間的位址
|
$ 0000 |
|
$ 0001 |
|
$ 0002 |
|
.... |
|
$ 001D |
|
$ 001E |
|
$ 001F |
|
|
|
$ 0020 |
|
$ 0021 |
|
$ 0022 |
|
.... |
|
$ 005D |
|
$ 005E |
|
$ 005F |
32個一般用途暫存器 7 0 位址
|
|
R0 |
$00 $01 $02
$0F $10
$1A $1B $1C $1D $1E $1F |
|
|
R1 |
|
|
|
R2 |
|
|
|
... |
|
|
|
R15 |
|
|
|
R16 |
|
|
|
... |
|
|
X暫存器低位元 |
R26 |
|
|
X暫存器高位元 |
R27 |
|
|
Y暫存器低位元 |
R28 |
|
|
Y暫存器高位元 |
R29 |
|
|
Z暫存器低位元 |
R30 |
|
|
Z暫存器高位元 |
R31 |
在資料記憶體位址從 $0000 ~ $001F; 絕大部分的指令可以直接存取到這32個暫存器; 但是有關暫存器和常數運算的指令 (SBCI, SUBI, CPI, ANDI, ORI, LDI), 只限於使用R16 ~ R31的暫存器 (6-2節有進一步的說明)
另外, R26 ~ R31這六個暫存器, 可以組合成為三組16-bits的暫存器, 分別稱之為X暫存器, Y暫存器和Z暫存器; 用來作為間接位址的指標暫存器 (indirect address pointer register); 6-4節有進一步的說明
15 0
|
X暫存器 |
7 0 |
7 0 |
R27($1B) R26($1A) 15 0
|
Y暫存器 |
7 0 |
7 0 |
R29($1D) R28($1C) 15 0
|
Z暫存器 |
7 0 |
7 0 |
R31($1F) R30($1E)
X暫存器 (R27:R26, R27在高位元,R26在低位元, 也可以以XH,XL表示)
Y暫存器 (R29:R28, R29在高位元,R28在低位元, 也可以以YH,YL表示)
Z暫存器 (R31:R30, R31在高位元,R30在低位元, 也可以以ZH,ZL表示)
64個I/O暫存器
在資料記憶體位址從 $0020 ~ $005F, 每一個暫存器各自有它的特殊用途, 例如 : 狀態暫存器, 堆疊指標, 計時/計數器, 中斷設定等
指令IN, OUT可以移轉 I/O暫存器和32個一般暫存器之間的資料; 指令SBI, CBI可以設定 I/O暫存器的位元為0或;而指令SBIS,SBIC 可以讀取I/O暫存器的位元, 做為分支與否的條件
256 bytes內部SRAM
在資料記憶體位址從 $0060~$015F
內部SRAM提供較大量資料的存取, 指令LD, ST, LDS, STS, PUSH, POP可直接存取內部SRAM的資料
外部SRAM
另外,若需更大的資料記憶體空間, 可自行擴充SRAM, 外部SRAM在資料記憶體位址從 $0160 ~ $FFFF
指令LDS, STS可以存取外部SRAM, 不過在存取外部SRAM前, 必須將MCUCR暫存器的bit 7 (SRE) 設定為1 (SRE設定為0,是無法存取外部SRAM的)
