桂电信科嵌入式考试嵌入式复习提纲(总结)

更新时间:2023-03-14 09:36:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1. BX的使用并能分析BX的跳转过程 P51

在指令中指定了一个Rn寄存器(如R1),将Rn内容(内容为你指定的标号,我们程序代码分为ARM和Thumb,它们肯定是集中的写在一起,并且用标号来只是它是什么代码,这个时候就把标号的地址先存到Rn里面,作为Rn的内容,这个时候必须使用ADR指令来改变Rn内容,参考课本P52)复制到PC,同时使PC[0] = 0;把Rn[0]的值送CPSR的T位.如果Rn[0] = 1,则T = 1,将处理器状态转换成Thumb状态,把目标地址处的代码解释为Thumb代码;如果Rn[0] = 0,则T的0,将处理器状态转换成ARM状态,把目标地址出的代码解释为ARM代码.(处理器并不能有思维的理解到标号为ARM的或者Thumb的代码就是对应的代码,CPU只能读懂这一标号地址位的最低位bit[0]的值是什么来决定,接下来的代码是应该用什么状态来解释,P52的程序为什么有Goto_THUMB+1的原因是,S3C44B0是32位的处理器,一个字节就是8位,在ARM状态下每条指令就是4个字节(32位),在Thumb状态下每条指令就是2个字节(16位),那么对于存储空间来说,在ARM状态下指针一次跳转4个字节,所以地址的bit[1],bit[0]位是没意义的,因为不可能跳转到指令的中段,或则前后半段来读取指令,同理在Thumb状态下bit[0]也是没意义的,所以我们给出的标号在最低位肯定是0,我们在使用ADR命令时,要跳转到thumb状态下就对标号的地址加1,给CPU对Rn进行判断有了依据) 2. B与BL指令的区别 P52

B:分支指令,跳转到某个标号下,执行接下来的代码,类似于调用程序

BL:分支并且连接指令,同上,区别在于,在跳转前会保存BL指令所在地址的下一个地址,比如BL DELAY,这一指令的地址在0x0040,那么执行BL的同时,会把0x0044这一地址保存在LR(也就是R14)当中,这一过程是由CPU完成的,这样做是为了在调用程序后,能通过使用LR返回给PC回到调用程序之前的下一条地址(使用MOV

PC,LR),继续执行程序.进阶理解,PC的值在执行BL的时候,其实应为0x0048,P26有指令流水线,此时0x0040的指令在执行,0x0044的指令在被编译,而0x0048正在被取指,也就是此时PC真正指向的地址,在执行BL时,CPU自动执行PC – 4然后赋给LR,再跳转到DELAY中执行代码. 3. 立即数的正确表示方法

MOV R1,0xc3

要先理解桶形移位寄存器,可以想象为一个环状的32位数据, 0000 0000 0000 0000 0000 0000 1100 0011 一般不超过8位的都正确,当超过8 位时, 0000 0000 0000 0000 0000 1100 1100 0000

就看头尾两个1之间有多少个数,如上边的110011,之间有4位,只要是之间小于等于6位都是正确的.

1000 0000 0000 0000 0000 0000 0001 0011

既然是环状的,那么头尾应该是相连的,这个数的两个1之间可以理解为有30个数,也可以理解为1……10011→……….100111,之间是4个数,是正确的

韩老师说的,如果这32位数有0的个数不超过8个,并且头尾两个零之间的数不超过6个,也是正确的,如

1111 1111 0111 0000 1111 1111 1111 1111 也就是MOV R1,0xFF70FFFF 系统会解释为 MVN R1,0x008F0000,所以也是一个正确的数.

张老师还提了一个需要注意的地方,那就是,既然是一个桶形移位寄存器,那么肯定有移位的操作,在CPU中存放了一个移位的位数,这个位数是有提供的立即数决定的,比如0xFF00最后一个1在8位(bit8,最低位为bit0,不要忘记),要对0xFF移位8次得到,此时存储的位数其实是4,然后进行移位时是利用4*2得到8来进行以为的,而

