ARM Cortex-M0與Cortex-M0+權威指南(第2版)

ARM Cortex-M0與Cortex-M0+權威指南(第2版)

《ARM Cortex-M0與Cortex-M0+權威指南(第2版)》是2018年清華大學出版社出版的書籍,作者是Jsoseph Yiu,吳常玉 張淑 吳衛東。

內容簡介

本書是ARM公司微控制器系統級設計專家JosephYiu的作品。本書全面系統論述Cortex-M0與Cortex-M0+的核心、體系結構、指令集、編譯器、程式設計及軟體移植。全書共23章,近700頁。深度剖析系統模型、指令集以及中斷處理,以利於理解ARMCortex-M0與Cortex-M0+的工作方式;綜合運用彙編語言和C語言實現的豐富的ARMCortex-M0與Cortex-M0+編程案例,有助於快速動手實踐;系統論述軟體的開發流程,並以常用軟體開發工具為例,介紹程式設計的實例及如何定位程式代碼問題和軟體移植等方面的知識;全面揭秘從其他架構處理器進行軟體移植的方法,包括ARM7TDMI、ARMCortex-M3以及8051微控制器移植的實例;深入解析Cortex-M0和Cortex-M0+處理器架構特性的差異(如非特權執行等級、向量表重定位);細緻分析了Cortex-M0+處理器的優勢,比如新的單周期I/O接口、更優的能耗效率、更高的性能以及微跟蹤緩衝(MTB)特性;詳盡介紹了軟體開發工具方面的新內容,如KeilMDK版本5、IAREmbeddedWorkbenchforARM、ARMgcc、CooCox及mbed的實例。另外,為便於讀者學習,全書提供了完整的案例原始碼!

目錄

譯者序1

推薦序3

前言5

致謝7

術語和縮寫9

本書約定13

第1章概論

1.1歡迎來到嵌入式處理器的世界

1.1.1處理器有什麼作用

1.1.2處理器、CPU、核心、微控制器及其命名

1.1.3嵌入式系統的編程

1.1.4學習微控制器需要了解什麼

1.2理解處理器的類型

1.2.1處理器為什麼有很多種類

1.2.2ARM處理器家族概述

1.2.3模糊邊界

1.2.4ARMCortexM處理器系列

1.2.5ARMCortexM0和CortexM0+處理器簡介

1.2.6從CortexM0處理器到CortexM0+處理器

1.2.7CortexM0和CortexM0+處理器的套用

1.3微控制器內部有什麼

1.3.1微控制器內常見部件

1.3.2微控制器套用的處理器的特點

1.3.3矽片技術

1.4ARM介紹

1.4.1ARM生產晶片嗎

1.4.2ARM的產品是什麼

1.4.3晶片廠商為什麼不設計自己的處理器

1.4.4ARM生態系統有什麼特殊之處

1.5ARM處理器和ARM微控制器方面的資源

1.5.1ARM主頁

1.5.2微控制器廠商提供的資源

1.5.3工具廠商提供的資源

1.5.4其他資源

第2章技術綜述

2.1CortexM0和CortexM0+處理器

2.2模組框圖

2.3典型系統

2.4什麼是ARMv6M架構

2.5CortexM處理器間的軟體可移植性

2.6ARMCortexM0和CortexM0+處理器的優勢

2.6.1低功耗和能耗效率

2.6.2高代碼密度

2.6.3低中斷等待和確定行為

2.6.4易於使用

2.6.5系統級特性和OS支持特性

2.6.6調試特性

2.6.7可配置性、靈活性和可擴展性

2.6.8軟體可移植性和可重用性

2.6.9產品選擇的多樣性

2.6.10生態系統支持

2.7CortexM0和CortexM0+處理器的套用

2.7.1微控制器

2.7.2感測器

2.7.3感測器集線器

2.7.4電源管理IC

2.7.5ASSP和ASIC

2.7.6片上系統中的子系統

2.8為什麼要在微控制器套用中使用32位處理器

2.8.1性能

