本书全面介绍微处理器系统的工作原理与应用设计的基本方法。全书分为七章,包括数字处理系统概述、微处理器、汇编指令、程序设计、片上微处理器系统、常规外设应用设计、典型微控制系统设计开发等内容。本书主要从微处理器结构出发介绍汇编指令,从汇编指令出发介绍C程序设计,旨在让读者深入理解微处理器的工作原理并掌握程序设计的精要,通过外设驱动程序设计和最小系统设计提高实际设计与调试能力。
本书可作为高等学校电子信息类专业“微机原理”和“嵌入式系统程序设计”等课程的教材或教学参考书,亦可供其他专业师生及相关工程技术人员参考学习。
本书作者精心制作了PPT文件,有需要的读者可向出版社申请。
笔者自2009年起承担“微机原理与系统设计”(简称“微原”)课程的教学,发现课程教学部分内容已不适应现代企业的需求,所介绍的经典微处理器8086虽然非常适合用来讲解原理,但是没有真实平台能够演示,使学生不能在实际应用中感受和领会微机原理的奥妙。
随着ARM系列微处理器的快速发展,基于ARM的微控器纷纷登场,不仅占领了大多数消费电子市场,在工业控制和专用领域也得到了广泛应用,特别是物联网时代的到来,使得嵌入式系统成为当代产业的“宠儿”。
作为课程负责人,笔者深知讲授8086与产业需求差别太大,现在的研发项目都在使用ARM平台,而8086仅仅是为了满足课程需要,因此采用ARM处理器代替8086来讲解微机原理势在必行。
使用ARM处理器时面临两种选择:基于ARM7内核或Cortex-M3(简写为CM3)内核的处理器。如何做出选择呢?在构思本书时,尽管ARM7的资料非常完善,按理说应该是最佳选择,但考虑到CM3是ARM公司的新产品,将来必定被广泛应用,且CM3的生态会更好;而ARM7只是一款当时流行的处理器,不久将会退出历史舞台。另外,CM3的构架和指令操作相对简单易学,特别是存储访问和中断处理与8086相似;而ARM7的异常处理操作复杂且存储访问需要考虑字对齐,对于初学者有一定难度。经过对比斟酌,笔者最终选择了CM3。2010年的暑假完成了基于STM32F103的教学讲义,后由于事务较多,写写停停,终没有静心完成本书。
随着教学改革和专业认证等工作的推进,课程体系及内容都发生了变化。目前,“微机原理”课程分为两部分:一部分是“微处理器系统原理与应用”课程,主要包括CM系列处理器组成、汇编程序设计、系统组成结构和外设应用等内容;另一部分是“数字电路和逻辑设计”课程,包括总线和存储系统电路等内容以及采用数字电路实现简易微控器设计。
近两年,意法半导体公司中国大学计划发起了嵌入式技术专业培养与认证活动。通过调研发现,虽然用微处理器的人很多,但能够用好的人并不多,主要是对微处理器的原理掌握不深入,不能将原理与实际紧密融合,特别是对C语言与微处理器操作之间的关系不清楚。大家希望有一本将原理与应用相结合所编写的教材,让初学者掌握原理且能够利用原理来理解程序。笔者有幸得到了意法半导体公司中国大学计划资助的教育部产学协同育人项目的支持,从而有机会完成本书,了却十多年的愿望,也是对多年来课程教学改革的总结。
微机原理的重点是指令,它是连接软件和硬件的桥梁。用指令编写程序的实质是用户通过控制微处理器进行各种硬件操作。要编好程序,就要用好指令;要用好指令,则必须理解微处理器的构架及运行机制。基于指令的汇编程序开发在时间效率和易读性方面的表现比C语言差,因此利用C语言编写指令更便于理解硬件操作的过程。清楚了C语言的执行过程后,一方面可以灵活运用语句提高处理器的执行效率;另一方面可以从处理器执行过程中发现软件设计与执行的错误或不足,加快软件调试进程。
总而言之,“代码在手中,运行在心中”。也就是说,当我看到C程序时,就能够在脑海里浮现出处理器及系统各单元在相互协作、数据流在各单元中流出流入的宏观场面。
本书分为七章,各章安排如下:
第一章,从数字信息处理角度引入微处理器系统,同时给出微处理器所用的数制表示和二进制运算的基本规则,并介绍了微处理器及系统的发展史。
第二章,从信息处理系统设计的角度,按照运算器、寄存器、控制器、指令产生与编码、指令读取与译码的顺序渐入式勾勒出微处理器架构和操作机制,最终给出常规微处理器的完整架构。通过分析目前流行的Cortex-M4处理器的内核结构、存储系统和异常处理机制,可使读者对微处理器构造和指令运行机制有深入的认识,以便后面更好地理解和应用指令。
第三章,介绍了与指令及其操作相关的概念和流程,并从数据传输、数据运算、流程控制和异常处理这四个方面介绍微处理器最为通用的指令;利用图表结合的方法分析了处理器的具体操作方法,使读者能够“见指令明操作,想操作知指令”;还介绍了常用的数字信号处理指令,便于从事信号处理和数据通信工作的读者进行程序设计。
第四章,介绍了程序设计的基本方法,包括常规的变量定义、赋值、运算、分支跳转、调用等操作,同时对程序设计流程、异常处理编程和混合编程等内容进行了详细描述。大部分内容采用汇编语言和C语言两种方式对照描述,这样可以有效帮助读者建立C语句与微处理器操作之间的联系,让读者明白语句执行的原理和过程,能够从微处理器结构角度来理解软件的执行。
第五章,介绍了片上微处理器系统的基本构架和系统原理、Cortex-M4处理器的基本组成和关键部件、STM32F401的基本组成和典型外设原理、最为常用的中断系统结构与应用开发,使读者能够掌握微处理器系统的典型构架和组成以及典型外设的工作原理。
第六章,介绍了外设操作,即如何通过对外设接口中的寄存器进行读写来实现操作控制、状态读取、参数配置、数据收发,并穿插介绍了轮询和中断的应用;以STM32F401为平台,介绍了时钟管理、GPIO、EXTI、定时器、USART、DMAC、ADC等常规外设的配置及应用设计。
第七章,介绍了如何根据需求来设计和开发一个简易的典型微控制系统,对电路设计、设备驱动开发、功能调试以及模拟仿真等关键环节进行了详细描述,使读者能够掌握微处理器系统的设计开发方法、微控制系统的常规电路设计、驱动软件设计的基本框架、硬件调试与集成等。
由于学习本书需要C语言基础,因此本书在附录中介绍了C语言程序设计入门。
为了使读者掌握微处理器系统的应用开发,本书给出了编程和调试的基本思路、方法与应用实例,读者可以在相应的平台上进行练习,有助于提升实际动手能力。
本书由西安电子科技大学通信工程学院陈彦辉、冯磊、康槿共同编著。陈彦辉编写第一、二、三、四章,陈彦辉与冯磊合编第五章和第六章,陈彦辉与康槿合编第七章。陈彦辉负责全书的统稿工作。
本书在编写过程中得到了意法半导体中国区微控制器市场及应用总监曹锦东先生、大学计划经理丁晓磊女士的帮助,在此表示感谢!
由于笔者水平有限,书中难免存在不妥之处,恳请广大读者批评指正。
陈彦辉
2021年12月
第一章 数字处理系统概述 1
1.1 信息处理系统的结构 1
1.2 数制与运算 3
1.2.1 二进制数 4
1.2.2 十六进制数与八进制数 5
1.2.3 二进制算术运算 6
1.2.4 数值编码 7
1.2.5 数据编码与逻辑运算 9
1.3 数字处理系统的构成 10
1.3.1 系统结构 10
1.3.2 处理流程 11
1.3.3 操作描述 11
1.3.4 基于微处理器的系统结构 14
1.4 典型微处理器及系统 14
1.4.1 Intel微处理器 15
1.4.2 ARM处理器 18
1.4.3 微处理器系统的应用 19
习题 20
第二章 微处理器 21
2.1 微处理器的基本架构 21
2.1.1 运算器 21
2.1.2 寄存器组 22
2.1.3 处理电路 24
2.1.4 控制指令 26
2.1.5 数据存储 28
2.1.6 处理器结构 31
2.1.7 存储结构 32
2.2 数据处理 33
2.2.1 指令 33
2.2.2 程序 34
2.2.3 异常处理机制 36
2.3 Cortex-M4处理器内核 37
2.3.1 寄存器组 38
2.3.2 指令执行 38
2.3.3 处理操作 39
2.3.4 特殊寄存器 39
2.4 Cortex-M4存储系统 41
2.4.1 存储器空间映射 41
2.4.2 总线访问 41
2.4.3 栈存储 42
2.4.4 位段操作 44
2.5 异常处理 44
习题 46
第三章 汇编指令 48
3.1 指令体系 48
3.1.1 指令格式 48
3.1.2 指令代码 49
3.1.3 指令执行的描述 50
3.2 数据传输指令 51
3.2.1 寄存器与存储器之间的传输 51
3.2.2 寄存器之间的传输 57
3.2.3 立即数加载到寄存器 58
3.2.4 寄存器与特殊寄存器之间的
传输 59
3.3 数据运算指令 59
3.3.1 算术运算指令 60
3.3.2 逻辑运算指令 61
3.3.3 比较与测试指令 62
3.3.4 移位运算指令 62
3.4 数据转换指令 63
3.4.1 数据扩展指令 63
3.4.2 数据反序指令 64
3.4.3 数据重组指令 64
3.4.4 位域处理指令 65
3.5 流程控制指令 65
3.5.1 跳转指令 66
3.5.2 调用指令 69
3.6 异常处理指令 70
3.6.1 SVC指令 70
3.6.2 CPS指令 71
3.6.3 异常返回触发指令 71
3.7 DSP处理指令 71
3.7.1 饱和运算指令 72
3.7.2 SIMD指令 72
3.7.3 乘与乘加指令 74
习题 76
第四章 程序设计 78
4.1 开发架构 78
4.1.1 编程语言 78
4.1.2 程序的基本要素 79
4.1.3 汇编程序结构 80
4.1.4 集成开发环境 83
4.1.5 启动程序结构 86
4.2 数据定义 87
4.2.1 常量 87
4.2.2 变量 88
4.2.3 数组变量 91
4.2.4 指针变量 92
4.2.5 结构体变量 93
4.2.6 变量共用 94
4.3 数据处理 95
4.3.1 符号扩展加载 95
4.3.2 数据运算 96
4.3.3 运算数据存储 97
4.4 流程结构 97
4.4.1 分支结构 97
4.4.2 循环结构 102
4.5 函数 104
4.5.1 参数传递 105
4.5.2 局部变量分配 107
4.5.3 函数示例 108
4.6 混合编程 109
4.6.1 变量互用 109
4.6.2 函数互调 110
4.6.3 嵌入汇编 111
4.6.4 内联汇编 111
4.7 异常处理 112
习题 115
第五章 片上微处理器系统 117
5.1 系统架构 117
5.1.1 系统总线 118
5.1.2 存储器系统 119
5.1.3 外设接口 120
5.1.4 中断系统 122
5.1.5 直接存储访问器 122
5.2 典型外设 123
5.2.1 通用输入/输出 123
5.2.2 定时/计数设备 124
5.2.3 通信设备 125
5.2.4 模拟/数字转换 129
5.3 Cortex-M4处理器 130
5.3.1 处理器结构 130
5.3.2 处理器总线 131
5.3.3 系统异常与中断 132
5.3.4 SysTick 136
5.4 STM32F4系统结构 138
5.4.1 系统总线 138
5.4.2 系统时钟 140
5.4.3 DMA系统 141
5.5 管脚配置 143
5.6 中断系统 146
5.6.1 中断源 146
5.6.2 EXTI 147
5.6.3 中断程序设计示例 148
习题 149
第六章 常规外设应用设计 151
6.1 平台简介 151
6.2 时钟管理 153
6.3 通用输入/输出 155
6.3.1 GPIO寄存器组 155
6.3.2 GPIO应用设计1 156
6.3.3 GPIO应用设计2 158
6.4 外部中断 160
6.4.1 EXTI寄存器 160
6.4.2 EXTI应用设计 161
6.5 通用定时器 162
6.5.1 通用定时器的常用寄存器 162
6.5.2 定时器应用设计1 164
6.5.3 定时器应用设计2 166
6.6 通用同/异步收发器 168
6.6.1 USART寄存器配置 168
6.6.2 USART收发处理模式 169
6.6.3 USART轮询模式应用设计 170
6.6.4 USART中断模式应用设计 172
6.7 DMA控制器 174
6.7.1 DMAC寄存器 174
6.7.2 USART DMA模式应用设计 176
6.7.3 存储器之间DMA传输
应用设计 178
6.8 模拟/数字转换器 180
6.8.1 ADC寄存器配置 180
6.8.2 ADC应用设计 181
习题 183
第七章 典型微控制系统设计开发 185
7.1 设计需求 185
7.2 电路设计 185
7.2.1 处理器电路 186
7.2.2 接口电路 189
7.2.3 电源电路 191
7.3 电路测试 192
7.4 驱动程序设计 193
7.4.1 数码管显示控制 193
7.4.2 温度测量控制 195
7.4.3 按钮控制 196
7.4.4 异步串口收发控制 197
7.4.5 电机驱动控制 199
7.4.6 时序控制 200
7.5 功能测试 202
7.5.1 测试平台 202
7.5.2 单功能模块测试 203
7.5.3 系统功能模块测试 209
习题 211
附录 C语言程序设计入门 212
参考文献 230