第 1章 進入32位時代,誰能成為下一個80511
1.1 磨刀不誤砍柴工—CPU基礎知識介紹1
1.1.1 ISA—CPU的靈魂2
1.1.2 CISC與RISC3
1.1.3 32位與64位架構4
1.1.4 ISA眾生相5
1.1.5 CPU的領域之分9
1.1.6 8位時代的傳奇“前輩”—805110
1.1.7 IoT的崛起—32位時代的到來11
1.2 無敵是多麼寂寞—ARM統治著的世界11
1.2.1 獨樂樂與眾樂樂—ARM公司的盈利模式12
1.2.2 小個子有大力量—無處不在的Cortex-M係列14
1.2.3 移動王者—Cortex-A係列在手持設備領域的巨大成功16
1.2.4 進擊的巨人—ARM進軍PC與服務器領域的雄心18
1.2.5 遊戲終結者之ARM19
1.3 東邊日齣西邊雨,道是無晴卻有晴—RISC-V登場19
1.4 RISC-V和其他開放架構有何不同21
1.4.1 “平民英雄”—OpenRISC22
1.4.2 “豪門顯貴”—SPARC22
1.4.3 “名校優生”—RISC-V23
1.5 結語:進入32位時代,誰能成為深嵌入式領域的下一個8051?23
第 2章 開源蜂鳥E203超低功耗RISC-V Core與SoC25
2.1 亂花漸欲迷人眼25
2.2 與眾不同的蜂鳥E203處理器25
2.3 蜂鳥雖小,五髒俱全—蜂鳥E203簡介26
2.4 蜂鳥E203性能指標27
2.5 蜂鳥E203配套SoC28
第3章 大道至簡—RISC-V架構之魂29
3.1 簡單就是美—RISC-V架構的設計哲學29
3.1.1 無病一身輕—架構的篇幅30
3.1.2 能屈能伸—模塊化的指令集31
3.1.3 濃縮的都是精華—指令的數量31
3.2 RISC-V指令集架構簡介32
3.2.1 模塊化的指令子集32
3.2.2 可配置的通用寄存器組33
3.2.3 規整的指令編碼33
3.2.4 簡潔的存儲器訪問指令34
3.2.5 高效的分支跳轉指令35
3.2.6 簡潔的子程序調用36
3.2.7 無條件碼執行36
3.2.8 無分支延遲槽37
3.2.9 零開銷硬件循環37
3.2.10 簡潔的運算指令38
3.2.11 優雅的壓縮指令子集38
3.2.12 特權模式39
3.2.13 CSR寄存器40
3.2.14 中斷和異常40
3.2.15 矢量指令子集40
3.2.16 自定製指令擴展40
3.2.17 總結與比較41
第4章 RISC-V架構的中斷和異常43
4.1 中斷和異常概述43
4.1.1 中斷概述43
4.1.2 異常概述44
4.1.3 廣義上的異常44
4.2 RISC-V架構異常處理機製46
4.2.1 進入異常47
4.2.2 退齣異常50
4.2.3 異常服務程序50
4.3 RISC-V架構中斷定義51
4.3.1 中斷類型51
4.3.2 中斷屏蔽54
4.3.3 中斷等待55
4.3.4 中斷優先級與仲裁55
4.3.5 中斷嵌套56
4.3.6 總結比較57
4.4 RISC-V架構異常相關CSR寄存器57
4.5 蜂鳥E203的中斷和異常實現58
第5章 開源蜂鳥E203 MCU SoC總體介紹59
5.1 Freedom E310 SoC簡介59
5.2 蜂鳥E203 MCU SoC簡介60
5.3 蜂鳥E203 MCU SoC框圖60
5.4 蜂鳥E203 MCU SoC存儲資源61
5.4.1 片上存儲資源61
5.4.2 片外Flash存儲資源61
5.5 蜂鳥E203 MCU SoC外設資源62
5.6 蜂鳥E203 MCU SoC地址分配62
5.7 蜂鳥E203 MCU SoC時鍾域劃分63
5.8 蜂鳥E203 MCU SoC電源域劃分64
5.9 蜂鳥E203 MCU SoC低功耗模式64
5.10 蜂鳥E203 MCU SoC的全局復位65
5.11 蜂鳥E203 MCU SoC的上電流程控製66
5.12 蜂鳥E203 MCU SoC芯片引腳錶67
5.13 蜂鳥E203 MCU SoC的GPIO引腳分配68
5.14 蜂鳥E203 MCU SoC的中斷處理70
5.14.1 蜂鳥E203處理器核的異常和中斷處理70
5.14.2 蜂鳥E203處理器的中斷接口71
5.14.3 CLINT模塊生成計時器中斷和軟件中斷72
5.14.4 PLIC管理多個外部中斷73
第6章 開源蜂鳥E203 MCU SoC外設介紹77
6.1 蜂鳥E203 MCU SoC外設總述77
6.2 PLIC78
6.3 CLINT78
6.4 LCLKGEN78
6.4.1 LCLKGEN簡介78
6.4.2 LCLKGEN寄存器列錶78
6.5 HCLKGEN79
6.5.1 HCLKGEN簡介79
6.5.2 HCLKGEN寄存器列錶79
6.6 GPIO79
6.6.1 GPIO特性79
6.6.2 GPIO寄存器列錶80
6.6.3 I O結構和IOF模式80
6.6.4 SoC各外設復用GPIO引腳83
6.6.5 GPIO中斷83
6.6.6 GPIO_VALUE寄存器84
6.6.7 GPIO_INPUT_EN寄存器84
6.6.8 GPIO_OUTPUT_EN寄存器85
6.6.9 GPIO_PORT寄存器85
6.6.10 GPIO_PUE寄存器85
6.6.11 GPIO_DS寄存器85
6.6.12 GPIO_OUTPUT_XOR寄存器85
6.6.13 GPIO_RISE_IE、GPIO_RISE_IP等寄存器85
6.7 SPI86
6.7.1 SPI背景知識簡介86
6.7.2 SPI特性88
6.7.3 SPI寄存器列錶89
6.7.4 SPI接口數據綫90
6.7.5 通過SPI_SCKDIV寄存器配置SCK時鍾頻率90
6.7.6 通過SPI_SCKMODE寄存器配置SCK的極性與相位90
6.7.7 通過SPI_CSID寄存器配置SPI使能信號92
6.7.8 通過SPI_CSDEF寄存器配置使能信號的空閑值92
6.7.9 通過SPI_CSMODE寄存器配置使能信號的行為92
6.7.10 通過SPI_DELAY0和SPI_DELAY1寄存器配置使能信號的行為93
6.7.11 通過SPI_FCTRL寄存器使能QSPI0的Flash XiP模式94
6.7.12 通過SPI_FFMT寄存器控製QSPI0讀取外部Flash95
6.7.13 通過SPI_FMT寄存器配置傳輸參數97
6.7.14 通過SPI_TXDATA寄存器發送數據97
6.7.15 通過SPI_RXDATA寄存器接收數據98
6.7.16 通過SPI_TXMARK寄存器配置發送中斷閾值100
6.7.17 通過SPI_RXMARK寄存器配置接收中斷閾值100
6.7.18 通過SPI_IE和SPI_IP寄存器控製中斷101
6.8 I2C102
6.8.1 I2C背景知識簡介102
6.8.2 I2C特性103
6.8.3 I2C寄存器列錶103
6.8.4 I2C接口數據綫104
6.8.5 通過I2C_PRERlo和I2C_PRERhi寄存器配置SCL時鍾頻率104
6.8.6 通過I2C_CTR寄存器配置功能和中斷使能104
6.8.7 I2C模塊産生中斷105
6.8.8 通過I2C_TXR和I2C_RXR寄存器發送和接收數據105
6.8.9 通過I2C_CR和I2C_SR寄存器發起命令和查看狀態106
6.8.10 初始化I2C模塊的序列107
6.8.11 通過I2C模塊嚮外部從設備寫數據的常用序列107
6.8.12 通過I2C模塊從外部從設備讀數據的常用序列108
6.9 UART109
6.9.1 UART背景知識簡介109
6.9.2 UART特性110
6.9.3 UART寄存器列錶110
6.9.4 UART接口數據綫111
6.9.5 通過UART_TXDATA寄存器發送數據111
6.9.6 通過UART_RXDATA寄存器接收數據112
6.9.7 通過UART_TXCTRL寄存器進行發送控製113
6.9.8 通過UART_RXCTRL寄存器進行接收控製113
6.9.9 通過UART_IE和UART_IP寄存器控製中斷114
6.9.10 通過UART_DIV寄存器配置波特率115
6.10 PWM116
6.10.1 PWM背景知識簡介116
6.10.2 PWM特性和結構圖116
6.10.3 PWM寄存器列錶117
6.10.4 通過PWMCFG寄存器進行配置118
6.10.5 計數器計數值PWMCOUNT寄存器和PWM周期119
6.10.6 計數器比較值PWMS寄存器120
6.10.7 PWM接口數據綫121
6.10.8 産生左對齊或者右對齊的脈衝信號121
6.10.9 産生居中對齊的脈衝信號122
6.10.10 配置pwmcmpgang結連産生任意形狀的脈衝信號124
6.10.11 配置pwmdeglitch防止輸齣毛刺124
6.10.12 PWM産生中斷124
6.11 WDT125
6.11.1 WDT背景知識簡介125
6.11.2 WDT特性和結構圖125
6.11.3 WDT寄存器列錶126
6.11.4 通過WDOGCFG寄存器進行配置127
6.11.5 計數器計數值WDOGCOUNT寄存器128
6.11.6 通過WDOGKEY寄存器解鎖128
6.11.7 通過WDOGFEED寄存器喂狗129
6.11.8 計數器比較值WDOGS寄存器129
6.11.9 通過WDOGCMP寄存器配置閾值130
6.11.10 WDT産生全局復位130
6.11.11 WDT産生中斷130
6.12 RTC131
6.12.1 RTC背景知識簡介131
6.12.2 RTC特性和結構圖131
6.12.3 RTC寄存器列錶131
6.12.4 通過RTCCFG寄存器進行配置132
6.12.5 計數器計數值RTCHI RTCLO寄存器133
6.12.6 計數器比較值RTCS寄存器133
6.12.7 通過RTCCMP寄存器配置閾值134
6.12.8 RTC産生中斷134
6.13 PMU134
6.13.1 PMU背景知識簡介134
6.13.2 PMU特性和結構圖135
6.13.3 PMU寄存器列錶136
6.13.4 通過PMUKEY寄存器解鎖136
6.13.5 通過PMUSLEEP寄存器進入休眠模式137
6.13.6 通過PMUSLEEPI寄存器配置休眠指令序列137
6.13.7 通過PMUBACKUP寄存器保存關鍵信息139
6.13.8 通過PMUIE寄存器配置喚醒條件139
6.13.9 通過PMUWAKEUPI寄存器配置喚醒指令序列140
6.13.10 通過PMUCAUSE寄存器查看喚醒原因141
第7章 開源蜂鳥E203 MCU開發闆與調試器143
7.1 蜂鳥E203 MCU開發闆143
7.2 蜂鳥E203 JTAG調試器143
第8章 編譯過程簡介145
8.1 GCC工具鏈介紹145
8.1.1 GCC工具鏈概述145
8.1.2 Binutils146
8.1.3 C運行庫147
8.1.4 GCC命令行選項148
8.2 準備工作148
8.2.1 Linux安裝148
8.2.2 準備Hello World程序148
8.3 編譯過程149
8.3.1 預處理149
8.3.2 編譯150
8.3.3 匯編150
8.3.4 鏈接151
8.3.5 一步到位的編譯153
8.4 分析ELF文件153
8.4.1 ELF文件介紹153
8.4.2 ELF文件的段154
8.4.3 查看ELF文件154
8.4.4 反匯編155
8.5 嵌入式係統編譯的特殊性156
8.6 本章小結156
第9章 嵌入式開發特點與RISC-V GCC工具鏈158
9.1 嵌入式係統開發特點158
9.1.1 交叉編譯和遠程調試158
9.1.2 移植newlib或newlib-nano作為C運行庫159
9.1.3 嵌入式引導程序和中斷異常處理160
9.1.4 嵌入式係統鏈接腳本160
9.1.5 減少代碼體積161
9.1.6 支持printf函數161
9.1.7 提供闆級支持包162
9.2 RISC-V GCC工具鏈簡介162
9.2.1 RISC-V GCC工具鏈種類162
9.2.2 riscv-none-embed工具鏈下載163
9.2.3 RISC-V GCC工具鏈的(?Cmarch=)和(?Cmabi=)選項164
9.2.4 RISC-V GCC工具鏈的(?Cmcmodel=)選項168
9.2.5 RISC-V GCC工具鏈的其他選項169
9.2.6 RISC-V GCC工具鏈的預定義宏170
9.2.7 RISC-V GCC工具鏈使用實例170
第 10章 RISC-V匯編語言程序設計171
10.1 匯編語言簡介171
10.2 RISC-V匯編程序概述172
10.3 RISC-V匯編指令173
10.4 RISC-V匯編程序僞操作173
10.5 RISC-V匯編程序示例177
10.5.1 定義標簽177
10.5.2 定義宏178
10.5.3 定義常數178
10.5.4 立即數賦值178
10.5.5 標簽地址賦值179
10.5.6 設置浮點捨入模式179
10.5.7 完整實例180
10.6 在C C 程序中嵌入匯編181
10.6.1 GCC內聯匯編簡述181
10.6.2 GCC內聯匯編“輸齣操作數”和“輸入操作數”部分182
10.6.3 GCC內聯匯編“可能影響的寄存器或存儲器”部分183
10.6.4 GCC內聯匯編參考實例一184
10.6.5 GCC內聯匯編參考實例二185
10.6.6 小結186
10.7 在匯編中調用C C 函數186
10.8 本章小結187
第 11章 基於HBird-E-SDK平颱的軟件開發與運行188
11.1 HBird-E-SDK平颱簡介188
11.2 HBird-E-SDK平颱代碼結構189
11.3 HBird-E-SDK闆級支持包解析190
11.3.1 移植瞭Newlib樁函數190
11.3.2 支持瞭printf函數192
11.3.3 提供係統鏈接腳本193
11.3.4 係統啓動引導程序198
11.3.5 係統異常和中斷處理202
11.3.6 減少代碼體積206
11.4 使用HBird-E-SDK開發和編譯程序208
11.4.1 在HBird-E-SDK環境中安裝工具鏈208
11.4.2 在HBird-E-SDK環境中開發程序210
11.4.3 編譯使得程序從Flash直接運行211
11.4.4 編譯使得程序從ITCM中運行212
11.4.5 編譯使得程序從Flash上載至ITCM中運行213
11.5 使用HBird-E-SDK下載程序213
11.5.1 JTAG調試器與MCU原型開發闆的連接213
11.5.2 設置JTAG調試器在Linux係統中的USB權限214
11.5.3 將程序下載至MCU原型開發闆216
11.6 在MCU原型開發闆上運行程序216
11.6.1 程序從Flash直接運行217
11.6.2 程序從ITCM中運行217
11.6.3 程序從Flash上載至ITCM中運行218
11.7 使用GDB遠程調試程序218
11.7.1 調試器工作原理218
11.7.2 GDB常用操作示例220
11.7.3 使用GDB調試Hello World示例221
第 12章 開源蜂鳥E203 MCU的更多示例程序226
12.1 Dhrystone示例程序226
12.1.1 Dhrystone示例程序功能簡介226
12.1.2 Dhrystone示例程序代碼結構229
12.1.3 運行Dhrystone229
12.2 CoreMark示例程序231
12.2.1 CoreMark示例程序功能簡介231
12.2.2 CoreMark示例程序代碼結構232
12.2.3 運行CoreMark233
12.3 Demo_IASM示例程序234
12.3.1 Demo_IASM示例程序功能簡介234
12.3.2 Demo_IASM示例程序代碼結構234
12.3.3 Demo_IASM示例程序源碼解析235
12.3.4 運行Demo_IASM235
12.4 Demo_GPIO示例程序236
12.4.1 Demo_GPIO示例程序功能簡介236
12.4.2 Demo_GPIO示例程序代碼結構237
12.4.3 Demo_GPIO示例程序源碼分析237
12.4.4 運行Demo_GPIO243
12.5 中斷嵌套244
第 13章 Windows IDE集成開發調試環境245
13.1 MCU Eclipse IDE簡介與安裝245
13.1.1 MCU Eclipse IDE簡介245
13.1.2 RISC-V MCU Eclipse下載246
13.1.3 RISC-V MCU Eclipse安裝247
13.2 啓動Eclipse248
13.3 創建Hello World項目249
13.4 配置Hello World項目253
13.4.1 配置工具鏈路徑253
13.4.2 配置項目的編譯和鏈接選項256
13.4.3 配置項目的BSP262
13.4.4 配置項目的包含路徑和文件265
13.5 編譯Hello World項目267
13.6 運行Hello World項目269
13.6.1 安裝JTAG調試器在Windows係統中的USB驅動269
13.6.2 通過Eclipse下載程序至MCU開發闆270
13.6.3 在MCU開發闆上運行程序274
13.7 調試Hello World項目276
13.8 拓展一:基於MCU Eclipse運行調試demo_gpio示例280
13.9 拓展二:基於MCU Eclipse運行調試dhrystone示例281
第 14章 開源蜂鳥E203 MCU開發闆移植RTOS283
14.1 RTOS簡述283
14.2 常用實時操作係統概述284
14.3 FreeRTOS簡介285
14.4 蜂鳥E203 MCU移植RTOS286
附錄A RISC-V架構指令集介紹287
A.1 RV32GC架構概述287
A.2 RV32E架構概述288
A.3 蜂鳥E203支持的指令列錶288
A.4 寄存器組288
A.4.1 通用寄存器組289
A.4.2 CSR寄存器290
A.5 指令PC290
A.6 尋址空間劃分290
A.7 大端格式或小端格式290
A.8 工作模式290
A.9 Hart概念291
A.10 復位狀態291
A.11 中斷和異常292
A.12 存儲器地址管理292
A.13 存儲器模型292
A.14 指令類型293
A.14.1 RV32IMAFDC指令列錶293
A.14.2 基本整數指令(RV32I)293
A.14.3 整數乘法和除法指令(RV32M指令子集)302
A.14.4 浮點指令(RV32F,RV32D指令子集)304
A.14.5 存儲器原子操作指令(RV32A指令子集)315
A.14.6 16位壓縮指令(RV32C指令子集)318
A.15 僞指令320
A.16 指令編碼320
附錄B RISC-V架構CSR寄存器介紹321
B.1 蜂鳥E203支持的CSR寄存器列錶321
B.2 RISC-V標準CSR322
B.2.1 misa322
B.2.2 mvendorid323
B.2.3 marchid323
B.2.4 mimpid323
B.2.5 mhartid324
B.2.6 fflags324
B.2.7 frm324
B.2.8 fcsr324
B.2.9 mstatus324
B.2.10 mtvec326
B.2.11 mepc326
B.2.12 mcause327
B.2.13 mtval (mbadaddr)327
B.2.14 mie328
B.2.15 mip328
B.2.16 mscratch328
B.2.17 mcycle和mcycleh329
B.2.18 minstret和minstreth329
B.2.19 mtime、mtimecmp和msip329
B.3 蜂鳥E203自定義CSR330mcounterstop330
附錄C RISC-V架構的PLIC介紹331
C.1 概述331
C.2 PLIC中斷目標332PLIC中斷目標之閾值333
C.3 PLIC中斷源333
C.3.1 PLIC中斷源之閘口(Gateway)和IP334
C.3.2 PLIC中斷源之編號(ID)334
C.3.3 PLIC中斷源之優先級(Priority)334
C.3.4 PLIC中斷源之中斷使能(Enable)334
C.4 PLIC中斷處理機製335
C.4.1 PLIC中斷通知機製(Notification)335
C.4.2 PLIC中斷響應機製(Claim)335
C.4.3 PLIC中斷完成機製(Completion)336
C.4.4 PLIC中斷完整流程336
C.5 PLIC寄存器總結337
C.6 總結與比較339
附錄D 存儲器模型背景介紹340
D.1 為何要有存儲器模型的概念340
D.2 存儲器模型定義瞭什麼341
D.2.1 按序一緻性模型341
D.2.2 鬆散一緻性模型342
D.2.3 釋放一緻性模型342
D.2.4 存儲器模型總結342
D.3 存儲器模型應用實例343
D.4 RISC-V架構的存儲器模型344
附錄E 存儲器原子操作指令背景介紹345
E.1 什麼是“上鎖”問題345
E.2 通過原子操作解決“上鎖”問題346
E.3 通過互斥操作解決“上鎖”問題346
E.4 RISC-V架構的相關指令348
附錄F RISC-V指令編碼列錶349
F.1 RV32I指令編碼349
F.2 RV32M指令編碼350
F.3 RV32A指令編碼350
F.4 RV32F指令編碼350
F.5 RV32D指令編碼351
F.6 RVC指令編碼351
附錄G RISC-V僞指令列錶353
· · · · · · (
收起)