2.8.2代碼密度

2.8.3ARM架構的其他優勢

2.8.4軟體可重用性

第3章嵌入式軟體開發介紹

3.1歡迎進入嵌入式系統編程

3.2基本概念

3.2.1復位

3.2.2時鐘

3.2.3電壓

3.2.4輸入和輸出

3.2.5嵌入式軟體程式流程介紹

3.2.6程式語言選擇

3.3ARMCortexM編程介紹

3.3.1C編程數據類型

3.3.2用C訪問外設

3.3.3程式映像內有什麼

3.3.4SRAM中的數據

3.3.5微控制器啟動時會發生什麼

3.4軟體開發流程

3.5Cortex微控制器軟體接口標準

3.5.1CMSIS介紹

3.5.2CMSISCORE所做的標準化

3.5.3CMSISCORE的組織

3.5.4使用CMSISCORE

3.5.5CMSIS的優勢

3.6軟體開發的其他信息

第4章架構

4.1ARMv6M架構綜述

4.1.1架構的含義

4.1.2ARMv6M架構背景

4.2編程模型

4.2.1操作模式和狀態

4.2.2暫存器和特殊暫存器

4.2.3APSR的行為

4.3存儲器系統

4.3.1概述

4.3.2單周期I/O接口

4.3.3存儲器保護單元

4.4棧存儲操作

4.5異常和中斷

4.6嵌套向量中斷控制器

4.6.1靈活的中斷管理

4.6.2嵌套中斷支持

4.6.3向量異常入口

4.6.4中斷禁止

4.7系統控制塊

4.8調試系統

4.9程式映像和啟動流程

第5章指令集

5.1指令集是什麼

5.2ARM和Thumb指令集背景

5.3彙編基礎

5.3.1彙編語法一覽

5.3.2後綴的使用

5.3.3統一彙編語言(UAL)

5.4指令列表

5.4.1處理器內傳送數據

5.4.2存儲器訪問

5.4.3棧存儲訪問

5.4.4算術運算

5.4.5邏輯運算

5.4.6移位和循環移位運算

5.4.7展開和順序反轉運算

5.4.8程式流控制

5.4.9存儲器屏障指令

5.4.10異常相關指令

5.4.11休眠模式特性相關指令

5.4.12其他指令

5.5偽指令

第6章指令使用示例

6.1概述

6.2程式控制

6.2.1ifthenelse

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.2CortexM0和CortexM0+處理器中的匯流排系統

7.3存儲器映射

7.3.1概述

7.3.2系統級設計

7.4程式存儲器、Bootloader和存儲器重映射

7.4.1程式存儲器和Bootloader

7.4.2存儲器映射

7.5數據存儲器

7.6小端和大端支持

7.7數據類型

7.8存儲器屬性和存儲器訪問許可權

7.9硬體行為對編程的影響

7.9.1數據對齊

7.9.2訪問非法地址

7.9.3多載入和存儲指令的使用

7.9.4等待狀態

第8章異常和中斷

8.1異常和中斷的含義

8.2CortexM0和CortexM0+處理器內的異常類型

8.2.1概述

8.2.2不可禁止中斷

8.2.3HardFault

8.2.4SVC

8.2.5可掛起的系統調用

8.2.6系統節拍

8.2.7中斷

8.3NVIC簡介

8.4異常優先權定義

8.5向量表

8.6異常流程概述

8.6.1接受異常

8.6.2壓棧和出棧

8.6.3異常返回指令

8.6.4末尾連鎖

8.6.5延遲到達

8.7EXC_RETURN

8.8用於中斷控制的NVIC控制暫存器

8.8.1NVIC控制暫存器概述

8.8.2中斷使能和清除使能

8.8.3中斷掛起和清除掛起

8.8.4中斷優先權

8.9異常禁止暫存器(PRIMASK)

8.10中斷輸入和掛起行為

8.10.1簡單中斷處理

8.10.2簡單的脈衝中斷處理

8.10.3中斷掛起狀態在得到服務前取消

