STM8 CPU寄存器描述
STM8S是基于8位框架結(jié)構(gòu)的微控制器,其CPU內(nèi)核有6個(gè)內(nèi)部寄存器,通過這些寄存器可高效 地進(jìn)行數(shù)據(jù)處理。STM8S的指令集支持80條基本 20種尋址模式,而且CPU的6個(gè)內(nèi)部寄 存器都擁有可尋址的地址。如果想了解全部STM8S指令集,請(qǐng)參考STM8 微控制器家族編程手冊(cè) (PM0044)。 CPU寄存器
在圖1所示的編程模型中可以看到6個(gè)CPU寄存器。在一個(gè)中斷發(fā)生后,寄存器以圖2所示順序入棧,它們以相反的順序出棧。如果需要的話,中斷服務(wù)程序可使用POP和PUSH指令來對(duì)之進(jìn)行操作。
本文引用地址:http://www.ex-cimer.com/article/201611/316698.htmCPU寄存器描述
累加器(A)
累加器是一個(gè)8位通用目的寄存器,用于保存算術(shù)運(yùn)算、邏輯運(yùn)算以及數(shù)據(jù)操作的操作數(shù)及結(jié)果。
索引寄存器(X和Y)
X和Y都是16位的寄存器,可實(shí)現(xiàn)高效率的尋址模式。它們也可用作數(shù)據(jù)操作的暫存器以及用于像乘除法這樣的操作。在大多數(shù)情況下,交叉匯編器會(huì)在使用了Y寄存器的指令代碼中生成PRECODE指令,用以和使用了X寄存器的指令相區(qū)別。
程序計(jì)數(shù)器(PC)
程序計(jì)數(shù)器是一個(gè)24位的寄存器,用于存儲(chǔ)CPU下一條要執(zhí)行指令的地址。其內(nèi)容在每一次指令操作后被自動(dòng)刷新。由于程序指針有24位,因此STM8的最大尋址范圍可達(dá)16M字節(jié)。
圖(1)
堆棧指針(SP)
堆棧指針是一個(gè)16位的寄存器,其內(nèi)容為堆棧中下一個(gè)可自由分配的單元地址。根據(jù)不同的型號(hào),堆棧指針的高位會(huì)有一個(gè)指定的預(yù)設(shè)值。
堆棧一般用于在中斷調(diào)用或子程序調(diào)用時(shí)存儲(chǔ) CPU的上下文(程序計(jì)數(shù)器,關(guān)鍵寄存器,相關(guān)函數(shù)的參數(shù)及局部變量,等等)。用戶也可以通過POP和PUSH指令直接對(duì)堆棧操作。
SP可以被C編譯器的啟動(dòng)代碼初始化,C語言應(yīng)用程序會(huì)根據(jù)用戶所使用的包含絕對(duì)地址信息的鏈接文件來進(jìn)行初始化。如果用戶使用了自己編寫的鏈接文件和啟動(dòng)代碼,請(qǐng)確認(rèn)SP被恰當(dāng)?shù)爻跏蓟?具體地址信息請(qǐng)參考相應(yīng)的數(shù)據(jù)手冊(cè))。在MCU復(fù)位后,或在執(zhí)行了堆棧復(fù)位指令后(RSP),堆棧指針被設(shè)為其被允許的最大值。對(duì)于使用了匯編語言的應(yīng)用程序,用戶可使用ST提供的啟動(dòng)代碼或編寫自己的啟動(dòng)代碼來對(duì)SP進(jìn)行正確的初始化。
入棧操作使堆棧指針值減小,出棧操作使堆棧指針值增加。當(dāng)堆棧指針值為其被允許的最小值時(shí),繼續(xù)入棧會(huì)使堆棧指針值回卷至其最大值,從而會(huì)導(dǎo)致先前存儲(chǔ)的數(shù)據(jù)被覆蓋,但此時(shí)沒有中斷或硬件標(biāo)志位來指示該事件發(fā)生。應(yīng)用程序需確保堆棧被正確的操作,沒有溢出。
子程序調(diào)用會(huì)占用2或3字節(jié)空間。中斷調(diào)用會(huì)占用9字節(jié)空間來存儲(chǔ)內(nèi)部寄存器(除SP之外)。請(qǐng)參考圖2。
圖(2)
*注:WFI/HLAT指令會(huì)預(yù)先保存CPU上下文。如果CPU處于WFI或HALT狀態(tài)下有中斷發(fā)生,則進(jìn)入中斷所需的延時(shí)會(huì)相應(yīng)減少。
- 條件代碼寄存器(CC)
條件代碼寄存器是一個(gè)8位寄存器,用于指示剛剛被執(zhí)行的指令結(jié)果及處理器的狀態(tài)。寄存器的第7位(MSB)是保留位,這些位可以被用戶的程序或代碼單獨(dú)地測(cè)試,測(cè)試的結(jié)果可用于指示程序或代碼執(zhí)行后的狀態(tài) 。下面的段落將描述每一位的含義。- V:溢出
在上一次有符號(hào)數(shù)的算術(shù)操作中,如果結(jié)果的最高位有溢出發(fā)生,則當(dāng)該位被置1。請(qǐng)參考INC,INCW,DEC,DECW,NEG,NEGW,ADD,ADDW,ADC,SUB,SUBW,SBC,CP,CPW等指令。
表(1)
I1:中斷屏蔽級(jí)別1
I1和I0共同用于指示當(dāng)前狀態(tài)下CPU的可中斷性,請(qǐng)參考表1。通過執(zhí)行RIM,SIM,HALT,WFI,IRET,TRAP和POP指令可對(duì)I1和I0置位或清零。I1和I0也會(huì)在CPU進(jìn)入中斷服務(wù)程序時(shí)被硬件自動(dòng)設(shè)置為該中斷對(duì)應(yīng)的中斷級(jí)別。 - V:溢出
- H:半進(jìn)位
在執(zhí)行ADD或ADC操作的過程中,當(dāng)ALU的第3位和第4位間發(fā)生進(jìn)位時(shí),H位會(huì)被置1,這對(duì)于
BCD碼算術(shù)運(yùn)算很有意義。 - I0:中斷屏蔽級(jí)別0
請(qǐng)參考表1。 - N:負(fù)數(shù)
當(dāng)上一次的算術(shù)、邏輯或數(shù)據(jù)操作的結(jié)果是負(fù)的情況下,N位被置1(例如結(jié)果的最高位是邏輯1)。 - Z:零
當(dāng)上一次的算術(shù)、邏輯或數(shù)據(jù)操作的結(jié)果是零時(shí),Z位被置1。 - C:進(jìn)位
在上一次的算術(shù)操作中,如果結(jié)果的最高位發(fā)生進(jìn)位或借位,則當(dāng)該位被置1。當(dāng)執(zhí)行位測(cè)試,分支,移位,旋轉(zhuǎn)和加載指令時(shí),該位也會(huì)收到影響。請(qǐng)參考ADD,ADC,SUB, SBC等指令。
在除法操作中,C位用來指示在指令執(zhí)行中是否有錯(cuò)誤發(fā)生(商溢出或0作除數(shù))。請(qǐng)參考DIV指令。
在位測(cè)試操作中,被測(cè)試的位被復(fù)制到C位;請(qǐng)參考BTJF,BTJT指令。在移位和旋轉(zhuǎn)操作中,C位根據(jù)結(jié)果進(jìn)行相應(yīng)地更新;請(qǐng)參考RRC,RLC,SRL,SLL,SRA指令。
用戶還可以通過SCF,RCF,CCF指令對(duì)C位進(jìn)行置位,清除和取反。
例子:加法操作
評(píng)論