內容簡介
本書是全球首本系統論述ARM Cortex-M0處理器及其編程的圖書。本書既有ARM Cortex-M0處理器核心、體系結構及其套用的詳盡論述,也有指令集、編譯器、軟體開發的基本論述,甚至也涵蓋如何定位程式代碼中的錯誤和軟體移植等方面的知識。本書適合的讀者對象包括:嵌入式產品設計工程師、嵌入式軟體開發人員、電子愛好者以及學習嵌入式系統課程(ARM Cortex-M0)的高年級本科生及研究生等。
作者簡介
姚文詳(Joseph Yiu),英國ARM公司資深專家,12年半導體行業從業經歷(在ARM公司工作10年之餘)。曾參與多個處理器設計項目,包括ARM Cortex-M3和Cortex-M0,並參與了多種ARM IP(智慧財產權)產品的開發。Joseph Yiu為微控制器系統級設計專家,並涉獵了諸多相關領域,包括ARM Cortex-M系列微控制器軟體開發、微控制器市場以及片上系統設計技術。其他代表性著作有《The Definitive Guide to the ARM Cortex-M3, 2nd Edition》、《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors, 3rd Edition》(中文翻譯版即將由清華大學出版社出版發行)。
圖書目錄
譯者序
推薦序
前言
致謝
本書約定
縮寫術語
第1章緒論
1.1為什麼要選擇CortexM0
1.1.1能耗效率
1.1.2代碼密度
1.1.3易於使用
1.2CortexM0處理器的套用
1.3ARM和ARM處理器的背景
1.4CortexM0處理器說明和ARM體系結構
1.5ARM處理器和ARM生態系統
1.6開始使用CortexM0處理器
1.7本書的結構和資源
第2章CortexM0技術綜述
2.1CortexM0處理器簡介
2.2ARMCortexM0處理器的特性
2.2.1系統特性
2.2.2套用特性
2.2.3調試特性
2.2.4其他特性
2.3CortexM0處理器的優勢
2.3.1能耗效率
2.3.28位和16位架構的局限性
2.3.3易於使用,軟體可移植
2.3.4選擇多樣化
2.4低功耗套用
2.4.1門數量低
2.4.2高效率
2.4.3低功耗特性
2.4.4邏輯單元提升
2.5CortexM0的軟體可移植性
第3章體系結構
3.1概述
3.2系統模型
3.2.1操作模式和狀態
3.2.2暫存器和特殊暫存器
3.2.3R0R12
3.2.4R13,棧指針(SP)
3.2.5R14,連結暫存器(LR)
3.2.6R15,程式計數器(PC)
3.2.7xPSR,組合程式狀態暫存器
3.2.8應用程式狀態暫存器(APSR)的行為
3.2.9PRIMASK:中斷禁止特殊暫存器
3.2.10CONTROL:特殊暫存器
3.3存儲器系統
3.4棧空間操作
3.5異常和中斷
3.6嵌套向量中斷控制器(NVIC)
3.6.1靈活的中斷管理
3.6.2支持嵌套中斷
3.6.3向量化的異常入口
3.6.4中斷禁止
3.7系統控制塊(SCB)
調試系統
3.8程式映像和啟動流程
第4章CortexM0編程入門
4.1嵌入式系統編程入門
4.1.1微控制器是如何啟動的
4.1.2嵌入式程式設計
4.2輸入和輸出
4.3開發流程
4.4C編程和彙編編程
4.5什麼是程式映像
4.5.1向量表
4.5.2C啟動代碼
4.5.3程式代碼
4.5.4C庫代碼
4.5.5RAM中的數據
4.6C編程:數據類型
4.7用C語言操作外設
4.8Cortex微控制器軟體接口標準(CMSIS)
4.8.1CMSIS介紹
4.8.2CMSIS中有什麼是標準化的
4.8.3CMSIS的組織結構
4.8.4使用CMSIS
4.9CMSIS的優勢
第5章指令集
5.1ARM和Thumb指令集的背景
5.2彙編基礎
5.2.1彙編語法一覽
5.2.2後綴的使用
5.2.3Thumb代碼和統一彙編語言(UAL)
5.2.4指令列表
5.2.5處理器內移動數據
5.2.6存儲器訪問
5.2.7棧空間訪問
5.2.8算術運算
5.2.9邏輯運算
5.2.10移位和循環操作
5.2.11展開和順序反轉操作
5.2.12程式流控制
5.2.13存儲器屏障指令
5.2.14異常相關指令
5.2.15休眠模式特性相關指令
5.2.16其他指令
5.3偽指令
第6章指令集使用實例
6.1概述
6.2程式控制
6.2.1IfElse
6.2.2循環
6.2.3進一步了解跳轉指令
6.2.4跳轉條件的典型用法
6.2.5函式調用和函式返回
6.2.6跳轉表
6.3數據訪問
6.3.1簡單數據訪問
6.3.2使用存儲器訪問指令的例子
6.4數據類型轉換
6.4.1數據大小的轉換
6.4.2大小端轉換
6.5數據處理
6.5.164位/128位加法
6.5.264位/128位減法
6.5.3整數除法
6.5.4無符號整數開方根
6.5.5位和位域運算
第7章存儲器系統
7.1概述
7.2存儲器映射
7.3程式存儲器,BootLoader和存儲器重映射
7.4數據存儲器
7.5支持小端和大端
7.5.1數據類型
7.5.2硬體行為對編程的影響
7.5.3數據對齊
7.5.4訪問非法地址
7.5.5多暫存器載入和存儲指令的使用
7.6存儲器屬性
第8章異常和中斷
8.1什麼是異常和中斷
8.2CortexM0處理器的異常類型
8.2.1不可禁止中斷(NMI)
8.2.2硬體錯誤
8.2.3SVC(請求管理調用)
8.2.4PendSV(可掛起的系統調用)
8.2.5系統節拍
8.2.6中斷
8.3異常優先權定義
8.4向量表
8.5異常流程概述
8.5.1接受異常請求
8.5.2壓棧和出棧
8.5.3異常返回指令
8.5.4末尾連鎖
8.5.5延遲到達
8.6EXC_RETURN
8.7異常入口流程的細節
8.7.1壓棧
8.7.2取出向量並更新PC
8.7.3暫存器更新
8.8異常退出流程的細節
8.8.1暫存器出棧
8.8.2從返回地址取值並執行
第9章中斷控制和系統控制
9.1NVIC和系統控制塊特性
9.2中斷使能和清除使能
9.3中斷掛起和清除掛起
9.4中斷優先權
9.5中斷控制的通用彙編代碼
9.5.1使能和禁止中斷
9.5.2設定和清除中斷掛起狀態
9.5.3設定中斷優先權
9.6異常禁止暫存器(PRIMASK)
9.7中斷輸入和掛起行為
簡單的中斷處理
9.8中斷等待
9.9系統異常的控制暫存器
9.10系統控制暫存器
9.10.1CPUID基址暫存器
9.10.2套用中斷和復位控制暫存器
9.10.3配置和控制暫存器
第10章支持作業系統的特性
10.1支持作業系統的特性概述
為什麼要使用嵌入式作業系統
10.2SysTick定時器
10.3SysTick暫存器
10.3.1設定SysTick
10.3.2SysTick用於時間測量
10.4進程棧和進程棧指針
10.5SVC
10.6PendSV
第11章低功耗特性
11.1低功耗嵌入式系統概述
11.2CortexM0處理器的低功耗優勢
11.3低功耗特性概述
11.4休眠模式
11.5等待事件(WFE)和等待中斷(WFI)
11.5.1等待事件(WFE)
11.5.2等待中斷(WFI)
11.5.3喚醒條件
11.6退出休眠特性
11.7喚醒中斷控制器
第12章錯誤處理
12.1錯誤異常概述
錯誤是怎么發生的
12.2分析錯誤
12.3意外切換至ARM狀態
12.4實際套用中的錯誤處理
12.5鎖定
12.5.1鎖定的原因
12.5.2鎖定期間發生了什麼
12.6防止鎖定
第13章調試特性
13.1軟體開發和調試特性
13.2調試特性一覽
13.3調試接口
13.4暫停模式和調試事件
13.5調試系統
第14章KeilMDK入門
14.1KeilMDK介紹
14.2使用KeilMDK的第一步
14.2.1創建Blinky工程
14.2.2創建工程代碼
14.2.3工程設定
14.2.4編譯和建立程式
14.2.5使用調試器
14.3其他的工程配置
14.3.1目標,源檔案組
14.3.2編譯器和代碼生成選項
14.3.3模擬器
14.3.4在RAM中運行
14.4定製Keil中的啟動代碼
14.5使用Keil中的分散載入特性
第15章簡單應用程式開發
15.1使用CMSIS
15.2將SysTick用作單發定時器
15.3UART示例
15.3.1簡單的輸入和輸出
15.3.2重定向
15.3.3開發自己的輸入和輸出函式
15.4簡單中斷編程
15.4.1中斷編程概述
15.4.2度盤控制接口實例
15.4.3中斷控制函式
15.5CMSIS的不同版本
第16章彙編工程和C與彙編混合工程
16.1用彙編開發工程
16.2彙編編程的建議規則
16.3彙編函式的結構
16.4簡單的彙編工程實例
16.5為變數分配數據空間
16.6用彙編實現UART
16.7其他的文字輸出函式
複雜的跳轉處理
16.8混合語言工程
16.8.1在彙編中調用C函式
16.8.2在C代碼中調用彙編函式
16.9嵌入彙編
16.10使用特殊指令
16.11習語識別
第17章在編程中使用低功耗特性
17.1概述
17.2CortexM0處理器的休眠模式回顧
17.3在程式中使用WFE和WFI
17.4使用掛起傳送事件特性
17.5使用退出休眠特性
17.6喚醒中斷控制器(WIC)特性
17.7事件通信接口
17.8開發低功耗應用程式
17.9LPC111x的低功耗特性使用示例
第18章使用SVC、PendSV和KeilRTXKernel
18.1概述
18.2使用SVC異常
18.3使用PendSV異常
18.4使用嵌入式OS
18.5KeilRTX實時核心
18.6OS啟動流程
18.6.1簡單的OS實例
18.6.2任務間通信
18.6.3事件通信
18.6.4互斥體
18.6.5信號量
18.6.6信箱訊息
18.6.7周期時間間隔
18.6.8其他的RTX特性
18.6.9應用程式實例
第19章ARMRealView開發組件入門
19.1概述
19.2簡單的應用程式實例
19.3使用分散載入檔案
19.4用C實現的含有向量表的實例
19.5在RVDS中使用MicroLIB
19.6在RVDS中使用彙編進行應用程式開發
19.7Flash編程
19.8使用RealView調試器進行調試
19.9使用RealView調試器的串列線調試
19.10RVDS中的重定向
第20章GNUC編譯器入門
20.1概述
20.2典型的開發流程
20.3簡單的C程式開發
20.4CodeSourcery通用啟動代碼
20.5使用用戶定義的向量表
20.6在gcc中使用Printf
20.7內聯彙編
20.8gcc中的SVC實例
20.9硬體錯誤異常實例
20.10Flash編程和調試
第21章軟體移植
21.1概述
21.2ARM處理器
21.3ARM7TDMI和CortexM0之間的差異
21.3.1操作模式
21.3.2暫存器
21.3.3指令集
21.3.4中斷
21.4從ARM7TDMI向CortexM0移植軟體
21.4.1啟動代碼和向量表
21.4.2中斷
21.4.3C程式代碼
21.4.4彙編代碼
21.4.5原子操作
21.4.6最佳化
21.5CortexM1和CortexM0之間的差異
21.5.1指令集
21.5.2NVIC
21.5.3系統級特性
21.6在CortexM0和CortexM1之間移植軟體
21.7CortexM3和CortexM0之間的差異
21.7.1系統模型
21.7.2NVIC和異常
21.7.3指令集
21.7.4系統級特性
21.7.5調試特性
21.8在CortexM0和CortexM3之間移植軟體
21.9在CortexM0和CortexM4處理器之間移植軟體
21.10從8位機/16位機往CortexM0移植程式
21.10.1通用改動
21.10.2存儲器需求
21.10.38位機和16位機不再適用的最佳化
21.10.4實例:從8051移植到ARMCortexM0
第22章CortexM0產品
22.1概述
22.2微控制器產品和專用標準產品(ASSP)
22.2.1NXPCortexM0微控制器
22.2.2NuMicro微控制器
22.2.3Mocha1ARMCortexM0可配置陣列
22.2.4MelfasMCS7000系列觸控螢幕控制器
22.3編譯器和軟體開發組件
22.3.1Keil微控制器開發套件(MDK)
22.3.2TASKINGVXToolsetforARM
22.3.3IAREmbeddedWorkbenchforARM
22.3.4CrossWorksforARM
22.3.5RedSuite
22.3.6LabVIEWC代碼生成器
22.4開發板
22.4.1LPCXpresso
22.4.2IAR的LPC1114入門套件
22.4.3LPC1114CortexM0模組
22.4.4KeilCortexM0開發板
附錄ACortexM0指令集
附錄BCortexM0異常類型快速參考
B.1異常類型
B.2異常壓棧後的棧內容
附錄C軟體接口標準(CMSIS)快速參考
C.1數據類型
C.2異常枚舉
C.3NVIC操作函式
C.4系統和SysTick操作函式
C.5核心暫存器操作函式
C.6特殊指令操作函式
附錄DNVIC、SCB以及SysTick暫存器快速參考
D.1NVIC暫存器一覽
D.2中斷設定使能暫存器(NVIC—>ISER)
D.3中斷清除使能暫存器(NVIC—>ICER)
D.4中斷設定掛起暫存器(NVIC—>ISPR)
D.5中斷清除掛起暫存器(NVIC—>ICPR)
D.6中斷優先權暫存器(NVIC—>IRP[0]到NVIC—>IRP[7])
D.7SCB暫存器一覽
D.8CPUID基地址暫存器(SCB—>CPUID)
D.9中斷控制狀態暫存器(SCB—>ICSR)
D.10套用中斷和控制狀態暫存器(SCB—>AIRCR)
D.11系統控制暫存器(SCB—>SCR)
D.12配置控制暫存器(SCB—>CCR)
D.13系統處理優先權暫存器2(SCB—>SHR[0])
D.14系統處理優先權暫存器3(SCB—>SHR[1])
D.15系統處理控制和狀態暫存器
D.16SysTick暫存器一覽
D.17SysTick控制和狀態暫存器(SysTick—>CTRL)
D.18SysTick重裝載值暫存器(SysTick—>LOAD)
D.19SysTick當前值暫存器(SysTick—>VAL)
D.20SysTick校準值暫存器(SysTick—>CALIB)
附錄E調試暫存器快速參考
E.1概述
E.2核心調試暫存器
E.3斷點單元
E.4數據監視點單元
E.5ROM表暫存器
附錄F調試接頭分配
F.110針Cortex調試連線頭
F.220針Cortex調試+ETM接頭
F.3老式的20針IDC接頭排列
附錄GCodeSourceryG++Lite的連結器腳本
附錄H實例代碼檔案
H.1system_LPC11xx.c
H.2system_LPC11xx.h
H.3LPC11xx.hs
H.4uart_test.s
H.5RTX_config.c
附錄I疑難解答
I.1程式不運行/啟動
I.1.1向量表丟失或位置錯誤
I.1.2使用了錯誤的C啟動代碼
I.1.3復位向量中的值錯誤
I.1.4程式映像沒有正確地編程到Flash中
I.1.5錯誤的工具鏈配置
I.1.6錯誤的棧指針初始值
I.1.7錯誤的大小端設定
I.2程式啟動,卻進入了硬體錯誤
I.2.1非法存儲器訪問
I.2.2非對齊數據訪問
I.2.3從匯流排返回錯誤
I.2.4異常處理中的棧被破壞
I.2.5程式在某些C函式中崩潰
I.2.6意外地試圖切換至ARM狀態
I.2.7在錯誤的優先權上執行SVC
I.3休眠問題
I.3.1執行WFE不進入休眠
I.3.2退出休眠過早地引起休眠
I.3.3中斷已經在掛起態時SEVONPEND不工作
I.3.4由於休眠模式可能禁止了某些時鐘,處理器無法喚醒
I.3.5競態
I.4中斷問題
I.4.1執行了多餘的中斷處理
I.4.2執行了額外的SysTick處理
I.4.3在中斷處理中禁止中斷
I.4.4錯誤的中斷返回指令
I.4.5異常優先權設定的數值
I.5其他問題
I.5.1錯誤的SVC參數傳遞方法
I.5.2調試連線受到I/O設定或低功耗模式的影響
I.5.3調試協定選擇
I.5.4使用事件輸出作為脈衝I/O
附錄J實用參考文獻