8.10.4外設在確認中斷請求時清除掛起狀態

8.10.5ISR完成後中斷請求保持為高

8.10.6進入ISR前產生了多箇中斷請求脈衝

8.10.7在ISR執行期間產生了中斷請求脈衝

8.10.8已禁止中斷的中斷請求確認

8.11異常入口流程

8.11.1壓棧

8.11.2取出向量並更新PC

8.11.3更新暫存器

8.12異常退出流程

8.12.1暫存器出棧

8.12.2從返回地址取指並執行

8.13中斷等待

第9章系統控制和低功耗特性

9.1系統控制暫存器簡介

9.2SCB中的暫存器

9.2.1SCB中的暫存器列表

9.2.2CPUID暫存器

9.2.3用於系統異常管理的控制暫存器

9.2.4向量表偏移暫存器

9.2.5套用中斷和復位控制暫存器

9.2.6系統控制暫存器

9.2.7配置和控制暫存器

9.2.8系統處理控制和狀態暫存器

9.3使用自復位特性

9.4使用向量表重定位特性

9.5低功耗特性

9.5.1概述

9.5.2休眠模式

9.5.3等待事件和等待中斷

9.5.4喚醒條件

9.5.5退出時休眠特性

9.5.6喚醒中斷控制器

第10章作業系統支持特性

10.1支持OS的特性概述

10.2嵌入式系統的作業系統介紹

10.3SysTick定時器

10.3.1SysTick暫存器

10.3.2設定SysTick

10.3.3SysTick用於時間測量

10.3.4將SysTick用作單發定時器

10.4進程棧和PSP

10.5SVCall異常

10.6PendSV

10.7高級話題:在編程中使用SVC和PendSV

10.7.1使用SVC異常

10.7.2使用PendSV異常

10.8高級話題:實際的上下文切換

第11章錯誤處理

11.1錯誤異常概述

11.2錯誤是如何產生的

11.3分析錯誤

11.4意外切換至ARM狀態

11.5實際套用中的錯誤處理

11.6軟體開發期間的錯誤處理

11.7鎖定

11.7.1鎖定的原因

11.7.2鎖定期間發生了什麼

11.8避免鎖定

11.9和ARMv7M架構中錯誤處理的對比

第12章存儲器保護單元

12.1MPU是什麼

12.2MPU適用的情形

12.3技術介紹

12.4MPU暫存器

12.4.1MPU類型暫存器

12.4.2MPU控制暫存器

12.4.3MPU區域編號暫存器

12.4.4MPU區域基地址暫存器

12.4.5MPU區域基本屬性和大小暫存器

12.5設定MPU

12.6存儲器屏障和MPU配置

12.7使用子區域禁止

12.7.1允許高效的存儲器劃分

12.7.2減少所需的區域總數

12.8使用MPU時的注意事項

12.8.1程式代碼

12.8.2數據存儲器

12.9和CortexM3/M4/M7處理器的MPU間的差異

第13章調試特性

13.1軟體開發和調試特性

13.2調試接口

13.2.1JTAG和串列線調試通信協定

13.2.2CortexM處理器和CoreSight調試架構

13.2.3調試接口的設計考慮

13.3調試特性一覽

13.4調試系統

13.5暫停模式和調試事件

13.6利用MTB實現指令跟蹤

第14章Keil微控制器開發套件入門

14.1Keil微控制器開發套件介紹

14.1.1概述

14.1.2工具

14.1.3KeilMDK的優勢

14.1.4安裝

14.2典型的程式編譯流程

14.3硬體介紹

14.3.1FreescaleFreedom開發板(FRDMKL25Z)

14.3.2STMicroelectronicsSTM32L0Discovery

14.3.3STMicroelectronicsSTM32F0Discovery

14.3.4NXPLPC1114FN28

14.4μVisionIDE入門

14.4.1如何開始

14.4.2啟動KeilMDK

14.4.3FreescaleFRDMKL25Z工程設定步驟

14.4.4STMicroelectronicsSTM32L0Discovery工程設定步驟

