EC 微控制器 - CR16C+

EC 微控制器
KBC/EC晶片因為需求的增加,除了是SMBUS的MASTER,還新增了很多功能,需要加入其他模組組合來完成需求。以KBC為例,需有一個模組針對PORT60/64解碼再把指令和資料傳送給晶片的模心處理器搭配Firmware回傳資料告知系統資料已接收完成。本章節將詳細介紹KBC/EC晶片中的各模組的功能,由了解模組功能開始,進而思考其用途,最後配合Firmware的設定、啟動來達成各模組所需負擔的工作。

  1. CR16X 語言

EC 所使用的微處理器會隨著功能的要求而選擇符合使用的微處理器,現今市面上有 8 位元的8051,CR16C+及ARM Cortex M0-M4F系列。本篇文章選擇介紹資料較少的CR16C+,早期 EC 的 Firmware 是使用單晶片的組合語言來撰寫,因此要成為一個EC的程式設計師,需要先了解單晶片的組合語言的指令,才可以處理當程式最佳化後,造成的問題。並且從指令集中更了解微處理器架構。
  • Data Type

CR16X 的資料型分為整數及布林數,布林數在組譯時,會轉成整數。整數可分為8 / 16 / 32 位元等。
  • Register

CR16X 的暫存器分為幾個部分,有16個一般用途的暫存器、4個用於位址定址用的暫存器、一個運算處理器狀態暫存器、一個設定暫存器及一群除錯用暫存器。



R0-R13是用於一般資料運算或移動使用,其中R12R13為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
用於表示兩個有符號整數比較結果,目的變數小於來源變數。

  • CFG (Configuration Register) 用於設定資料參數。


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個

留言

這個網誌中的熱門文章

EC 所需知識 - SMBUS

EC 所需知識 - LPC

EC 所需知識 - KBC