0x688=0110 1000 1000,看起来是一个正确的数,但最后一个1在第3位,无法被2整除,所以这是一个不合法的立即数.

如果要输入2进制的立即数,不能使用以前的方法 #0011B来实现,要使用#2_0011格式才是正确的2进制数的格式.

4. 数据的大小端存放模式的区别,并能应用画图表示.

存储数据为0x12345678,是一个32位的2进制数,回忆知识:存储数据是用4个字节来存储的,所以占用四个地址! 小端模式:低位地址存储低位数据 地址 内容 0x0040 78 0x0041 56 0x0042 34 0x0043 12 大端模式:记了小端还用记大端吗? 地址 内容 0x0040 12 0x0041 34 0x0042 56 0x0043 78 5. 时钟计算 a) PLL时钟

公式 :Fpllo=错误!未找到引用源。

M=主分频控制值[7:0]+8,P=预分频控制值[5:0]+2,S=后分频控制器[1:0] P214程序

LDR R0,PLLCON

LDR R1,=((M_DIV<<12)+(P_DIV<<4)+S_DIV) STR R1,[R0]

M_DIV = 0x34 = 11 0100, M_DIV<<12 = 11 0100 0000 0000 0000 P_DIV = 0x3 = 0011,P_DIV<<4 = 0011 0000 S_DIV = 0x1 = 0001

(M_DIV<<12)+(P_DIV<<4)+S_DIV = 11 0100 0000 0011 0001 对应P212的PLL控制器PLLCON,要理解这样赋值的好处.

最后,要使定义的Fpllo在对应的模块生效,要配置P212的CLKCON控制器. b) PWM定时器(最好看看P251图9.1理解几个分频分别在哪个”时段”开始工作)

公式:定时器输入时钟频率=MCLK/(prescaler+1)/(divider值) MCLK:如果没进行PLL时钟的配置修改,就是晶振,实验室是60M Prescaler预分频器=0~255.P251 图9.1中的8位预分频器值 Divider时钟分频器=2,4,8,16,32.P251 图9.1中的时钟分频器值 能否参照上面的赋值方法对TCFG0,TCFG1(P256)进行赋值? Prescaler与Divider是怎么共用的?P250 第二段内容.

6. 存储器的链接P181 例5.1,P182例5.2,背下来吧,理解管脚最好. 7. I/O口的使用方法

只考PA和PE口,P239表8.8,P240表8.9,8.10,P243表8.23,8.24,8.25,最好记下Rester值.

8. PWM定时器的使用方法

计算参考5-b)

工作流程:P252图9.2中

如何启动定时器:设置好TCNTBn(n=0~5)(定时器n计数缓冲寄存器,也就是计时初值,TCNTn(少了一个B)是内部寄存器名,自减的数在这个寄存器内进行),TCMPBn(定时器0比较缓冲寄存器,内部寄存器TCMPn(少了一个B)用来与TCNTn中的计数做比较,当TCMPn =>TCNTn输出高电平[反相器OFF状态下,为缺省状态]),然后选择自动重载,最后使用手动更新,此时定时器就完成了启动,然后就可以设置最终想要的TCNTBn, TCMPBn(因为之前的只是用来启动定时器而设置的,当然也可以一开始就设置好,不冲突),打开自动重载,关闭手动更新位,就完成了定时器的启动.为什么手动更新启动了定时器以后可以直接赋值修改TCNTBn, TCMPBn?因为PWM定时器有双缓冲特点,这个特点使得它能够改变用于下次定时器操作的重载值,而不必停止当前定时器操作(P252),为什么需要手动更新来启动定时器?因为在最初时,没有定义TCNTn初始值,在这种情况下必须设定手动更新为装入初始值. 启动一个定时器次序

a) 写初值到TCNTBn和TCMPBn.

b) 设置对应定时器手动更新为,配置反相器on/off位

c) 设置对应定时器启动位,启动定时器工作(同时,清楚手动更新位) TCFG0:定时器配置寄存器0,用来配置预分频等 TCFG1:定时器配置寄存器1,用来配置时钟分频

