STM8學習筆記(一)內核和架構

注:該帖爲自己在使用stm32時的問題總結貼,如有錯誤歡迎大家指正出來,一起交流學習

目錄

簡介

CPU寄存器


簡介


STM8S是基於8位框架結構的微控制器,其CPU內核有6個內部寄存器,通過這些寄存器可高效 地進行數據處理。STM8S的指令集支持80條基本 20種尋址模式,而且CPU的6個內部寄 存器都擁有可尋址的地址。如果想了解全部STM8S指令集,請參考STM8 微控制器家族編程手冊 (PM0044)。

CPU寄存器

在圖1所示的編程模型中可以看到6個CPU寄存器。在一箇中斷髮生後,寄存器以圖2所示順序入棧,它們以相反的順序出棧。如果需要的話,中斷服務程序可使用POP和PUSH指令來對之進行操作。

CPU寄存器描述

 

STM8編程模型
(圖1)

  • 累加器(A) 
    累加器是一個8位通用目的寄存器,用於保存算術運算、邏輯運算以及數據操作的操作數及結果。 
     
  • 索引寄存器(X和Y) 
    X和Y都是16位的寄存器,可實現高效率的尋址模式。它們也可用作數據操作的暫存器以及用於像乘除法這樣的操作。在大多數情況下,交叉彙編器會在使用了Y寄存器的指令代碼中生成PRECODE指令,用以和使用了X寄存器的指令相區別。 
  • 程序計數器(PC) 
    程序計數器是一個24位的寄存器,用於存儲CPU下一條要執行指令的地址。其內容在每一次指令操作後被自動刷新。由於程序指針有24位,因此STM8的最大尋址範圍可達16M字節。
  • 堆棧指針(SP) 
    堆棧指針是一個16位的寄存器,其內容爲堆棧中下一個可自由分配的單元地址。根據不同的型號,堆棧指針的高位會有一個指定的預設值。 
    堆棧一般用於在中斷調用或子程序調用時存儲 CPU的上下文(程序計數器,關鍵寄存器,相關函數的參數及局部變量,等等)。用戶也可以通過POP和PUSH指令直接對堆棧操作。 
    SP可以被C編譯器的啓動代碼初始化,C語言應用程序會根據用戶所使用的包含絕對地址信息的鏈接文件來進行初始化。如果用戶使用了自己編寫的鏈接文件和啓動代碼,請確認SP被恰當地初始化(具體地址信息請參考相應的數據手冊)。在MCU復位後,或在執行了堆棧復位指令後(RSP),堆棧指針被設爲其被允許的最大值。對於使用了彙編語言的應用程序,用戶可使用ST提供的啓動代碼或編寫自己的啓動代碼來對SP進行正確的初始化。
    入棧操作使堆棧指針值減小,出棧操作使堆棧指針值增加。當堆棧指針值爲其被允許的最小值時,繼續入棧會使堆棧指針值回捲至其最大值,從而會導致先前存儲的數據被覆蓋,但此時沒有中斷或硬件標誌位來指示該事件發生。應用程序需確保堆棧被正確的操作,沒有溢出。
    子程序調用會佔用2或3字節空間。中斷調用會佔用9字節空間來存儲內部寄存器(除SP之外)。請參考圖2。 

    STM8入棧出棧順序
    (圖2)

    *注:WFI/HLAT指令會預先保存CPU上下文。如果CPU處於WFI或HALT狀態下有中斷髮生,則進入中斷所需的延時會相應減少。
  • 條件代碼寄存器(CC) 
    條件代碼寄存器是一個8位寄存器,用於指示剛剛被執行的指令結果及處理器的狀態。寄存器的第7位(MSB)是保留位,這些位可以被用戶的程序或代碼單獨地測試,測試的結果可用於指示程序或代碼執行後的狀態 。下面的段落將描述每一位的含義。

    STM8中斷級別
    (表1)

    • V:溢出 
      在上一次有符號數的算術操作中,如果結果的最高位有溢出發生,則當該位被置1。請參考INC,INCW,DEC,DECW,NEG,NEGW,ADD,ADDW,ADC,SUB,SUBW,SBC,CP,CPW等指令。
    • I1:中斷屏蔽級別1 
      I1和I0共同用於指示當前狀態下CPU的可中斷性,請參考表1。通過執行RIM,SIM,HALT,WFI,IRET,TRAP和POP指令可對I1和I0置位或清零。I1和I0也會在CPU進入中斷服務程序時被硬件自動設置爲該中斷對應的中斷級別。
    • H:半進位 
      在執行ADD或ADC操作的過程中,當ALU的第3位和第4位間發生進位時,H位會被置1,這對於
      BCD碼算術運算很有意義。
    • I0:中斷屏蔽級別0 
      請參考表1。
    • N:負數 
      當上一次的算術、邏輯或數據操作的結果是負的情況下,N位被置1(例如結果的最高位是邏輯1)。
    • Z:零 
      當上一次的算術、邏輯或數據操作的結果是零時,Z位被置1。
    • C:進位 
      在上一次的算術操作中,如果結果的最高位發生進位或借位,則當該位被置1。當執行位測試,分支,移位,旋轉和加載指令時,該位也會收到影響。請參考ADD,ADC,SUB, SBC等指令。 
      在除法操作中,C位用來指示在指令執行中是否有錯誤發生(商溢出或0作除數)。請參考DIV指令。 
      在位測試操作中,被測試的位被複制到C位;請參考BTJF,BTJT指令。在移位和旋轉操作中,C位根據結果進行相應地更新;請參考RRC,RLC,SRL,SLL,SRA指令。 
      用戶還可以通過SCF,RCF,CCF指令對C位進行置位,清除和取反。
      例子:加法操作

      STM8加法操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章