EC 微控制器 - CR16C+
EC 微控制器
KBC/EC晶片因為需求的增加,除了是SMBUS的MASTER,還新增了很多功能,需要加入其他模組組合來完成需求。以KBC為例,需有一個模組針對PORT60/64解碼再把指令和資料傳送給晶片的模心處理器搭配Firmware回傳資料告知系統資料已接收完成。本章節將詳細介紹KBC/EC晶片中的各模組的功能,由了解模組功能開始,進而思考其用途,最後配合Firmware的設定、啟動來達成各模組所需負擔的工作。
EC 所使用的微處理器會隨著功能的要求而選擇符合使用的微處理器,現今市面上有 8 位元的8051,CR16C+及ARM Cortex M0-M4F系列。本篇文章選擇介紹資料較少的CR16C+,早期 EC 的 Firmware 是使用單晶片的組合語言來撰寫,因此要成為一個EC的程式設計師,需要先了解單晶片的組合語言的指令,才可以處理當程式最佳化後,造成的問題。並且從指令集中更了解微處理器架構。
CR16X 的資料型分為整數及布林數,布林數在組譯時,會轉成整數。整數可分為8 / 16 / 32 位元等。
CR16X 的暫存器分為幾個部分,有16個一般用途的暫存器、4個用於位址定址用的暫存器、一個運算處理器狀態暫存器、一個設定暫存器及一群除錯用暫存器。
R0-R13是用於一般資料運算或移動使用,其中R12及R13為32位元,,可以拿來用於程式定址使用,使用時需要外加小括號。RA使用儲存副程式呼叫時的返回位址。SP用於指示Firmware堆疊位址指標。
- PC - 是指Firmware的程式位址指標。
- ISP (Interrupt Stack Pointer) 用於儲存硬體中斷使用的堆疊指標。
- USP (User Stack Pointer) 用於儲存可程式化中斷使用的堆疊指標。
- INTBASE (Interrupt Base Register) 儲存中斷服務程式的暫存器。
- PSR (Processor Status Register) 處理器狀態暫存器,如下圖
Flag
|
Description
|
T
|
用於程式單步追踪
|
P
|
用於程式追踪
|
U
|
用於指示程式正進入使用者可程式中斷服務程式。也就是USP正被使用。
|
F
|
用於指示指令動作結果,例如:測試指令的結果。
|
E
|
用於指示可程式中斷是否可以發生。
|
I
|
用於指示所有的中斷是否可以發生。
|
C
|
用於指示在加法或減法完成後,有無進位或借位產生
|
L
|
用於表示兩個無符號整數比較結果,目的變數小於來源變數。
|
Z
|
用於表示兩個整數比較結果,目的變數等於來源變數。
|
N
|
用於表示兩個有符號整數比較結果,目的變數小於來源變數。
|
Flag
|
Description
|
DC
|
設定Data Cache 的功能
|
LDC
|
設定Lock Data Cache的功能
|
IC
|
設定Instruction Cache的功能
|
LIC
|
設定Lock Instruction Cache的功能
|
ED
|
指示ISR的位址指標是16/32位元
|
SR
|
指示是否要相容於舊的CR16B的指令
|
CR16X指令的格式為指令+來源變數+目的變數。指令的定址方式可分成幾種:
- 暫存器定址 [Register/Pair Mode] – 來源和目的皆為暫存器。EX : ADDB R1,R2
- 立即定址 [Immediate Mode] – 來源變數為立即值。EX:MULW $4,R4
- 相對定址 [Relative Mode] – 變數的值源於相對於的記憶體空間,只能參照一般暫存器或PC取得。EX:LOADW 12(R5),R6
- 絕對定址 [Absolute Mode] – 變數的值源於絕對的記億體空間。EX:LOADB 40000,R5
- 索引定址 [Index Mode ] -變數的值源於相對於索引值的記憶體空間,索引值存於R12或R13。EX:LOADW [R12]4(R5,R4),R6
CR16X的指令有:
- 搬動指令
- MOVB/W/D – 把來源變數移動到目的變數上
- MOVXB/W – 依符號數把原本BYTE/WORD的資料轉為WORD/DWORD
- MOVZB/W - 把原本BYTE/WORD的資料轉為WORD/DWORD,高位元皆補零。
- 數學演算指令
- ADDB/W/D – 一般加法
- ADDUB/W/D – 一般加法不影響PSR
- ADDCB/W/D – 把進位旗標一起加到目的變數裡
- SUBB/W/D – 一般減法。
- SUBCB/W - 把進位旗標一起減到目的變數裡。
- MULB/W – 一般乘法。
- MULSB/W –有符號數的乘法。
- MACSW/MACUW/MACQW – 將兩個有符號/無符號的變數相乘之後,把相乘結果的值加到目的變數上。
- 比較指令
- CMPB/W/D – 兩個變數比較
- Bcond – 依條件成立跳躍到相對空間範圍0-16M的空間內
- BEQ0B/W,BNE0B/W – 來源變數為0或不為0跳躍。
cond Code
|
Condition
|
True State
|
EQ
|
Equal
|
Z=1
|
NE
|
Not Equal
|
Z=0
|
CS
|
Carry Set
|
C=1
|
CC
|
Carry Clear
|
C=0
|
HI
|
Higher [unsigned]
|
L=1
|
LS
|
Lower or Same [unsigned]
|
L=0
|
GT
|
Greater [signed]
|
N=1
|
LE
|
Less or Equal [signed]
|
N=0
|
FS
|
Flag Set
|
F=1
|
FC
|
Flag Clear
|
F=0
|
LO
|
Lower
|
Z=0 and L=0
|
HS
|
Higher or Same
|
Z=1 or L=1
|
LT
|
Less
|
Z=0 and N=0
|
GE
|
Greater or Equal
|
Z=1 or N=1
|
- 邏輯演算指令
- ANDB/W/D – 做邏輯AND的演算
- ORB/W/D - 做邏輯OR的演算。
- XORB/W/D - 做邏輯XOR的演算。
- Scond – 儲存判斷結果於目的變數
- 位移演算指令
- ASHUB/W/D – 移位演算依有號數值補其空位。正值為左移;負值為右移。
- LSHB/W/D - 移位演算其空位補零。正值為左移;負值為右移。
- 位元演算指令
- CBITB/W – 清除目的變數的指定位元。
- SBITB/W – 設定目的變數的指定位元
- TBIT/B/W – 測試暫存器/記憶體的指定位元電位。
- 處理器演算指令
- LPR/D – 讀取處理器的暫存器
- SPR/D –設定處理器的暫存器
- CINV[I,D,U] – 清除Cache內的指令、資料或非LOCK的部分。
- DI – Disable 可程式的中斷發生
- EI – Enable可程式的中斷發生
- EIWAIT – 下個中斷發生時,Enable可程式中斷
- NOP – 不做任何事。
- WAIT – 程式暫停執行直到中斷發生。
- 跳躍和連結的指令
- BAL RA,L – 把下一個指令的位址存於RA,然後跳到L程式裡執行
- BR – 無條件跳躍
- EXCP – 例外處理
- Jcond – 依條件成立跳躍到絕對的位址
- JAL RA,L - 把下一個指令的位址存於RA,然後跳到L程式裡執
- JUMP -無條件跳躍
- RETX – 由中斷服務程式返回
- POPRT – 取出堆疊中暫存器的值。
- PUSH – 把暫存器的值放到堆疊中
- 載入和儲存的指令
- LOADB/W/D – 載入記憶體或暫存器的值。
- STORB/W/D – 儲存記憶體或暫存器的值
- LOADM/MP – 把R0/(R1,R0)對映的記憶體的值載入暫存器R2, R3, R4, R5, R8, R9, R10, R11等,最多只能載入8個暫存器
- STORM/MP -把暫存器[R2, R3, R4, R5, R8, R9, R10, R11]的值存入R0/(R1,R0)對映的記憶體,最多只能存入8個
留言
張貼留言