14.4.5STMicroelectroniceSTM32F0Discovery工程設定步驟

14.4.6NXPLPC1114FN28工程設定步驟

14.5使用IDE和調試器

14.6底層內容

14.6.1CMSIS檔案

14.6.2時鐘設定

14.6.3棧和堆的設定

14.6.4編譯

14.7工程環境的最佳化

14.7.1目標選項

14.7.2最佳化選項

14.7.3運行時環境選項

14.7.4工程管理

14.8使用模擬器

14.9在SRAM中執行程式

14.10使用MTB指令跟蹤

第15章IARembeddedworkbenchforARM入門

15.1IARembeddedworkbenchforARM概述

15.2典型的程式編譯流程

15.3創建簡單的blinky工程

15.4工程選項

15.5在IAREWARM中使用MTB指令跟蹤

15.6提示和要點

第16章GCC入門

16.1GCC工具鏈

16.2關於本章中的例子

16.3典型開發流程

16.4創建簡單的Blinky工程

16.5命令行選項概述

16.6Flash編程

16.7在KeilMDKARM中使用ARM嵌入式處理器GNU工具

16.8在CooCoxIDE中使用ARM嵌入式處理器GNU工具

16.8.1概述和設定

16.8.2創建新的工程

16.8.3使用IDE和調試器

第17章mbed入門

17.1什麼是mbed

17.2mbed系統是怎么工作的

17.3mbed的優勢

17.4設定FRDMKL25Z板和mbed賬號

17.4.1檢查mbedWeb網頁

17.4.2註冊mbed賬號

17.4.3個人計算機的設定

17.5創建blinky程式

17.5.1隻開關紅色LED的簡單版本

17.5.2利用脈寬調試控制LED

17.6支持的常用外設對象

17.7使用printf

17.8套用實例:火車模型控制器

17.9中斷

17.10要點和提示

第18章編程實例

18.1利用通用異步收發器來產生輸出

18.1.1通用異步收發器通信概述

18.1.2微控制器上的UART配置概述

18.1.3配置FRDMKL25Z中的UART

18.1.4配置STM32L0Discovery板中的UART

18.1.5配置STM32F0Discovery板上的UART

18.1.6配置LPC1114FN28上的UART

18.2實現printf

18.2.1概述

18.2.2KeilMDK的重定向

18.2.3IAREWARM的重定向

18.2.4GNU編譯器套件的重定向

18.2.5IAREWARM的半主機

18.2.6CoIDE的半主機

18.3開發輸入和輸出函式

18.3.1為何要重新開發

18.3.2其他接口

18.3.3有關scanf的其他信息

18.4中斷編程實例

18.4.1中斷處理概述

18.4.2中斷控制函式概述

18.5套用實例:火車模型用的另一個控制器

18.6CMSISCORE的不同版本

第19章超低功耗設計

19.1超低功耗使用示例

19.1.1概述

19.1.2進入休眠模式

19.1.3WFE與WFI

19.1.4利用退出時休眠特性

19.1.5利用掛起傳送事件特性

19.1.6利用喚醒中斷控制器

19.1.7利用事件通信接口

19.2低功耗設計要求

19.3能量去哪裡了

19.4開發低功耗套用

19.4.1低功耗設計概述

19.4.2降低功耗的各種方法

19.4.3選擇正確的方法

19.5調試考慮

19.5.1調試和低功耗

19.5.2調試和Flash編程的“安全模式”

19.5.3低電壓引腳和調試接口

19.6低電壓設備的檢測

19.6.1ULPBench的背景

19.6.2ULPBenchCP概述

19.7FreescaleKL25Z低功耗特性使用示例

19.7.1目標

19.7.2測試設定

19.7.3KL25Z的低功耗模式

19.7.4時鐘設計

19.7.5測試設定

19.7.6測量結果

19.8LPC1114低功耗特性使用示例

19.8.1LPC1114FN28概述

19.8.2實驗1:使用12MHz內部和外部晶振

