SiFive 经典RISC-V FE310微控制器原理与实践
定 价:128 元
丛书名:RISC-V芯片系列
- 作者:陈宏铭
- 出版时间:2020/12/1
- ISBN:9787121402036
- 出 版 社:电子工业出版社
- 中图法分类:TP368.1
- 页码:336
- 纸张:
- 版次:01
- 开本:16开
本书以让读者快速掌握FE310嵌入式微控制器为目的,由浅入深地带领读者进入RISC-Ⅴ的世界。本书共分为7章,系统地介绍了SiFive E系列32位RISC-Ⅴ微控制器的体系结构、SiFive E31内核、片内存储系统、系统控制模块、外围设备接口的特点与性能;还介绍了SiFive Freedom Studio集成开发环境,Freedom E-SDK驱动库开发及SiFive Learn Inventor开发系统,开发系统连接外部红外与超声波模块的拓展应用开发实例,有初步C语言基础的读者可轻松上手;还利用最后两章辅以大量的例程,讲解了FreeRTOS与RT-Thread等实时多任务操作系统的原理与应用。本书以最常见的UART接口驱动结构进行分析、移植及代码解说,对于想要初步学习RTOS系统原理的人来说是一个不错的选择。附录C给出了自制竞赛用智能车实例,达到软件开发结合硬件系统设计的效果。 本书内容丰富实用、层次清晰、叙述详尽,书中穿插的实例程序全部使用C语言编写,且在Freedom Studio集成开发环境上编译通过,方便读者教学与自学,非常适合RISC-Ⅴ嵌入式微控制器的初学者;还可以作为高等院校计算机科学与技术、电子信息工程、通信工程、自动控制、电气自动化、嵌入式、物联网等相关专业本科生或研究生,进行RISC-Ⅴ微控制器系统与RTOS教学的嵌入式相关课程辅助教材;本书着重培养学生实践应用能力,因此还可以作为全国大学生电子设计竞赛RISC-Ⅴ子赛题的培训教材,尤其适合参加智能车竞赛的同学参考;同时,还可以作为具有一定C语言知识和硬件基础的嵌入式系统开发工程师和研究人员进行RISC-Ⅴ微控制器系统开发与应用的参考书。
陈宏铭博士拥有超过二十年的半导体相关行业经验,目前担任上海赛昉科技的技术市场资深总监。特别专注于物联网、人工智能、超算与RISC-V处理器等领域的技术趋势,负责协助中国大陆与港澳台的客户。在加入上海赛昉科技之前,陈博士曾担任创意电子的华东区业务总监以及智原科技的技术与市场总监,负责评估客户设计与市场规划。更早前还担任过明导国际亚太区产品专家,益华电脑应用工程师与联阳半导体数字设计工程师。陈博士于台湾清华大学获得了电机工学学士与微电子专业工学硕士学位,在北京大学获得了微电子专业理学博士学位。同时也担任武汉大学电子信息学院兼职教授,江南大学物联网工程学院企业讲师,教授本科生有关芯片设计、制造、封测与RISC-V处理器相关的入门知识。
第1章 RISC-Ⅴ的历史和机遇 001
1.1 RISC-Ⅴ发明团队与历史 001
1.1.1 商业公司的指令集架构 004
1.1.2 RISC-Ⅴ指令集架构与其他指令集架构的不同点 006
1.1.3 RISC-Ⅴ发展史及其标志性事件 007
1.2 RISC-Ⅴ基金会成长的历史 008
1.2.1 RISC-Ⅴ基金会的成员介绍 009
1.2.2 RISC-Ⅴ基金会推动20个重点领域的技术 011
1.2.3 RISC-Ⅴ基金会标准制定过程及工作群组机制 012
1.2.4 RISC-Ⅴ国际协会的诞生 013
1.3 RISC-Ⅴ的生态系统 013
1.3.1 RISC-Ⅴ的开发板和生态系统 014
1.3.2 部分RISC-Ⅴ社区生态的支持厂商 018
1.3.3 芯片设计界的RISC-Ⅴ产品进展 021
1.4 SiFive研发团队技术沿革 023
1.4.1 Rocket Chip SoC生成器 024
1.4.2 使用Chisel语言编写Rocket Chip SoC生成器 025
1.4.3 Rocket标量处理器 026
1.4.4 SiFive强力推动RISC-Ⅴ生态发展 028
第2章 RISC-Ⅴ指令集架构介绍 031
2.1 引言 031
2.2 RISC-Ⅴ指令集架构特性 031
2.2.1 简洁性 032
2.2.2 模块化 032
2.3 指令长度编码和指令格式 034
2.3.1 指令长度编码 034
2.3.2 指令格式 035
2.4 寄存器列表 036
2.4.1 通用寄存器 036
2.4.2 控制与状态寄存器 037
2.4.3 程序计数器 038
2.5 地址空间与寻址模式 038
2.5.1 地址空间 038
2.5.2 小端格式 039
2.5.3 寻址模式 039
2.6 内存模型 039
2.7 特权模式 040
2.8 中断和异常 041
2.8.1 中断和异常概述 041
2.8.2 RISC-Ⅴ机器模式下的中断架构 041
2.8.3 机器模式下中断和异常的处理过程 042
2.9 调试规范 043
2.10 RISC-Ⅴ未来的扩展子集 044
2.10.1 B标准扩展:位操作 044
2.10.2 H特权架构扩展:支持管理程序(Hypervisor) 044
2.10.3 J标准扩展:动态翻译语言 044
2.10.4 L标准扩展:十进制浮点 045
2.10.5 N标准扩展:用户态中断 045
2.10.6 P标准扩展:封装的单指令多数据(Packed-SIMD)指令 045
2.10.7 Q标准扩展:四精度浮点 045
2.10.8 V标准扩展:基本矢量扩展 045
2.11 RISC-Ⅴ指令列表 045
2.11.1 I指令子集 046
2.11.2 M指令子集 051
2.11.3 A指令子集 052
2.11.4 F指令子集 054
2.11.5 D指令子集 055
2.11.6 C指令子集 056
第3章 SiFive FE310-G003微控制器 059
3.1 FE310-G003微控制器概述 060
3.1.1 E31 RISC-Ⅴ内核 061
3.1.2 中断 061
3.1.3 片内存储系统 061
3.1.4 始终上电(AON)模块 062
3.1.5 通用输入与输出 062
3.1.6 通用异步接收器/发送器 062
3.1.7 硬件串行外设接口 062
3.1.8 脉冲宽度调制 062
3.1.9 I2C 062
3.1.10 调试支持 063
3.2 E31内核介绍 063
3.2.1 E31内核概述 063
3.2.2 中断架构 068
3.2.3 内核本地中断器(CLINT) 073
3.2.4 调试支持 074
3.3 E31 FE310-G003内存映射 079
3.4 启动程序 081
3.4.1 复位向量 081
3.4.2 BootLoader 082
3.5 时钟生成 083
3.5.1 时钟生成概述 083
3.5.2 PRCI地址空间的使用 084
3.5.3 可校准可编程72MHz振荡器(HFROSC) 085
3.5.4 外接16MHz晶体振荡器(HFXOSC) 086
3.5.5 内置高频PLL(HFPLL) 086
3.5.6 PLL输出分频器 088
3.5.7 内置可编程低频环形振荡器(LFROSC) 089
3.5.8 备用低频时钟(LFALTCLK) 089
3.5.9 时钟总结 090
3.6 电源模式 090
3.6.1 运行模式 090
3.6.2 等待模式 090
3.6.3 睡眠模式 091
3.7 平台级中断控制器(PLIC) 091
3.7.1 内存映射 091
3.7.2 中断源 092
3.7.3 中断优先级 093
3.7.4 中断未决位 093
3.7.5 中断使能 094
3.7.6 优先级阈值 095
3.7.7 中断声明流程 095
3.7.8 中断完成 096
3.8 一次性可编程存储器(OTP)外设 096
3.8.1 内存映射 096
3.8.2 可编程I/O锁定寄存器(otp_lock) 097
3.8.3 可编程I/O序列 097
3.8.4 读序列控制寄存器(otp_rsctrl) 097
3.8.5 OTP编程警告 098
3.8.6 OTP编程过程 098
3.9 始终上电(AON)电源域 099
3.9.1 AON电源 100
3.9.2 AON时钟 100
3.9.3 AON复位单元 100
3.9.4 上电复位电路 100
3.9.5 外部复位电路 100
3.9.6 复位原因 101
3.9.7 看门狗定时器(WDT) 101
3.9.8 实时时钟(RTC) 101
3.9.9 备份寄存器 101
3.9.10 电源管理单元(PMU) 101
3.9.11 AON内存映射 101
3.10 看门狗定时器(WDT) 103
3.10.1 看门狗计数器(wdogcount) 104
3.10.2 看门狗时钟选择 104
3.10.3 看门狗配置寄存器(wdogcfg) 104
3.10.4 看门狗比较器0(wdogcmp0) 105
3.10.5 看门狗键值寄存器(wdogkey) 105
3.10.6 喂狗寄存器(wdogfeed) 105
3.10.7 看门狗配置 106
3.10.8 看门狗复位 106
3.10.9 看门狗中断(wdogip0) 106
3.11 电源管理单元(PMU) 106
3.11.1 PMU概述 106
3.11.2 内存映射 107
3.11.3 PMU键值寄存器(pmukey) 108
3.11.4 PMU编程 108
3.11.5 初始化睡眠序列寄存器(pmusleep) 109
3.11.6 唤醒信号调理 109
3.11.7 PMU中断使能寄存器(pmuie)和唤醒原因寄存器(pmucause) 110
3.12 实时时钟(RTC) 111
3.12.1 RTC计数器(rtccounthi/rtccountlo) 111
3.12.2 RTC配置寄存器(rtccfg) 112
3.12.3 RTC比较器(rtccmp) 112
3.13 通用输入输出控制器(GPIO) 112
3.13.1 FE310-G003微控制器中的GPIO实例 114
3.13.2 内存映射 114
3.13.3 输入/输出值 114
3.13.4 中断 115
3.13.5 内部上拉 115
3.13.6 驱动强度 115
3.13.7 输出反转 115
3.13.8 硬件I/O功能(IOF) 115
3.14 通用异步收发机(UART) 116
3.14.1 UART概述 117
3.14.2 FE310-G003微控制器中的UART实例 117
3.14.3 内存映射 117
3.14.4 发送数据寄存器(txdata) 118
3.14.5 接收数据寄存器(rxdata) 118
3.14.6 发送控制寄存器(txctrl) 118
3.14.7 接收控制寄存器(rxctrl) 119
3.14.8 中断寄存器(ip和ie) 120
3.14.9 波特率除数寄存器(div) 120
3.15 串行外围接口(SPI) 121
3.15.1 SPI概述 122
3.15.2 FE310-G003微控制器中的SPI实例 122
3.15.3 SPI内存映射 123
3.15.4 串行时钟除数寄存器(sckdiv) 124
3.15.5 串行时钟模式寄存器(sckmode) 124
3.15.6 芯片选择ID寄存器(csid) 125
3.15.7 芯片选择默认寄存器(csdef) 125
3.15.8 芯片选择模式寄存器(csmode) 125
3.15.9 延迟控制寄存器(delay0和delay1) 126
3.15.10 帧格式寄存器(fmt) 127
3.15.11 发送数据寄存器(txdata) 128
3.15.12 接收数据寄存器(rxdata) 128
3.15.13 发送水印寄存器(txmark) 129
3.15.14 接收水印寄存器(rxmark) 129
3.15.15 SPI中断寄存器(ie和ip) 129
3.15.16 SPI闪存接口控制寄存器(fctrl) 130
3.15.17 SPI闪存指令格式寄存器(ffmt) 131
3.16 脉宽调制器(PWM) 131
3.16.1 PWM概述 131
3.16.2 FE310-G003微控制器中的PWM实例 132
3.16.3 PWM内存映射 132
3.16.4 PWM计数器(pwmcount) 133
3.16.5 PWM配置寄存器(pwmcfg) 133
3.16.6 刻度化PWM计数器(pwms) 135
3.16.7 PWM比较器(pwmcmp0~pwmcmp3) 135
3.16.8 去毛刺和黏性电路 136
3.16.9 产生左向或右向的PWM波形 137
3.16.10 产生中心对齐(相位校正)PWM波形 137
3.16.11 使用组合生成任意的PWM波形 138
3.16.12 生成单次波形 138
3.16.13 PWM中断 139
3.17 集成电路(I2C)主设备接口 139
3.18 调试接口 139
3.18.1 JTAG TAPC状态机 139
3.18.2 复位JTAG逻辑 139
3.18.3 JTAG计时器 140
3.18.4 JTAG标准说明 140
3.18.5 JTAG调试命令 140
第4章 使用Freedom E-SDK进行软件开发 141
4.1 SiFive Freedom Studio集成开发环境安装与介绍 141
4.1.1 Freedom Studio简介与安装 141
4.1.2 启动Freedom Studio 144
4.1.3 创建sifive-welcome项目 145
4.1.4 配置sifive-welcome项目 146
4.1.5 编译sifive-welcome项目 148
4.1.6 运行sifive-welcome项目 149
4.1.7 调试程序 154
4.2 Hello World实例 156
4.2.1 新建Freedom工程 156
4.2.2 编译生成可执行文件 157
4.2.3 连接SiFive Learn Inventor开发系统 158
4.2.4 修改J-LINK配置 158
4.2.5 程序下载及调试 158
4.2.6 使用Freedom Studio在线调试程序 160
4.3 Dhrystone基准程序介绍 160
4.3.1 Dhrystone基准程序功能介绍 161
4.3.2 Dhrystone基准程序代码结构 163
4.3.3 Dhrystone基准程序存在的问题 164
4.3.4 在SiFive Learn Inventor开发系统上运行Dhrystone基准程序 164
4.4 CoreMark基准程序介绍 166
4.4.1 CoreMark基准程序功能介绍 166
4.4.2 CoreMark基准程序代码结构 168
4.4.3 在SiFive Learn Inventor开发系统上运行CoreMark基准程序 168
4.4.4 CoreMark与Dhrystone两种基准程序的比较 169
第5章 FreeRTOS实时多任务操作系统原理与应用 171
5.1 嵌入式操作系统 171
5.1.1 为什么使用操作系统 172
5.1.2 RTOS 172
5.2 FreeRTOS—小型实时操作系统内核 173
5.2.1 为什么选择FreeRTOS 174
5.2.2 FreeRTOS内核基础知识介绍 175
5.2.3 关于FreeRTOS的软件授权 177
5.3 FreeRTOS的RISC-Ⅴ平台移植 178
5.3.1 FreeRTOS的移植 178
5.3.2 FreeRTOS内核源码结构 179
5.3.3 FreeRTOSConfig.h内核配置头文件 180
5.3.4 portmacro.h宏定义文件 182
5.3.5 port.c文件 183
5.3.6 portASM.s汇编实现文件 184
5.4 FreeRTOS的UART驱动结构分析、移植及应用 186
5.4.1 UART简介 186
5.4.2 UART驱动结构分析 186
5.4.3 FreeRTOS下的UART发送与接收 187
5.4.4 基于FreeRTOS的UART其他功能 189
5.4.5 FreeRTOS下的UART移植与应用 189
第6章 RT-Thread实时操作系统原理与应用 190
6.1 RT-Thread Nano介绍 190
6.1.1 RT-Thread简介 190
6.1.2 RT-Thread Nano软件结构 191
6.1.3 RT-Thread Nano特性 192
6.2 RT-Thread内核移植原理 193
6.2.1 RT-Thread目录结构 193
6.2.2 RT-Thread CPU架构移植 193
6.2.3 RT-Thread板级支持移植 195
6.3 移植RT-Thread到FE310微控制器 195
6.3.1 构建rtthread-metal包 196
6.3.2 构建板级支持文件 198
6.3.3 裁剪RT-Thread 201
6.4 使用Freedom Studio开发RT-Thread 202
6.4.1 rtthread-metal包 203
6.4.2 example-rtthread例程 203
6.4.3 在Freedom Studio中导入example-rtthread 205
6.5 移植FinSH组件 206
6.5.1 添加串口控制台 206
6.5.2 移植FinSH组件 208
6.5.3 修改LD连接文件 208
6.6 RT-Tread的UART驱动结构分析、移植及应用 209
6.6.1 RT-Tread外设驱动 210
6.6.2 UART驱动结构分析 210
6.6.3 UART的移植与应用 217
第7章 SiFive Learn Inventor开发系统应用开发实例 219
7.1 SiFive Learn Inventor开发系统组成 219
7.1.1 SPI闪存 219
7.1.2 I/O扩展连接器 220
7.1.3 无线连接 221
7.1.4 连接USB接口 222
7.2 在SiFive Learn Inventor开发系统点亮LED灯 223
7.2.1 构件化的设计思想 223
7.2.2 点亮LED灯 224
7.3 在SiFive Learn Inventor开发系统使用按键 228
7.3.1 中断的基本概念 228
7.3.2 中断服务程序设计 229
7.3.3 让按键控制LED灯 230
7.4 红外循迹小车 231
7.4.1 红外传感器 231
7.4.2 其他参考实例 235
7.4.3 应用实例 236
7.4.4 PID控制算法介绍 238
7.5 超声波避障小车 242
7.5.1 超声波测距原理 242
7.5.2 温度对测距的影响 242
7.5.3 超声波传感器介绍及使用 242
7.5.4 软件程序设计 243
附录A Amazon FreeRTOS认证 253
A.1 搭建测试项目 253
A.1.1 下载测试代码 253
A.1.2 测试项目设置 254
A.1.3 移植功能库准备 257
A.2 串口输出 258
A.2.1 准备内容 258
A.2.2 操作步骤 258
A.3 FreeRTOS内核移植 259
A.3.1 准备内容 259
A.3.2 操作步骤 259
A.4 蓝牙低功耗功能 260
A.4.1 准备内容 261
A.4.2 操作步骤 261
附录B Amazon FreeRTOS移植 265
B.1 系统要求 265
B.1.1 硬件要求 265
B.1.2 网络连接要求 265
B.2 下载Amazon FreeRTOS进行移植 266
B.2.1 下载Amazon FreeRTOS 266
B.2.2 从GitHub克隆Amazon FreeRTOS仓库 266
B.3 设置用于移植的Amazon FreeRTOS源代码 266
B.3.1 配置已下载的Amazon FreeRTOS数据资料 267
B.3.2 设置用于测试的Amazon FreeRTOS源代码 267
B.4 移植Amazon FreeRTOS库 270
B.4.1 执行宏configPRINT_STRING() 272
B.4.2 配置FreeRTOS内核端口 272
B.4.3 移植WiFi库 273
B.4.4 移植安全套接字库 274
B.4.5 移植PKCS #11库 276
B.4.6 移植TLS库 277
B.4.7 配置用于测试的MQTT库 279
B.4.8 配置用于测试的HTTPS客户端库 279
B.4.9 移植OTA库 280
B.4.10 移植蓝牙低功耗库 281
附录C 自制竞赛用智能车 283
C.1 机械结构设计 283
C.1.1 底盘设计 284
C.1.2 驱动设计 284
C.1.3 电源布局 284
C.1.4 SiFive Learn Inventor开发系统立式插槽布局 285
C.2 电子电路设计 285
C.2.1 电源稳压电路 285
C.2.2 电动机驱动电路 287
C.2.3 感光电路 287
C.2.4 外围接口电路 288
C.3 控制程序设计 291
C.3.1 驱动程序设计 291
C.3.2 控制算法设计 294
附录D SiFive Learn Inventor开发系统常见问题解答 297
D.1 在Ubuntu上的例程 297
D.2 SEGGER J-Link OB调试器未接入 299
D.2.1 SEGGER J-Link OB调试器配置 299
D.2.2 控制台配置 300
D.3 恢复SiFive Learn Inventor开发系统出厂设置 300
D.4 无法刻录程序 301
D.5 恢复开发系统出厂设置后仍无法刻录程序 301
D.6 调试参考信息 303
D.7 一般信息 303
参考文献 304