TCON:用来配置自动重载,手动更新,启动,输出反相器等

观察寄存器TCNTOn能观察到TCNTn的值,因为TCNTn里的值不能直接看到,观察寄存器常在用来做查询等操作. 9. UART的使用 P265 10.

波特率时钟的计算:课本P265例题UBRDIVn[15:0]=(int)(MCLK/波特率*16+0.5)-1是计算波特率分频系数的,因为参照P272的程序可以知道,输入想要的波特率,然后由CPU来帮你计算波特率分频系数更方便. UBRDIVn=(int)(MCLK/(波特率*16)+0.5)-1

公式中,MCLK为时钟频率,+0.5的意义在于,人为的为程序加入四舍五入的功能,使结果更精确,例如计算结果为2.9,在C语言的学习中我们知道,利用(int)强制转换,是直接会把浮点型转换为整型,并且舍弃小数位,这样得到的结果就是2,不能实现四舍五入的功能,有一定的精度损失,那么如果计算结果加上0.5之后,就变成了3.4,强制转换为整型后结果为3.同理2.4就算加上0.5为2.9,强制转换也为2,所以实现了所需要的功能.

11. IIC总线的接口,开始停止条件

IIC总线的中文名称:内部集成电路总线.

IIC总线仅有两条信号先:SDA是数据信号线,SCL是时钟信号线, 与IIC总线连接的设备,使用集电极/漏极开路门电路(OC门)

当SCL稳定在高电平,SDA从高电平变到低电平,能够作为开始条件;而SDA从低电平变到高电平能作为停止条件,开始和停止条件总是由主设备产生.

IIC总线接口有4种操作方式:主/发送or接收方式,从/发送or接收方式. 12. 绝对值的求解P61 例3.5

TEQ,RSB,ADD指令的意义P55 MI条件码的意义P48

13. 乘法与移位之间的转换 P61 例3.6

如果R1低于9,则R2=R0*8 如果R1等于9,则R2=R0*9 如果R1大于9,则R2=R0*10

由题目可以知道,无论R1的数值为多少,一定至少要R0乘与8,所以程序第一条 MOV R2,R0,LSL #3 ;就先使得R2=R0*8

然后比较R1与9,CMP指令影响标志位,影响的是所有标志位,CMP的实质是R1-9,如果结果为正数且结果大于等于0,则C=1(在减法中,如果没产生借位,C=1,在加法中,如果产生进位C=1) ADDCS R2,R2,R0 ;CS表示C=1时执行次指令,此时R1肯定不小于9,所以再加上一个R0,得到R2=R0*8+R0=R0*9. ADDHI R2,R2,R0 ;HI表示C=1且Z=0(只要是影响标志位的指令,并且计算结果全为0,Z就被置1,即如果CMP指令执行时,得到结果为0,那么C=1,Z=0). 整个程序都是先完成肯定可以执行的步骤,然后再判断是否再继续加(即乘上去). 14. 块数据传送指令的使用

LDM指令从存储器装入数据到寄存器; STM指令保存寄存器内容到存储器.

理解P76~P77的土3.21~3.24其中减量寻址中.可以这样理解,(非常不确定,等有机会问老师)由于数据都是从低位开始存储的,后索引即先确定好了R6的位置,然后开始对应放置,而先索引寻址也是,先减一,确定了R6的位置后,开始对应防止R4,R2. F满堆栈:堆栈指针指向栈中最后一项.(先SP+1后存入,也就是B先索引)

E空堆栈:堆栈指针指向栈中下一个可用空间.(先存入后SP+1,也就是A后索引) I递增:STM指令使堆栈向存储器地址增大方向生长. D递减:STM指令使堆栈向存储器地址减小方向生长. 递增或递减方式的地址修改偏移量为4. 表3.5,3.6

程序参考P79的使用举例以及例3.13,至少以上概念要理解清楚. 15. 汇编子程序的编写

学会BL以及MOV PC,LR就差不多了吧..

本文来源:https://www.bwwdw.com/article/ubvx.html

Top