单片机原理西工大.docx
《单片机原理西工大.docx》由会员分享,可在线阅读,更多相关《单片机原理西工大.docx(49页珍藏版)》请在冰豆网上搜索。
单片机原理西工大
1.引言
计算机的基本结构
主机、输入设备、输出设备、存储设备、通信接口
计算机的抽象结构
CPU、总线、存储器和寄存器,通过寄存器操作周边设备
图1计算机的抽象结构
存储器结构
存储单元(地址、值)
单片机
通常没有键盘和显示器这样的输入输出设备
依靠宿主机进行开发,通过通讯电缆连接
DSP
DSP是DigitalSignalProcessor(数字信号处理器)的缩写,它是专门为支持计算密集型应用而设计的特殊CPU,采用多总线结构,有独立乘法器支持高速乘加运算,通常还支持特殊寻址方式用于FFT(FastFourierTransform)。
普通的CPU采用冯·诺伊曼(VonNeumann)结构,程序和数据是不加区分的,它们都通过唯一的一条总线来访问。
DSP采用哈佛(Harvard)结构,程序和数据各占一个地址空间,有两条总线分别为程序和数据提供通道。
程序空间也可以存放常数
总线结构
数据线、地址线、控制线
程序读总线
地址PAB
数据PRDB
数据读总线
地址DRAB
数据DRDB
数据写总线
地址DWAB
数据DWEB
图2总线结构
流水线操作
取指、译码、取操作数、执行
图3流水线操作
最小系统
电源、晶振
图4最小系统实验板
图5电源部分电原理图
图6晶体振荡器部分电原理图
图7印刷电路板图
CPU的基本组成结构框图
控制单元、16位数据总线、32位累加器ACC、中央算术逻辑单元CALU、乘法单元、辅助寄存器算术单元ARAU
主线:
存储器、输入定标器、中央算术逻辑单元、累加器、输出定标器
乘法器:
经过乘积定标到总线或CALU
图8CPU结构简图
思考题
1.一个存储单元有哪两个属性?
寄存器与存储器有什么不同?
2.由单片机构成的最小系统有哪几部分构成?
3.DSP是哪三个英文词的缩写?
中文意义是什么?
4.哈佛结构计算机与冯·诺伊曼结构计算机有什么差别?
5.微控制器与微处理器有什么不同?
6.TMS320LF24xA系列单片机有几套总线?
分别起什么作用?
总线中数据线和地址线分别有多少条?
最大可以访问多少存储单元?
每个存储单元由多少位组成?
7.什么是操作码?
什么是操作数?
8.实现一条指令的功能要经过哪四个阶段?
CPU为什么要采用流水线结构?
图9CPU结构图
2.寻址方式(上)
数据的存取
计算机中要处理的数据总是存放在存储单元中。
读取Read(也称为载入Load)是将数据从存储单元取到CPU的寄存器中,或是与CPU的寄存器进行运算。
写入Write(也称为保存Store)是将数据从CPU的寄存器放回到存储单元。
三种寻址方式
立即数寻址方式(ImmediateAddressingMode):
操作数是常数,只能读取,存放在指令字中。
直接寻址方式(DirectAddressingMode):
操作数是存储单元,可读写,地址在指令字中。
间接寻址方式(IndirectAddressingMode):
操作数是存储单元,可读写,地址在辅助寄存器中。
负数的表示
16位二进制补码
无符号数0x0000~0xFFFF(0~65535)
有符号正数0x0000~0x7FFF(0~32767)
有符号负数0x8000~0xFFFF(-32768~-1)
负数的三种表示(以-1为例)
原码表示0x8001
反码表示0xFFFE
补码表示0xFFFF
0x0000的反码是0xFFFF,补码=反码+1
符号扩展
二进制补码(以-7为例)
4位表示为0x9,解释为0x9-0x10
8位表示为0xF9,解释为0xF9-0x100
规律:
最高位(符号位)向上扩展
-128
…
-8
-7
…
-1
0
1
…
6
7
8
…
127
4位
8
9
…
F
0
1
…
6
7
8位
80
…
F8
F9
…
FF
00
01
…
06
07
08
…
7F
数的表示范围、溢出的概念
例:
4位二进制补码的表示范围是-8到7,7加1或-8减1会发生溢出。
而8位二进制补码的表示范围增大到-128到127,此时7加1或-8减1并不会发生溢出。
状态与控制寄存器ST0与ST1,每次全部列出,遇到一个介绍一个,先介绍SXM
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
ST0
ARP
OV
OVM
1
INTM
DP
ST1
ARB
CNF
TC
SXM
C
1
1
1
1
XF
1
1
PM
立即数寻址
在立即数寻址方式中,指令字包含指令要操作的常数。
在汇编指令中用#表示后面的数或标识符是一个立即数。
有两种类型的立即数寻址方式:
短立即数寻址和长立即数寻址。
使用短立即数寻址的指令有8位、9位或13位常数作为操作数。
短立即数指令是单指令字,常数嵌入这个字中。
累加器低半字装载指令:
LACL
#k
将8位常数k装入累加器低16位,不管SXM为0或1,不作符号扩展。
例:
LACL
#18
;指令编码B912
LACL
#12h
;不论SXM为0或1,ACC为0x00000012
汇编语句格式:
标号、操作符、操作数、注释
[标号:
]
操作符
操作数
[;注释]
标号可缺省,此时行首必须是空格或制表符。
“;”至行末为注释,注释可缺省。
行首是*则为全行注释。
本例LACL为操作符,表示装载累加器低半部;#18为操作数,表示常数18。
使用长立即数寻址的指令有一个16位的常数作为操作数,需要两个指令字。
常数作为第二个指令字传送。
这个16位值可以用作绝对值常数,也可以作为二进制补码值。
累加器装载指令:
LACC
#lk
将16位常数lk装入累加器。
当SXM为0时,为无符号数,高位补0;当SXM为1时,为有符号数,高位符号扩展。
例:
LACC
#1234h
;指令编码BF821234
;不论SXM为0或1,ACC为0x00001234
LACC
#8765h
;指令编码BF828765
;当SXM为0时,ACC为0x00008765
;当SXM为1时,ACC为0xFFFF8765
直接寻址
直接寻址方式中,数据存储器按128字的块寻址,这些块称为数据页(DataPage)。
全部64K数据存储器由512个数据页构成,编号为0到511。
当前数据页由状态寄存器ST0中的9位数据页指针(DP)的值确定。
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
ST0
ARP
OV
OVM
1
INTM
DP
ST1
ARB
CNF
TC
SXM
C
1
1
1
1
XF
1
1
PM
数据页装载指令:
LDP
#addr
将常量addr装载到ST0的DP。
除了数据页,处理器还必须知道这个页中正引用的特定的字,这由7位偏移量确定。
偏移量由IR寄存器中7个最低有效位(LSB)提供,指令寄存器(IR)保存下条要执行指令的操作码。
使用直接寻址的指令结构如图10所示,操作数的16位地址按图11构成。
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
8MSBs
0
dma
图10使用直接寻址的指令结构
图11直接寻址时的地址构成
不必在每条使用直接寻址的指令前设置数据页。
如果在一块代码中所有的指令都访问同样的数据页,可以简单地在块之前装入DP。
可是,如果在一块代码中访问不同的数据页,要确保每当访问新的数据页时改变DP。
累加器低半字装载指令:
LACL
dma
将地址dma对应的存储单元中存放的16位数据装入累加器低16位,高16位补零,不管SXM为0或1,不作符号扩展。
例:
将地址00FFh处的内容装ACC。
LDP
#(0FFh>>7)
;将1装入DP
;地址范围0x0080~0x00FF
LACL
0FFh
;指令编码697F,编译器自动取低7位
使用符号常量,常用于访问存储器映射的I/O地址,如串行通讯口SCI的接收缓存地址0x7057,可以用符号SCIRXBUF表示。
SCIRXBUF
.set
7057h
;SCIReceiverDataBufferRegister
LDP
#(SCIRXBUF>>7)
;将高9位0x0E0装入DP
LACL
SCIRXBUF
;编译器自动取低7位
;读取SCI已接收到的内容
伪指令:
定义符号常量
标识符
.set
值
用“标识符”表示“值”,本例SCIRXBUF表示7075h,是串行通信口的接收缓存寄存器。
用符号表示常量是一个好的编程习惯,增强程序的可读性,也便于修改常量。
使用变量
.data
;以下内容放入data节
x
.int
1234h
;建立变量x并赋初值0x1234
.text
;以下内容放入text节
LDP
#x
;编译器自动取高9位
LACL
x
;编译器自动取低7位
.end
伪指令:
指定数据节
.data
这条伪指令以下的内容在编译时将放在预先定义的名为“data”的节中,在链接时分配存放数据的地址。
伪指令:
定义16位整型变量并赋初值
标识符
.int
初值
定义名为“标识符”的16位整型变量并赋“初值”。
伪指令:
指定代码节
.text
这条伪指令以下的内容在编译时将放在预先定义的名为“text”的节中,在链接时分配存放代码的地址。
伪指令:
结束汇编源程序
.end
安装与使用CCS
双击Setup按提示操作即可,安装完成后首次使用前需进行配置,将“C2xxSimulator”拖到左栏就可以在PC机上模拟C2xx系列单片机了。
简介:
项目文件、汇编源文件、包含文件、链接命令文件
目标程序、CPU状态
图12配置CCS
思考题
1.有哪三种寻址方式?
2.指令LACL#10与LACL10有什么区别?
各为什么寻址方式?
含义是什么?
3.指令LACC#1234h和LACC#0ABCDh执行后累加器ACC中为何值?
与SXM的状态有关吗?
4.要用直接寻址将地址0x0378处的值装入累加器,DP中应装入什么值?
指令中包含这个地址的哪几位?
3.寻址方式(下)
间接寻址
八个辅助寄存器(AR0-AR7)提供了灵活而强有力的间接寻址,64K数据空间的任何位置都可以用辅助寄存器中的16位地址访问。
状态寄存器ST0的辅助寄存器指针(ARP)位域指定当前辅助寄存器(即当前AR)。
在指令的处理过程中,当前辅助寄存器的内容用作所访问的数据存储器的地址。
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
ST0
ARP
OV
OVM
1
INTM
DP
ST1
ARB
CNF
TC
SXM
C
1
1
1
1
XF
1
1
PM
指定当前AR指令:
MAR
*,ARn
指定ARn为当前AR,使ST0中的ARP成为n(0至7),同时ARP的原值保存到ST1的ARB位域。
AR装载指令:
LAR
ARn,#Addr
将常量Addr装载到辅助寄存器ARn。
累加器低半字装载指令:
LACL
*
将当前AR中的地址指向的存储单元的16位数据装入累加器低16位,高16位补零。
例:
将地址00FFh处的变量x的内容装ACL。
LAR
AR2,#0FFh
;将0x00FF装载到AR2
MAR
*,AR2
;指定AR2为当前AR
LACL
*
;指令编码6980
使用变量或符号常量
LAR
AR2,#x
;将x所代表的地址装载到AR2
如果指令需要从数据存储器读,则ARAU将这个地址传给数据读地址总线(DRAB);如果指令需要向数据存储器写,则它将这个地址传给数据写地址总线(DWAB)。
移动指针
在指令使用了数据值之后,当前辅助寄存器的内容可以由ARAU增加或减少,ARAU实现无符号16位算术。
*
无增量或减量
*+
*-
加1/减1
*0+
*0-
按指标量AR0增加/减少
*BR0+
*BR0-
使用反向进位按指标量AR0增加/减少,用于FFT
例:
从前向后访问数组
x
.int
1,2,3,4
;intx[]={1,2,3,4};
;假设x的地址是0x0100
LAR
AR2,#x
;将x的首地址装载到AR2为0x0100
MAR
*,AR2
;指定AR2为当前AR
LACL
*+
;ACC为0x00000001,AR2为0x0101
LACL
*+
;ACC为0x00000002,AR2为0x0102
从后向前访问数组
MAR
*,AR2
;指定AR2为当前AR
LAR
AR2,#(x+4-1)
;将x的末地址装载到AR2为0x0103
LACL
*-
;ACC为0x00000004,AR2为0x0102
LACL
*-
;ACC为0x00000003,AR2为0x0101
跳过数组中一段
MAR
*,AR2
;指定AR2为当前AR
LAR
AR0,#2
LAR
AR2,#x
;将x的首地址装载到AR2为0x0100
LACL
*0+
;ACC为0x00000001,AR2为0x0102
LACL
*0+
;ACC为0x00000003,AR2为0x0104
二进制逆序
MAR
*,AR2
;指定AR2为当前AR
LAR
AR0,#4
LAR
AR2,#0
LACL
*BR0+
;AR2为0x0004
LACL
*BR0+
;AR2为0x0002,向低位进位
LACL
*BR0+
;AR2为0x0006
LACL
*BR0+
;AR2为0x0001
指定下个辅助寄存器
除了更新当前辅助寄存器,一些指令也可以指定下个辅助寄存器,即下个AR。
当指令执行完后,这个寄存器将成为当前辅助寄存器。
允许指定下个辅助寄存器的指令将新值装入ARP。
当ARP装入这个值时,ARP的前一个值装入辅助寄存器指针缓存(ARB)。
任何支持间接寻址操作数的指令都可以修改辅助寄存器(除了以立即数为操作数或无操作数的指令外,所有指令都可以用间接寻址。
)
支持间接寻址的指令结构如图13所示。
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
8MSBs
1
ARU
N
NAR
位
缩写
说明
15:
8
8MSBs
指定指令类型,还包含数据移位的信息。
7
指示直接/间接,0/1=直接/间接
6:
4
ARU
辅助寄存器更新码。
确定当前辅助寄存器是否增减、如何增减。
3
指示下个辅助寄存器,0/1=ARP内容不变/变化。
2:
0
NAR
下个辅助寄存器值。
操作数
ARU
说明
*
000
无增减
*-
001
减1
从当前AR值减1。
*+
010
加1
向当前AR值加1。
011
保留
*BR0
100
减指标量,减法采用反向借位
从当前AR值减去AR0的值,减法采用反向进位传递。
*0-
101
减指标量
从当前AR值减去AR0的值。
*0+
110
加指标量
向当前AR值加上AR0的值。
*BR0+
111
加指标量,加法采用反向进位
向当前AR值加上AR0的值,加法采用反向进位传递。
图13使用间接寻址的指令结构
例:
指定下个AR
MAR
*,AR2
LAR
AR2,#100h
LAR
AR3,#200h
LACL
*+,AR3
;AR2为0x0101,AR3仍为0x0200
;ARP为3,ARB为2
快速傅立叶变换
时域信号经过傅立叶变换可以分解为一系列余弦信号,这些余弦信号的幅值和相位就是傅立叶变换的结果,幅值随频率的分布称为频谱。
图14时域信号
图15频域分解
图16信号合成
图17幅频特性
图18相频特性
时间序列
的傅立叶变换为:
其中:
表示顺时钟旋转
圆周的单位矢量。
当N是2的幂次时,例如
时:
0
1
2
3
4
5
6
7
二进制正序
000
001
010
011
100
101
110
111
二进制逆序
000
100
010
110
001
101
011
111
0
4
2
6
1
5
3
7
图19变换基
图20蝶形计算
思考题
1.下列程序执行后,ARP、ARB、AR2和AR3的值分别是什么?
累加器装入的值来自哪个地址?
LARAR2,#100h
LARAR3,#200h
MAR*,AR2
LACL*+,AR3
4.累加器和辅助寄存器操作
小数的表示
定点处理器不仅可以实现整数运算,还可以实现小数运算。
小数点的位置由程序员指定,在输入、输出时相应调整。
表116位无符号定点数
格式
0x0001
0x7FFF
0x8000
0xFFFF
说明
Q0
1*20
(215-1)*20
215*20
(216-1)*20
整数
Q1
1*2-1
(215-1)*2-1
215*2-1
(216-1)*2-1
1位小数
……
Q15
1*2-15
(215-1)*2-15
215*2-15
(216-1)*2-15
15位小数
Q16
1*2-16
(215-1)*2-16
215*2-16
(216-1)*2-16
16位小数
表216位有符号定点数
格式
0x0001
0x7FFF
0x8000
0xFFFF
说明
Q0
1*20
(215-1)*20
-215*20
-1*20
整数
Q1
1*2-1
(215-1)*2-1
-215*2-1
-1*2-1
1位小数
……
Q15
1*2-15
(215-1)*2-15
-215*2-15
-1*2-15
15位小数
在累加器中指定小数点的位置,比如Q16。
各种格式的16位定点数在进入累加器时经过移位可以实现对齐。
装载累加器
累加器、临时寄存器、输入/输出定标器在CPU结构简图中的位置,说明定标器实现移位功能。
介绍桶形移位器(BarrelShifter),与移位链相比较,说明其优越性。
图21不移位、不作符号扩展
图22左移2位、不作符号扩展
图23左移2位、作符号扩展
累加器装载指令:
助记符
操作数
周期
编码
附加字
LACC
dma[,SHFT]
ind[,SHFT[,ARn]]
1
0001SHFTIAAAAAAA
LACC
dma,16
ind,16[,ARn]
1
01101010IAAAAAAA
将存储单元的16位数据左移0至16位装入累加器,按SXM确定是否符号扩展。
助记符
操作数
周期
编码
附加字
LACC
#lk[,SHFT]
2
101111111000SHFT
(lk)
将长立即数左移0至15位装入累加器,按SXM确定是否符号扩展。
助记符
操作数
周期
编码
附加字
LACT
dma
ind[,ARn]
1
01101011IAAAAAAA
将存储单元的16位数据按TREG低4位指定左移0至15位装入累加器,按SXM确定是否符号扩展。
可用于实现装载浮点数。
累加器低半字装载指令:
助记符
操作数
周期
编码
附加字
LACL
dma
ind[,ARn]
1
01101001IAAAAAAA
将存储单元的16位数据装入累加器低16位,高16位补零。
助记符
操作数
周期
编码
附加字
LACL
#k
1
10111001KKKKKKKK
将短立即数装入累加器低16位,高16位补零。
累加器高半字装载并圆整指令:
助记符
操作数
周期
编码
附加字
ZALR
dma
ind[,ARn]
1
01101000IAAAAAAA
将存储单元的16位数据装入累加器高16位,低16位为0x8000。
累加器内容表示Q16定点数,相当于加上0.5。
保存累加器
累加器低半字保存指令:
助记符
操作数
周期
编码
附加字
SACL
dma[,SHF]
ind[,SHF[,ARn]]
1
10010SHFIAAAAAAA
将累加器内容左移0至7位后取其低16位保存到存储单元。
移位时高位丢弃,低位补零。
累加器自身保持不变
累加器高半字保存指令:
助记符
操作数
周期
编码
附加字
SACH
dma[,SHF]
ind[,SHF[,ARn]]
1
10010SHFIAAAAAAA