本篇文章介绍了基于单片机平台开发的一些基本理论知识,包括了硬件最小系统的说明以及基于单片机开发的过程。文中还额外介绍了ARM体系架构,帮助读者从更深层次去熟悉我们平常最容易接触的开发平台,熟悉这些寄存器定义和处理器模式能够帮助我们在定位诸如死机等难以下手的问题时,提供一些方法。
文章目录
最简单片机系统与开发步骤
单片机最小系统
开发步骤
ARM架构
寄存器
处理器模式
最简单片机系统与开发步骤
我们先从最简单的实现,来介绍单片机的硬件最小系统和单片机系统开发的一般过程。
单片机最小系统
只有一个AT89S51单片机是无法实现任何功能的,除了要向单片机供电之外,还要有若干个简单的外围器件构成最简单片机系统并预留程序烧录的接口。下面介绍了最简单片机系统中都包含什么元素。
- 电源(+、GND):下图所示为AT89S51单片机的最简系统构成,40管脚和20管脚分别接电源+和GND。根据AT89S51的技术文档知其工作电压范围为直流+4.0~+5.5V。
- 时钟信号(XTAL1、XTAL2):单片机的XTAL1 端(19 管脚)、XTAL2端(18 管脚)接晶振Y1与电容C1和C2如上图所示,这种固定的结构与单片机内部的电路组成一个振荡器,产生单片机时钟脉冲信号。这种使用晶振配合产生时钟脉冲信号的方法称为内部时钟方式。晶振的频率决定了单片机系统的时钟频率。例如晶振频率为 12MHz,那么单片机的时钟频率就是12MHZ。电容C1和C2的容量范围为 20~40pF。除了内部时钟方式外,还可以把适当频率的外部时钟脉冲信号输入到XTAL2端,而把XTAL1端接地。
- 复位(RST):在上图中,复位端(9管脚)与+Vcc之间连接了一个 10uF 电解电容 C3,当单片机系统上电时,电解电容 C3 的正极瞬间变为+V,电容对于这个瞬间的电压突变相当于短路,于是+5V 瞬间加到复位端上使单片机复位。很快,电解电容 C3 满电,在电路中相当于断路,于是复位端电平由高转低,单片机开始进入正常工作状态。有时,只使用一个电解电容的复位电路可靠性不高,而下图 所示是两种较好的复位电路。其中,图 b按开关 S1可在手动复位时使用。当按开关闭合时,无论单片机在执行什么操作都会被强行复位。
开发步骤
以控制一个发光二极管为例,介绍单片机系统的开发过程。要想开发一个单片机系统,首先要非常明确系统的功能是什么,然后根据功能要求规划硬件(也就是设计电路)和设计软件(单片机程序),最后把程序下到单片机中进行硬件和软件联合调试,直到系统功能达到设计要求为止。
- 功能确定:系统启动后,单片机控制一个发光二极管点亮500ms(毫秒),熄灭 500ms,再点亮 500ms,再熄灭 500ms······如此循环,产生发光二极管闪烁的效果,如图 下图所示。
要实现单片机控制发光二极管以500ms 为间隔闪烁,则发光二极管需要以某种形式与单片机的管脚进行连接,接受其控制。比如 P1.0口(1管脚),单片机既可以把P1.0口上的信号读入单片机,也可以通过 P1.0口输出1或0。 - 电路设计:所有单片机系统都可从最简系统开始,添加所需的模块。如本例控制发光二极管系统中,除了最简系统外,只需要添加一个发光二极管 D1和一支限流电阻 R1。如下图所示,添加的部分连接到P1.0 口上,当然也可以连接到 POP1P2、P3 中任何一个I/0。
- 程序设计:硬件电路搭建完毕后,就可以进入程序的设计阶段。单片机之所以有如此大的魅力,全赖于程序对单片机IO口及其他功能模块的控制。根据本系统功能:单片机控制一个发光二极管的点亮500ms,熄灭500ms,再点亮500ms,再熄灭500ms......发光二极管 D1连接在 P1.0口上,并知道当单片机P1.0为0时(低电平)发光二极管D1被点亮,P1.0口为1时(高电平)则熄灭。于是可得用中文描述的程序设计流程,如下图所示。
- 单片机并不能“理解”中文,所以还需要把上图流程转化成单片机的语言才能下载到单片机里,转换的结果如下图所示,
因为现在很少有使用汇编语音进行编程的工程师了,我们这边只对这门语言根据上面提到的代码片做一些简要的介绍。
汇编语言(assembly language)是一种低级的与硬件打交道的语言。这段程序代码由 6行组成,除第一行的标号 START 外,其余5行就是5条指令(instruction。每一条指令会对单片机下一条命令,使单片机完成某种操作。这5条指令从头到尾执行一遍,就实现了发光二极管 D1 点亮500ms->熄灭500ms,即一次闪烁。
单片机会顺序地执行每一条指令并实现相应的操作。如第2行指令"MOV P1,#00H"让单片机的 P1 口输出0,执行完这条指令后,P10~P1.7 均为0。于是连接在 P1.0上的发光二极管被点亮。
完整的指令由标号(可选)、助记符、目的操作数、源操作数及注释(可选)组成如下图所示。
标号是以英文字母开头的字母、数字或某些特殊符号的组合,例如 D_1:、START:等。汇编语言对字母的大小写不敏感,但习惯上都使用大写字母。另外,标号可以和其他指令在同一行,也可以单独为一行。以下两种写法是等价的。
指令中助记符是必不可少的,它用来表示指令的操作功能。如上图中助记符 MOV是单词 Move 的简写,其功能是把源操作数 (00H)载入目的操作数(P1)中。而目的操作数是指令最终作用的对象。源操作数参与指令的操作,指令的执行将使用到源操作数。如指令MOV P1,#00H的功能是把 00H载入P1中。源操作数中,#号代表其后的00H是一个立即数,也就是说该指令的源操作数由一个立即数充当,指令执行完毕后,P1=00H,即P1.0~P1.7口输出均为0。
注释是程序编写人员为了他人或自己阅读程序时方便而标记的,可以用来提高程序的可读性和调试的方便性。在汇编语言中,分号后面的部分是不会影响指令的,只是程序中解释说明的部分。也就是说,分号后的部分并不是可执行程序的一部分。下图是控制发光二极管闪烁的完整程序。
我们开发单片机程序的工具称之为Keil,是国际上比较流行的单片机程序的开发和仿真软件。我们可以在Keil选择芯片的型号,这样集成开发环境就会自动帮我们拉取诸如启动文件等资源。
程序的下载首先需要我们正确的将下载器和板卡预留的下载接口相连,然后我们把使用下载软件把通过集成开发环境编译出来的可执行文件烧录到芯片上即可。
ARM架构
ARM架构,曾称进阶精简指令机器(Advanced RISC Machine)更早称作Acorn RISC Machine,是一个32位精简指令集(RISC)处理器架构。
寄存器
ARM一共有37个寄存器,七个处理模式。处理模式包括:用户模式(USR),快速中断模式(FIQ),普通中断模式(IRQ),管理模式(SVC),数据访问中止模式(ABT),未定义指令中止模式(UND),系统模式(SYS)
37个寄存器,其中31个为通用寄存器,6个位状态寄存器,都是 32 位的寄存器。
下面是通用寄存器按作用分类:
- r0~r3 主要用于子程序间传递参数。
- r4~r11 主要用于保存局部变量,但在 Thumb 程序中,通常只能使用 r4~r7 来保存局部变量。
- r12 用作子程序间scratch 寄存器ip。
- r13 通常用做栈指针sp。
- r14 寄存器又被称为连接寄存器lr。
- r15 用作程序计数器(pc)。
通用寄存器有针对不同模式专属的,也有所有模式公用的寄存器。R0-R7(8个所有模式共用)、R8-R12(FIQ单独用,其他六种模式共用,共有10个)、R13-R1(USR和SYS共用2个,其他模式单独用2*5=10个,共12个)、R15(8个所有模式公用),则有总数31 =8+10+12+1。
6 个状态寄存器,都是 32 位的寄存器。CPSR(1个)/SPSR(5个)。
- SPSR:Saved Program Status Register;保存的程序状态寄存器
- CPSR:Current Program Status Register;当前程序状态寄存器
处理器模式
当异常发生,MCU进入相应的异常模式时,以下工作是由硬件自动完成的:
- 在异常模式的R14中保存前一工作模式的下一条即将执行的指令地址。
- 将CPSR的值复制到异常模式的SPSR中。
- 将CPSR的工作模式设为该异常模式对应的工作模式。
- 令PC值等于这个异常模式在异常向量表中的地址,即跳转去执行异常向量表中的相应指令。
从异常工作模式退回到之前的工作模式时,需要由软件来完成以下工作:
- 将异常模式的R14减去一个适当的值(4或8)后赋给PC寄存器。
- 将异常模式SPSR的值赋给CPSR。
ARM处理器对7种工作模式的定义如下:
- 用户模式(USR):正常程序执行模式,不能直接切换到其他模式。
- 系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权。
- 快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式。
- 中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式。
- 管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发)。
- 中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处。
- 未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式。
十六宿舍 原创作品,转载必须标注原文链接。
©2023 Yang Li. All rights reserved.
欢迎关注 『十六宿舍』,大家喜欢的话,给个👍,更多关于嵌入式相关技术的内容持续更新中。