個牛人在ARM實現嵌入式系統的過程
第一章 概覽
1.1課程概覽
- 認識ARM嵌入式系統(什么是ARM?什么是嵌入式系統?)
- 備戰智能車
- 在科技活動中玩起來
- 積累計算機、電路基礎知識
1.2如何學好嵌入式系統
- 興趣
- 熱愛
- 玩起來
第二章 緒論
2.1計算機的基本概念、發展歷史
- ABC
- 馮.諾依曼體系結構
- 進制轉換ASCIItab
- 數字(digital discrete如:指針走過變盤)與模擬(analog continue如:數字時鍾||時間上是間隔的,數值上是量化的)
- 計算機系統中0、1的表示 例如:用某一電壓段來表示高電平和低電平(TTL 和 CMOS 標准)
2.2從晶體管到CPU
拋開晶體管的諸多嚴謹的限制,只將其看做高電壓導通或者低電壓導通的開關
與門=與非門+非門
由控制電路為0為1來控制電路的通斷,當其為0時out端處於高阻狀態(電路視為斷路)狀態不確定(可以對應為turingmachine中紙帶上的空白),當其為1時電路導通out對應in
把晶體管和開關拋開,更多從邏輯上來理解。更多的邏輯關系:
邏輯的組合 產生功能模塊
半加器(不能進位)
全加器
將抽象出來的“方塊”組合得到一個4位加法器
數據流向的控制電路也可以通過邏輯電路來實現
譯碼電路
分析可知只有當“A端”為“1 0 0 1”時“S端”可以輸出“1”,結合之前的三態門可以實現取出特定編號(如:“1 0 0 1”)中數據的功能。
多路選擇
由兩個輸入信號產生四個控制信號
以上,我們大概可以將其稱為組合邏輯電路(其輸出值總是取決於當前的輸入值,一有輸入馬上會看到輸出)。下面進入時序邏輯電路(有反饋的出現,out值還取決於其上一值等。)
電路分析:
當c為0時d的輸入會被鎖死(即d的值對輸出不起作用)例子:1、(c = 1;d = 0;)->(Q = 0;Q' = 1;) 2、(c = 0;d = 0;)->(Q = 0;Q' = 1;) 3、(c = 0;b = 1;)->(Q = 0;Q' = 1) (當c為0時e,f必都為1;若上次Q = 0,Q' = 1或Q = 1,Q' = 0;由於反饋的存在Q和Q'的值不改變,也從而達到存儲數據的功能)
電路分析:
通過不斷交替給clk 0 1以實現移位操作(也可以看做乘除法)(在實際中此電路並不起作用,因為數值傳遞很快,當給clk 1 時電路中所有位都會刷新為0)
電路分析:
D觸發器級聯起來就可以實現以上功能而不會出錯。
一個概念CPU(大概幾百幾千個晶體管)
功能模塊---助記符---匯編---程序
2.3概念CPU、微控制器MCU和嵌入式系統
通用CPU的發展之路
微控制器MCU不僅僅是一個簡單的CPU
MCU VS CPU
嵌入式系統
2.4八卦計算機歷史
2.5不同領域 不同系列的嵌入式系統
2.6ARM歷史與MKL25Z128 MCU
第二章到此結束,在通過本章學習后我們從計算機聚焦到了MCU上,不局限於課堂的幾十分鍾,習慣於閱讀英文文檔(最好是官方的)。
第三章 MCU基礎
3.1CPU的基本結構和運行機制
上圖是一個基本的MCU內部結構,在了解了MCU內部結構后,在本章中最重要的是在此基礎上理解編程的內部運行機理。接下來我們首先學習MCU內部結構。
MCU的概覽
分析其中的CPU
紅色(運算器,存儲器,控制器)必要,灰色非必要
將ALU拎出來
下面分析Quiz,以對四要素尤其是Status加深理解
- A + B = C 操作數:A B ; 運算 : + ; 運算結果: C ; 標志位:若C的結果發生溢出,則flag會產生溢出記錄;
- A>B 操作數:A B ; 運算 :> (本質上是減法運算,產生一個最高位為1的補碼,即負數) ; 運算結果 : 1 or 0 ; 標志位 : 記錄產生的結果是0 or 1;
- A>>=1(A等於A右移一位)操作數:A ;運算: >>=;運算結果:一個數 ;標志位:當右移至0時產生一個標志;
運算邏輯單元所產生的結果及狀態位需要保存下來,大部分CPU會有叫做register的東西來完成
那么操作數又是如何加載到CPU的呢?
既然數據可以存儲在Memory中,那么如何存取就涉及到了地址與存儲了:
這一切又是如何運行起來的:
在時序電路(“依次”)的驅動下CPU完成指令的獲取:
當指令組成程序時:
被調函數完成執行后后會返回主調函數,這就要求PC = adress ,那么如何完成呢?早期CPU會增加一個返回地址寄存器,但是如果出現函數的嵌套調用,就會要求有多個返回地址寄存器,那么問題就出現了,寄存器不能無限制的加下去,這就出現了一種新機制-------------->堆棧
3.2.1堆(heap)棧(stack)的概念
堆棧多數時候指的只是棧
定義:
作用:
堆棧的運行機制:
堆和棧是有很大區別的,但在嵌入式系統中通常不使用堆。
堆棧溢出(難點)
sp指針寄存器,pc指針寄存器,數據寄存器,標志位寄存器。。。稱為register file(寄存器組)or programmer‘s model(編程模型) 。
學習一種cpu時:
- 了解其可編程的寄存器組
- 了解其指令集
兩種常見的mcu模型:
3.2.2堆棧的概念 頭腦體操
下面通過一個小程序來理解堆棧的運行機理
程序跑在一個如上圖所示的12系列的mcu中
其寄存器組分別為:一個16位的D寄存器(可分為兩個8位的數據寄存器A B),兩個尋址寄存器X Y,一個棧指針寄存器,一個程序計數器,一個狀態位寄存器。
初始狀態
完成堆棧初始化
a值入棧
b值入棧
調用子函數,pc發生跳轉,在棧中保存子函數執行完后要執行的代碼的地址,sp發生跳轉
執行子函數
子函數執行返回語句,將棧中的0x30,0x0c的值賦給pc指針寄存器,sp指針寄存器返回到子函數執行前的位置,之前的0x30,0x0c依然在棧中只是不被棧所承認(注意並不是清空只是可以被心之所覆蓋)。
這個程序實現了a b值交換
3.3.1 ARM的體系結構
進入ARM Cotex M的32位微處理器
常見的微處理器架構:powerpc coldfire arm
以下是對xPSR這個32位寄存器地詳細分析:
xPSR的每一位都會有其對應的功能,我們通過其別名(APSR(應用程序狀態寄存器) IPSR (中斷程序寄存器) EPSR(程序運行狀態寄存器))來訪問其特定位;
APSR:訪問最高四位,來判斷是否有溢出,是否進位。。。
IPSR:訪問低位,保存中斷號
EPSR:訪問中間的T,是否有中斷發生
優先級屏蔽寄存器(PRIMASK register)在這里開關總中斷
cpu狀態寄存器(用戶態(輔堆棧)or特權態(主堆棧))
thread mode :(進程模式)簡單理解為運行main和main調用
handler mode:(句柄模式)發生中斷和響應中斷
3.3.2ARM體系結構----頭腦體操
以上和16位cpu相似
函數調用有不同之處:
- 函數調用指令結束后的指令的地址被記錄在LR寄存器而不是壓入堆棧(armcpu在發生一級調用時會這樣做)
- ARM體系結構向下兼容(thumb and arm )的特性:在將地址賦給LR寄存器時將最低位置1,在將地址值值賦給pc指針寄存器時將值再恢復為0;
總結:
- 完成了兩個內存中值的交換
- 堆棧先入后出的性質
3.4中斷的概念和機制
1、走近中斷
2、定義中斷
3、中斷的使用(只是中斷發生時可讓CPU響應的條件,具體使用方式在下節給出)
(1)打開/關閉總的控制中斷的開關
(2)設置某一中斷發生的標志
(3)中斷的工作流程
3.5中斷子程的概念和編程
3.6 復位、時鍾、存儲器和總線
3.7 小結:MCU的總體結構和程序運行機制
第四章 ARM微控制器的開發
4.1 第一種外設:io
4.2 IO外設的編程實操-點亮LED