手把手教你 RISC-V CPU (下) : 工程與實踐
內容描述
本書通過開源蜂鳥E203處理器系統地介紹了RISC-V處理器的嵌入式軟件開發方法。全書共3個部分18章,不但給出嵌入式軟件開發的全流程,而且介紹了蜂鳥E203處理器的具體使用方法,通過提供大量的實戰項目,幫助讀者做到理論與實踐相結合。
本書主要面向嵌入式軟件開發工程師,以及對RISC-V感興趣的初學者和技術愛好者。
目錄大綱
第 1章 開源蜂鳥E203 MCU總體介紹 1
1.1 蜂鳥E203 MCU的系統結構和特性 1
1.2 蜂鳥E203 MCU的存儲資源 2
1.2.1 片上存儲資源 2
1.2.2 片外Flash存儲資源 2
1.3 蜂鳥E203 MCU的外設資源 3
1.4 蜂鳥E203 MCU的地址分配 3
1.5 蜂鳥E203 MCU的時鐘域劃分 4
1.6 蜂鳥E203 MCU的電源域劃分 5
1.7 蜂鳥E203 MCU的低功耗模式 5
1.8 蜂鳥E203 MCU的全局復位 6
1.9 蜂鳥E203 MCU的上電流程控制 7
1.10 蜂鳥E203 MCU的頂層引腳 7
1.11 蜂鳥E203 MCU的GPIO復用功能 8
1.12 蜂鳥E203 MCU的中斷處理 9
1.12.1 蜂鳥E203處理器核的異常和中斷處理 9
1.12.2 蜂鳥E203處理器核的中斷接口 11
1.12.3 CLINT模塊生成計時器中斷和軟件中斷 12
1.12.4 PLIC管理多個外部中斷 13
第 2章 開源蜂鳥E203 MCU的外設 17
2.1 蜂鳥E203 MCU的外設概述 17
2.2 PLIC 17
2.3 CLINT 18
2.4 LCLKGEN 18
2.4.1 LCLKGEN簡介 18
2.4.2 LCLKGEN的寄存器 18
2.5 HCLKGEN 18
2.5.1 HCLKGEN簡介 18
2.5.2 HCLKGEN的寄存器 19
2.6 GPIO 19
2.6.1 GPIO的功能 19
2.6.2 GPIO的寄存器 19
2.6.3 I/O結構和IOF模式 20
2.6.4 MCU各外設復用GPIO引腳 20
2.6.5 GPIO中斷 21
2.6.6 GPIO_PADDIR寄存器 21
2.6.7 GPIO_PADIN寄存器 21
2.6.8 GPIO_PADOUT寄存器 21
2.6.9 GPIO_INTTEN寄存器 22
2.6.10 GPIO_INTTYPE0和GPIO_INTTYPE1寄存器 22
2.6.11 GPIO_INTSTATUS寄存器 22
2.6.12 GPIO_IOFCFG寄存器 22
2.7 SPI 22
2.7.1 SPI的背景知識 22
2.7.2 SPI的特性 25
2.7.3 SPI的寄存器 25
2.7.4 SPI數據線 26
2.7.5 QSPI0的寄存器配置 26
2.7.6 QSPI1和QSPI2的寄存器配置 38
2.8 I2C 41
2.8.1 I2C的背景知識 41
2.8.2 I2C的功能 42
2.8.3 I2C的寄存器 43
2.8.4 I2C的接口數據線 43
2.8.5 I2C_PRE寄存器 43
2.8.6 I2C_CTR寄存器 44
2.8.7 I2C_TX寄存器和I2C_RX寄存器 44
2.8.8 I2C_CMD寄存器 45
2.8.9 I2C_STATUS寄存器 45
2.8.10 I2C的常用操作序列 46
2.9 UART 48
2.9.1 UART的背景知識 48
2.9.2 UART的特性和功能 49
2.9.3 UART的寄存器 49
2.9.4 UART的接口數據線 50
2.9.5 UART_DLL寄存器和UART_DLM寄存器 50
2.9.6 UART_RBR寄存器 51
2.9.7 UART_THR寄存器 51
2.9.8 UART_FCR寄存器 52
2.9.9 UART_LCR寄存器 52
2.9.10 UART_LSR寄存器 53
2.9.11 UART_IER寄存器 53
2.9.12 UART_IIR寄存器 54
2.10 PWM 54
2.10.1 PWM的背景知識 54
2.10.2 PWM的功能和特性 54
2.10.3 PWM的寄存器 55
2.10.4 PWM模塊的輸出信號 55
2.10.5 TIMx_CMD(x=0,1,2,3)寄存器 55
2.10.6 TIMx_CFG(x=0,1,2,3)寄存器 56
2.10.7 TIMx_TH(x=0,1,2,3)寄存器 57
2.10.8 TIMx_CH0_TH(x=0,1,2,3)寄存器 57
2.10.9 TIMx_CH1_TH(x=0,1,2,3)寄存器 58
2.10.10 TIMx_CH2_TH(x=0,1,2,3)寄存器 58
2.10.11 TIMx_CH3_TH(x=0,1,2,3)寄存器 59
2.10.12 TIMx_CNT(x=0,1,2,3)寄存器 60
2.10.13 PWM_ENT_CFG寄存器 60
2.10.14 PWM_TIMER_EN寄存器 61
2.11 WDT 62
2.11.1 WDT的背景知識 62
2.11.2 WDT的特性、功能和結構 62
2.11.3 WDT的寄存器 63
2.11.4 通過WDOGCFG寄存器對WDT進行配置 63
2.11.5 WDT的計數器計數值寄存器—WDOGCOUNT 64
2.11.6 通過WDOGKEY寄存器解鎖 65
2.11.7 通過WDOGFEED寄存器“餵狗” 65
2.11.8 WDT的計數器比較值寄存器—WDOGS 66
2.11.9 通過WDOGCMP寄存器配置閾值 66
2.11.10 WDT產生全局復位 66
2.11.11 WDT產生中斷 67
2.12 RTC 67
2.12.1 RTC的背景知識 67
2.12.2 RTC的特性、功能和結構 67
2.12.3 RTC的寄存器 68
2.12.4 通過RTCCFG寄存器進行配置 68
2.12.5 RTC的計數器計數值寄存器—RTCHI/RTCLO 69
2.12.6 RTC的計數器比較值寄存器—RTCS 70
2.12.7 通過RTCCMP寄存器配置閾值 70
2.12.8 RTC產生中斷 70
2.13 PMU 70
2.13.1 PMU的背景知識 70
2.13.2 PMU的特性、功能和結構 71
2.13.3 PMU的寄存器 72
2.13.4 通過PMUKEY寄存器解鎖 72
2.13.5 通過PMUSLEEP寄存器進入休眠模式 73
2.13.6 通過PMUSLEEPI0~PMUSLEEPI7寄存器配置休眠指令序列 73
2.13.7 通過PMUBACKUP系列寄存器保存關鍵信息 75
2.13.8 通過PMUIE寄存器設置喚醒條件 75
2.13.9 通過PMUWAKEUPI0~PMUWAKEUPI7寄存器配置喚醒指令序列 76
2.13.10 通過PMUCAUSE寄存器查看喚醒原因 77
第3章 開源蜂鳥E203 MCU硬件開發平台 78
3.1 Nuclei FPGA開發板 78
3.1.1 Nuclei DDR200T開發板簡介 79
3.1.2 Nuclei DDR200T開發板的硬件功能模塊 80
3.1.3 蜂鳥E203 MCU的功能引腳分配 88
3.2 蜂鳥JTAG調試器 89
3.3 總結 90
第4章 軟件編譯過程 91
4.1 GCC工具鏈 91
4.1.1 GCC工具鏈簡介 91
4.1.2 binutils 92
4.1.3 C運行庫 93
4.1.4 GCC命令行選項 94
4.2 準備工作 94
4.2.1 安裝Linux 94
4.2.2 準備HelloWorld程序 94
4.3 編譯過程 95
4.3.1 預處理 95
4.3.2 編譯 96
4.3.3 彙編 96
4.3.4 鏈接 97
4.3.5 一步到位的編譯 99
4.4 ELF文件 99
4.4.1 ELF文件的種類 99
4.4.2 ELF文件的段 100
4.4.3 查看ELF文件 100
4.4.4 反彙編 101
4.5 嵌入式系統編譯的特殊性 102
4.6 總結 103
第5章 嵌入式開發的特點與RISC-V GCC工具鏈 104
5.1 嵌入式系統開發的特點 104
5.1.1 交叉編譯和遠程調試 104
5.1.2 移植newlib或newlib-nano作為C運行庫 105
5.1.3 引導程序以及中斷和異常處理 106
5.1.4 嵌入式系統的鏈接腳本 106
5.1.5 減小代碼規模 106
5.1.6 支持printf()函數 107
5.1.7 提供板級支持包 107
5.2 RISC-V GNU工具鏈 108
5.2.1 RISC-V GNU工具鏈的獲取 108
5.2.2 RISC-V GCC工具鏈的“-march”和“-mabi”選項 109
5.2.3 RISC-V GCC工具鏈的“-mcmodel”選項 113
5.2.4 RISC-V GCC工具鏈的預定義的宏 114
5.2.5 RISC-V GNU工具鏈的使用實例 115
第6章 RISC-V彙編語言程序設計 116
6.1 彙編語言概述 116
6.2 RISC-V彙編程序概述 117
6.3 RISC-V彙編偽指令 118
6.4 RISC-V彙編程序偽操作 118
6.5 RISC-V彙編程序示例 122
6.5.1 標籤 122
6.5.2 宏 122
6.5.3 定義常數及其別名 122
6.5.4 立即數賦值 123
6.5.5 標籤地址賦值 123
6.5.6 設置浮點數舍入模式 124
6.5.7 完整實例 124
6.6 在C/C++程序中嵌入彙編程序 125
6.6.1 GCC內聯彙編簡介 126
6.6.2 GCC內聯彙編的“輸出操作數”和“輸入操作數”部分 127
6.6.3 GCC內聯彙編的“可能影響的寄存器或存儲器”部分 128
6.6.4 GCC內聯彙編實例1 128
6.6.5 GCC內聯彙編實例2 129
6.6.6 小結 130
6.7 在彙編程序中調用C/C++語言中的函數 130
6.8 總結 131
第7章 開源蜂鳥E203 MCU的軟件開發平台 132
7.1 HBird SDK概述 132
7.2 HBird SDK的目錄結構 133
7.3 HBird SDK的底層實現解析 134
7.3.1 移植了newlib的樁函數 134
7.3.2 支持了printf()函數 135
7.3.3 提供系統鏈接腳本 136
7.3.4 系統啟動引導程序 140
7.3.5 系統中斷和異常處理 145
7.3.6 使用newlib-nano減小代碼規模 149
7.4 HBird SDK的使用 150
7.4.1 HBird SDK的環境配置與工具鏈安裝 150
7.4.2 HBird SDK的運行 154
第8章 集成開發環境——Nuclei Studio 158
8.1 Nuclei Studio的簡介、下載與啟動 158
8.1.1 Nuclei Studio簡介 158
8.1.2 Nuclei Studio的下載與啟動 158
8.2 使用Nuclei Studio進行蜂鳥E203MCU的開發 160
第9章 初試蜂鳥E203 MCU開發 168
9.1 蜂鳥E203 MCU在Nuclei DDR200T開發板中的實現 168
9.2 蜂鳥調試器的驅動程序的安裝和蜂鳥調試器的設置 175
9.3 基於HBird SDK運行HelloWorld程序 177
9.3.1 將程序下載到DDR200T開發板 177
9.3.2 將程序在DDR200T開發板上運行 178
9.3.3 將程序在DDR200T開發板上調試 180
9.4 基於Nuclei Studio運行HelloWorld程序 183
9.4.1 將程序下載到DDR200T開發板 183
9.4.2 將程序在DDR200T開發板上運行 186
9.4.3 將程序在DDR200T開發板上調試 187
第 10章 Benchmark實驗 190
10.1 實驗目的 190
10.2 實驗準備 190
10.3 實驗原理 190
10.3.1 Dhrystone簡介 191
10.3.2 Dhrystone示例程序 193
10.3.3 CoreMark簡介 194
10.3.4 CoreMark示例程序 195
10.4 實驗步驟 196
10.4.1 在HBird SDK中運行Dhrystone示例程序 196
10.4.2 在Nuclei Studio中運行Dhrystone示例程序 198
10.4.3 在HBird SDK中運行CoreMark示例程序 200
10.4.4 在Nuclei Studio中運行CoreMark示例程序 202
第 11章 內聯彙編實驗 205
11.1 實驗目的 205
11.2 實驗準備 205
11.3 實驗原理 205
11.3.1 在C/C++程序中嵌入彙編程序 205
11.3.2 內聯彙編示例程序 206
11.4 實驗步驟 206
11.4.1 在HBird SDK中運行內聯彙編示例程序 206
11.4.2 在Nuclei Studio中運行內聯彙編示例程序 208
第 12章 GPIO實驗 213
12.1 實驗目的 213
12.2 實驗準備 213
12.3 實驗原理 213
12.3.1 GPIO簡介 213
12.3.2 GPIO示例程序 214
12.4 實驗步驟 215
12.4.1 在HBird SDK中運行GPIO示例程序 215
12.4.2 在Nuclei Studio中運行GPIO示例程序 216
第 13章 PWM實驗 220
13.1 實驗目的 220
13.2 實驗準備 220
13.3 實驗原理 220
13.3.1 PWM簡介 220
13.3.2 PWM示例程序 221
13.4 實驗步驟 222
13.4.1 在HBird SDK中運行PWM示例程序 222
13.4.2 在Nuclei Studio中運行PWM示例程序 224
第 14章 SPI實驗 227
14.1 實驗目的 227
14.2 實驗準備 227
14.3 實驗原理 227
14.3.1 SPI簡介 227
14.3.2 SPI示例程序 228
14.4 實驗步驟 229
14.4.1 在HBird SDK中運行SPI示例程序 229
14.4.2 在Nuclei Studio中運行SPI示例程序 231
第 15章 I2C實驗 235
15.1 實驗目的 235
15.2 實驗準備 235
15.3 實驗原理 235
15.3.1 I2C簡介 235
15.3.2 I2C示例程序 236
15.4 實驗步驟 237
15.4.1 在HBird SDK中運行I2C示例程序 237
15.4.2 在Nuclei Studio中運行I2C示例程序 238
第 16章 中斷相關實驗 243
16.1 實驗目的 243
16.2 實驗準備 243
16.3 實驗原理 243
16.3.1 計時器中斷和軟件中斷 243
16.3.2 計時器中斷和軟件中斷示例程序 244
16.3.3 外部中斷 244
16.3.4 外部中斷示例程序 245
16.4 實驗步驟 246
16.4.1 在HBird SDK中運行計時器中斷與軟件中斷示例程序 246
16.4.2 在Nuclei Studio中運行計時器中斷與軟件中斷示例程序 247
16.4.3 在HBird SDK中運行外部中斷示例程序 249
16.4.4 在Nuclei Studio中運行外部中斷示例程序 251
第 17章 FreeRTOS的移植與示例程序運行 253
17.1 RTOS概述 253
17.1.1 RTOS的定義 253
17.1.2 基於RTOS的開發與裸機開發 254
17.2 常用的實時操作系統 254
17.3 FreeRTOS概述 255
17.4 FreeRTOS在蜂鳥E203 MCU中的移植 257
17.5 FreeRTOS示例程序的運行 261
17.5.1 FreeRTOS示例程序 261
17.5.2 在HBird SDK中運行FreeRTOS示例程序 261
17.5.3 在Nuclei Studio中運行FreeRTOS示例程序 262
第 18章 獲取更多資源 265
18.1 開源蜂鳥E203 MCU文檔資源 265
18.2 開源蜂鳥E203 MCU嵌入式開發實驗 265
18.3 開源蜂鳥E203處理器教學資源 266
18.4 開源蜂鳥E203論壇 266
作者介紹
胡振波,擁有上海交通大學電子工程系學士學位和微電子學碩士學位。國內RISC-V社區活躍的貢獻者,具有超過10處理器研發經驗,在Marvell和Synopsys等企業負責過多款高性能和低能耗處理器研發工作。 2018年,創辦了RISC-V處理器IP和芯片解決方案公司-----芯來科技。