-
嵌入式系统
复习笔记
-----
增哥
注意点:本复习指导基本已包括所
有的程序设计以及分析题,每个考点后面均有例题,例题前的所有知识
点我已经把他写的
尽量通俗易懂,把程序分析的方法也写明,希望大家用几个小时时间来看看,通过考试
绝
对没有问题!
PS<
/p>
:
本材料后面所写的参考页码均是以新版书为标准,
用旧版书的同学麻烦自己写
上旧版书的页码,知识点都是一样的!
!
!本人能力有限,如有错误,请见谅!
!
1
、状态寄存器
CPSR
各
bit
的意义:
扩展位
状态位
标志位
控制位
31 30 29 28 27
26 25 24 23 22 21 20 19 18 17 16 15 14 13 12
11 10 9 8 7 6 5 4 3 2 1 0
N
Z C V Q Res J Res
GE[3:0] Res E A I F
T
mode
各位同学只需了解控制位
bit0~bit7
Mode[4:0]
是见表
1
P29
Mode[4:0]
10000
模式
10001
10010
10011
10111
中止
11011
未定义
11111
系统
用户
FIQ
中断
IRQ
中断
管理
T:
为
状态:
0
表示
ARM
< br>状态,
1
表示
Thumb
状态
I
、
F
表示
IRQ
中断
p>
FIQ
中断的使能。
1
时中断禁止,
0
时中断使能(允许该中断)
。
2
、三个特殊用途寄存器
SP(R13)
LR(R14)
PC(R15)
R13
(
SP
)
:堆
栈指针,保存当前处理器模式的堆栈栈顶。
R14
(
LR
)
:链接
R
,
保存子程序(含发生异常)的返回地址。<
/p>
R15
(
PC
)
:程序计数器,保存下一条指令的地址。
注意点:
PC
指针永远指向取值
(什么意思?见第
3
点流水线)
p>
3
、
ARM7
的流
水线
采用三级流水线,即
取指→译码→执行
例:假设一共有三条指令:
0x4000
ADD
PC,PC,#4
;
p>
其中第二个
PC
指针的值为
0x4008
,将第二个
PC+4=0x400C
p>
赋给第一个
PC
指针(回答上述
PC
指针永远指向取值的问题)
0x4004
SUB
0x4008
CMP
那么
CPU
实际执行为:
周期
取指
译码
执行
T1
ADD
T2
SUB
ADD
T3
CMP
SUB
ADD
解释:当第一
CPU
周期
T1
时先取址,
取
第一个指令的地址
。
当第二
CPU
周期
T2
时
取第二个指令的地址
p>
,然后译码,
译的是第一个指令的码
当第三
C
PU
周期
T3
时
取第三个指令的地址
,
译第二个指令的码
,
执行第一个指令
所以:
PC
值
=
当前程序执
行位置
+8
字节
(如果
CPSR
中的
T
位为
0
,则
+8
;如果
p>
T
位为
1
,则
p>
+4
)
1
4
、<
/p>
PLL
频率的计算(
P133
)
处理器时钟
晶振或外部时钟源
Fosc
VPB
分频器
PLL
(
cclk
)
VPB
时钟
(
pclk
)
符号
说明
晶体振荡器的输出频率,即
PLL
的输
入频率
PLL
电流控制振荡器的输出频率
<
/p>
PLL
最终的输出频率(即
CPU
内核需要的频率)
经过
VPB
分频器后的供给外部设备的输出频率值
PLLCFG
寄存器中的
MSEL
位的倍增器值
+1
P134
PLLCFG
寄存器中的
PSEL
位的
分频器值
P134
F
OSC
F
CCO
F
CCLK
F
PCLK
M
P
PLLCFG
寄存器的意义:一个
8
位的
P
LL
配置寄存器
PLLCFG[4:
0]
为
MSEL[4:0],
存放的是
PLL
倍频器值(即
M
值)
;
例:
MSEL[4:0]=00101
则表示
5
,
M=5+1=6
PLLCFG[6
:5]
为
PSEL[1:0]
,存放的
是
PLL
的分频器值(即
P
值;
)
例:
PSEL[1:0]=
00
则表示
P=1
01
则表示
P=2
10
则表示
P=4
11
则表示
P=8
PLL
频率公式:
F
CCO
?
F
OSC
?
(
2
?
P
?
p>
M
)
F
CCO
p>
?
F
C
C
L
K
?
(
2
?
P
)
< br>
注意点:
F
CCO
的范围为
156~320MHZ
;
例题:晶振的频率为
10MHZ
,需要输出的系统时钟为
60MHZ
,请问如何配置?
p>
答:
F
OSC
=10MHZ
,所以
< br>M
?
F
CCLK
?
6
,
所以
< br>
M-1=5
,所以
MSEL[4:0]=0b00101;
F
O
SC
F
CCO
所以,
P
只能取
2
< br>,即
PSEL[1:0]=0b01;
(
F
CCLK
?
2
)
根据
F<
/p>
CCO
的范围可知,
P
< br>?
所以根据上述得:
PLLCFG = (1<<5) | (5)
;
这句话的意思是将
2
(
也就是
0b01
)向左移
5
位,也就是将
PESL
赋
值了,然后与
5
逻辑或,也就是将
0b
00101
赋值给
MSEL
了。
则系统时钟设置为:
2
#define
Fosc
11059200
;
晶振
10
MHz
;
#define
Fcclk (Fosc * 6)
;
p>
系统频率为
Fosc
的整数
M
倍
#define
Fcco (Fcclk*4)
;
cco
频率为
Fcclk
的
< br>2
?
P
倍
#define
Fpclk
(Fcclk/ 4)*1
;
VPB
分频,只能为
Fcclk/ 4
的
1
、
2
p>
、
4
倍
5
、引脚连接模块的配置
注意点:请各位同学注意
LPC2214
的引脚描述图
P97
【
1
】引脚选择寄存器共
3
个,每个
32
位,
PINSEL0
、
PINSEL1
、
PINSEL
2
其中每两位控制一个引脚(
如何
理解?
)
解释:
PINSEL0[1:0]<
/p>
表示该寄存器
1
位、
0
位控制
P0.0
口
其中
00
表
示
GPIO
的功能;
01
表示
TxD
(
UART0<
/p>
)的功能;
10
表示
PWM1
的功能;
11
保留
详细见表
P173-P174
所以
PINSEL0[31:0]<
/p>
控制
P0.0~P0.15
PINSEL1[31:0]
控制<
/p>
P0.16~P0.31
【
2
】例题
:将
P0.10
配置成
GPIO
,
P0.11
配置成
CTS
(
UART1
)
,如何配置?
解题分析思路:
①首先确定是
PINSEL0
还是
PINSEL1
来控制?这里是
PINSEL0
控制;
而且
P0.10
是
PINSEL0[21:20]
控制,
< br>P0.11
是
PINSEL0[23:22]
控制;
②再根据
P17
3
的表可得,
P0.10
的
GPIO
功能的值为
00
,
P0.11
的
CTS
功能值是
01
;
③
[23
:
22]
[21
:
20]
01
00
=4
,
0x04
<<
20
< br>(
0X00400000
)
这句话的意思是将这四位的值(也就是
0x00000004
)赋值
进去,因为该值是从第
20
开始的,
所以需要左移
20
,就变
成了(
0x00400
000
)
;
④最后写出引脚配置语句,
采用可先读寄存器值,然后按位进行逻辑“与”
、
“或”操作,再回写到
该寄存器。
也就是:
本题答案:
PINSEL0=
(
PINSEL0
& 0xFF0FFFFF
)
|
(
p>
0x04
<<
20
)
(本句的意思是,先读出
PINSEL0
的值,然后和
0xFF0FF
FFF
逻辑与,因为
PINSEL0
中
我们只需
要将要设置的
0100
赋值进
去,
不能改变其他值
,
原值
&1=
原值
,起到保护其他值的作用
[31
:
24]
[23:22][21:20]
[19
:
0]
二进制:
1111
1111
00
00
1111 1111 1111 1111 1111
十六进制:
FF
0
FFFFF
然后我们将要赋值的值左移
20
位,与原值逻辑或即可)<
/p>
。
6
、外部存储器的配置(
EMC
)
【
1
】系统有
4
个外部存储器组配置寄存器
BCFG0
BCFG1
BCFG2
BCFG3
描述见
P155
其中
PINSEL2[5:4]
为
BOOT[1:0],
也是
BCFGn[29:28],
表示控制数据总线的宽度
00
表示
8
位
01
表示
16
位
10<
/p>
表示
32
位
11
保留
寄存器的配置选项:
①
IDCY
:为防止总线竞争,存储器内部读
/
写访问间需间隔空闲时钟周
期(
1~ 16
个
cclk
)
;
②
WST1
:读访问长度(等待
+
操作:
3 ~
34
个
cclk
)
;
③
WST2
:写访问长度(等待
+
操作:
1 ~ 32
个
cclk
)
;
④
RBLE/MW
< br>:存储器组的总线宽度(
8/16/32
位)
;
3
⑤
WP
:存储器组写保护(
=1,
写保护)
。
【
2
】
16
位
宽存储器组连接
16
位
SRAM
芯片;
512KB
、
16
位数据宽度(或者问
MW=0b01
或者问
BOOT[1:0]=0b01
)
,请问如何接线?
P362
解题分析思路:
①首先
确定是
16
位数据总线宽度
,
那么将
LPC2200
中的
D0~D15
连接到
SRAM
上的
I/O0~I/O15
上。
②
512KB
是容量,决定地址总线的宽度,<
/p>
512
KB
?
2
B
,所以为
19
根地址总线,所以从
A0~A18
;
③又因为是
16
位数据宽度,
P
口只有
8
位输出,所
以
A0
为低位,不用接。
④所以实际接线为
A1~A18
接到
SRAM
的
A0~A17.
见以下接线图为答案。
19
7
、
VIC
向量中断
控制配置
【
1
】
VIC
控制寄存器分三个寄存器:
VICIntSelect
(中断选择寄存器)
、
VICIntEnable
(中断使能寄存器)
、<
/p>
VICIntEnClr
(中断使能清零寄存器)
P193~P194
①
VICIntSelect
(
中断选择寄存器)
:
为
32
位寄存器,
当某一位为
1
时,
表示该通道的中断设置为
FIQ
;
为
0
时,分配为
< br>IRQ
。
例:
VICIntSelect[14]=1
则通道
14
的
EINT0
中断设置为
FIQ
中断。
②
VICI
ntEnable
(中断使能寄存器)
:为
32
位寄存器,写入
1
时,对应通
道的中断使能,写入
0
时,
则对应通道
中断无效。
例:
VICIntEnable =
(
1<<14
)
;
即通道
14
(也就是
EINT0<
/p>
)中断使能;
③
VICIntEnClr
(中断使能清零寄存器)
:为
32
位寄存器,写入
1
时,对应通道的中断禁止,写入
0
时,则无效。
例:
VICIntEnClr
=
(
1<
<14
)
;
即通道
14
(也就是
EINT0
)中断禁
止;
注意:
19
个中断源对应的
VIC
通道号(同学们只需要了解加粗体的
几个中断源对应的通道号即可)
模块
标志
VIC
通道号
4
WDT
—
ARM
内核
ARM
内核
定时器
0
定时器
1
UART0
看门狗中断(
WDINT
)
保留给软件中断
EmbeddedICE,DbgCommRx
EmbeddedICE,DbgCommTx
匹配
0-3
(
MR0, MR1,
MR2, MR3
)
捕获
0-3
(
CR0, CR1,
CR2, CR3
)
匹配
0-3
(
MR0, MR1,
MR2, MR3
)
捕获
0-3
(
CR0, CR1,
CR2, CR3
)
Rx
线状态(
RLS
)
<
/p>
发送保持寄存器空(
THRE
)
Rx
数据可用(
R
DA
)
字符超时指示(
CTI
)
Rx
线状态(
RLS
)
<
/p>
发送保持寄存器空(
THRE
)
Rx
数据可用(
R
DA
)
字符超时指示(
CTI
)
匹配
0-6
(
MR0, MR1,
MR2, MR3, MR4, MR5, MR6
)
SI
(状态改变)
0
1
2
3
4
5
6
UART1
7
PWM0
I2C
I
SPI0
8
9
10
SPI
中断标志(
SPIF
)
模式错误(
MODF
)
SPI1
11
SPI
中断标志(
SPIF
)
模式错误(
MODF
)
PLL
12
PLL <
/p>
锁定(
PLOCK
)
RTC
13
计数器增加(<
/p>
RTCCIF
)
报警(
RTCALF
)
14
系统控制
外部中断
0
(
EINT0
)
15
系统控制
外部中断
1
(
EINT1
)
16
系统控制
外部中断
2
(
EINT2
)
17
系统控制
外部中断
3
(
EINT3
)
A/D
18
A/D
转换器
【
2
】
VIC
参数设置寄存器
P196
共有四类:
VICVectAddr
向量地址寄存器
(向量
IRQ
中断需要用到)
VIC
DefVectAddr
默认向量地址寄存器
(非向量
IRQ
中断需要用到)
VICVectAddr0~15
向
量地址寄存器
0~15
VIC
VectCntl0~15
向量控制寄存器
0~15
(见下表描述)
注意
:
0~15
的数字不是随机的,而是根据
slot0~15
来确定的,
slot
为优先级,
0
最大,
15
最小;
也就是说,当使用
slot0
时,用
VICV
ectC
ntl0
。
位
功能
31:6
保留
5
向量
IRQ
使能
4:0
分配给向量
IRQ
通道的中断请求或软件中断的编号
【
3
】中断
的寄存器配置
①若配置成
FIQ
< br>中断:
p>
第一步:先用
VICIntSelect
(
中断选择寄存器)选择
哪个通道
需要设置成
FIQ
中断
第二步:用
VICIntEnabl
e
(中断使能寄存器)将
该通道
中断使
能。
例
:设置
EINT0
中断为
FIQ
中断:
因为
EIN
T0
通道号为
14
,所以
VICIntSelect=
(
1<<14
)
;
VICIntEnable= (1<<14);
②若配
置成向量
IRQ
中断:
5
-
-
-
-
-
-
-
-
-
上一篇:LTE中连接态和空闲态的区别
下一篇:路灯控制器报告