19.8.3實驗2:使用降頻1MHz和100kHz

19.8.4其他改進

19.8.5利用LPC1114的深度休眠

第20章嵌入式OS編程

20.1介紹

20.1.1背景

20.1.2嵌入式OS和RTOS

20.1.3為什麼要使用嵌入式OS

20.1.4CMSISRTOS的作用

20.1.5關於KeilRTXKernel

20.1.6在KeilMDK中構建一個簡單RTX實例

20.2RTXKernel概述

20.2.1執行緒

20.2.2RTX配置

20.2.3深入研究第一個例子

20.2.4執行緒間通信概述

20.2.5信號事件通信

20.2.6互斥體(Mutex)

20.2.7信號量

20.2.8訊息佇列

20.2.9郵件佇列

20.2.10記憶體池管理特性

20.2.11通用等待函式和逾時數值

20.2.12定時器特性

20.2.13給非特權執行緒增加SVC服務

20.3在套用中使用RTX

20.4調試RTX套用

20.5疑難解答

20.5.1棧大小需求

20.5.2優先權

20.5.3利用OS錯誤報告

20.5.4OS特性配置

20.5.5其他問題

20.6其他要點和提示

20.6.1修改RTX_Config_CM.c

20.6.2執行緒優先權

20.6.3縮短等待時間

20.6.4其他信息

第21章混合語言工程

21.1彙編在工程開發中的套用

21.2彙編編程實踐和AAPCS

21.3彙編函式概述

21.3.1ARM工具鏈

21.3.2GCC工具鏈

21.3.3IAREmbeddedWorkbenchforARM

21.3.4彙編函式結構

21.4內聯彙編

21.4.1ARM工具鏈

21.4.2GNU編譯器組件

21.5嵌入彙編特性(ARM工具鏈)

21.6混合語言工程

21.6.1概述

21.6.2在彙編代碼中調用C函式

21.6.3在C代碼中調用彙編函式

21.7在KeilMDKARM中創建彙編工程

21.7.1一個簡單的工程

21.7.2HelloWorld

21.7.3其他文本輸出函式

21.8用於中斷控制的通用彙編代碼

21.8.1使能和禁止中斷

21.8.2設定和清除中斷掛起狀態

21.8.3設定中斷優先權

21.9彙編語言的其他編程技巧

21.9.1為變數分配數據空間

21.9.2複雜跳轉處理

21.10使用特殊指令

21.10.1CMSISCORE

21.10.2習語識別

第22章軟體移植

22.1概述

22.2從8位/16位微控制器向ARMCortexM移植軟體

22.2.1通用改動

22.2.2存儲器需求

22.2.38位或16位微控制器不再適用的最佳化

22.2.4實例:從8051移植到ARMCortexM0/CortexM0+

22.3ARM7TDMI和CortexM0/M0+處理器間的差異

22.3.1經典ARM處理器概述

22.3.2操作模式

22.3.3暫存器

22.3.4指令集

22.3.5中斷

22.4從ARM7TDMI向CortexM0/CortexM0+處理器移植軟體

22.4.1啟動代碼和向量表

22.4.2中斷

22.4.3C程式代碼

22.4.4彙編代碼

22.4.5原子訪問

22.4.6最佳化

22.5各種CortexM處理器間的差異

22.5.1概述

22.5.2系統模型

22.5.3NVIC和異常

22.5.4指令集

22.5.5系統級特性

22.5.6調試和跟蹤特性

22.6在CortexM處理器間移植時的通用改動

22.7CortexM0/M0+和CortexM1間的軟體移植

22.8CortexM0/M0+和CortexM3間的軟體移植

22.9CortexM0/M0+和CortexM4/M7間的軟體移植

第23章高級話題

23.1C語言實現的位數據處理

23.2C實現的啟動代碼

23.3棧溢出檢測

23.3.1什麼是棧溢出

23.3.2工具鏈的棧分析

23.3.3棧的測試分析

23.3.4利用存儲器保護單元對棧進行限制

23.3.5OS上下文切換期間的棧檢測

23.4中斷服務程式重入

23.5信號量設計

23.6存儲器順序和存儲器屏障

附錄A指令集快速參考

附錄B異常類型快速參考

B.1異常類型

B.2異常壓棧後棧的內容

附錄CCMSISCORE快速參考

C.1數據類型

C.2異常枚舉

C.3嵌套向量中斷控制器訪問函式

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IRQ[0]到NVICIRQ[7])

D.7SCB暫存器一覽

D.8CPUID暫存器(SCBCPUID)

D.9中斷控制狀態暫存器(SCBICSR)

D.10向量表偏移暫存器(SCBVTOR,0xE000ED08)

D.11套用中斷和控制狀態暫存器(SCBAIRCR)

D.12系統控制暫存器(SCBSCR)

D.13配置控制暫存器(SCBCCR)

D.14系統處理優先權暫存器2(SCBSHR[0])

D.15系統處理優先權暫存器3(SCBSHR[1])

D.16系統處理控制和狀態暫存器

D.17SysTick暫存器一覽

D.18SysTick控制和狀態暫存器(SysTickCTRL)

D.19SysTick重裝載值暫存器(SysTickLOAD)

D.20SysTick當前值暫存器(SysTickVAL)

D.21SysTick校準值暫存器(SysTickCALIB)

附錄E調試暫存器快速參考

E.1核心調試暫存器

E.2斷點單元

E.3數據監視點單元

E.4ROM表暫存器

E.5微跟蹤緩衝

E.6POSITION暫存器

E.7MASTER暫存器

E.8FLOW暫存器

E.9BASE暫存器

E.10包格式

E.11實例

附錄F調試接頭分配

F.110針Cortex調試連線頭

F.220針Cortex調試+ETM接頭

F.3老式的20針IDC接頭排列

附錄G疑難解答

G.1程式不運行/啟動

G.1.1向量表丟失或位置錯誤

G.1.2使用了錯誤的C啟動代碼

G.1.3復位向量中的值錯誤

G.1.4程式映像沒有被正確地編程到Flash中

G.1.5錯誤的工具鏈配置

G.1.6錯誤的棧指針初始值

G.1.7錯誤的大小端設定

G.2程式啟動,卻進入了硬體錯誤

G.2.1非法存儲器訪問

G.2.2非對齊數據訪問

G.2.3存儲器訪問許可權(只限於CortexM0+處理器)

G.2.4從匯流排返回錯誤

G.2.5異常處理中的棧被破壞

G.2.6程式在某些C函式中崩潰

G.2.7意外地試圖切換至ARM狀態

G.2.8在錯誤的優先權上執行SVC

G.3休眠問題

G.3.1執行WFE不進入休眠

G.3.2退出時休眠過早地引起休眠

G.3.3中斷已經在掛起態時SEVONPEND不工作

G.3.4由於休眠模式可能禁止了某些時鐘,處理器無法喚醒

G.3.5競態

G.4中斷問題

G.4.1執行了多餘的中斷處理

G.4.2執行了多餘的SysTick處理

G.4.3在中斷處理中禁止中斷

G.4.4錯誤的中斷返回指令

G.4.5異常優先權設定的數值

G.5其他問題

G.5.1錯誤的SVC參數傳遞方法

G.5.2調試連線受到I/O設定或低功耗模式的影響

G.5.3調試協定選擇/配置

G.5.4使用事件輸出作為脈衝I/O

G.5.5向量表和代碼位置的設備實際需求

G.6其他可能的編程陷阱

G.6.1中斷優先權

G.6.2同時使用主棧和進程棧時的棧溢出

G.6.3數據對齊

G.6.4丟失volatile關鍵字

G.6.5函式指針

G.6.6讀修改寫

G.6.7中斷禁止

G.6.8SystemInit函式

G.6.9斷點和內聯

附錄HARMCortexM0微控制器麵包板工程

H.1背景

H.2硬體設計

附錄I參考文檔

相關詞條

熱門詞條

聯絡我們