当前位置:文档之家› 嵌入式系统复习笔记

嵌入式系统复习笔记

嵌入式系统复习笔记-----增哥注意点:本复习指导基本已包括所有的程序设计以及分析题,每个考点后面均有例题,例题前的所有知识点我已经把他写的尽量通俗易懂,把程序分析的方法也写明,希望大家用几个小时时间来看看,通过考试绝对没有问题!PS:本材料后面所写的参考页码均是以新版书为标准,用旧版书的同学麻烦自己写上旧版书的页码,知识点都是一样的!!!本人能力有限,如有错误,请见谅!!1、状态寄存器CPSR各bit的意义:各位同学只需了解控制位bit0~bit7T:为状态:0表示ARM状态,1表示Thumb状态I、F表示IRQ中断FIQ中断的使能。

1时中断禁止,0时中断使能(允许该中断)。

2、三个特殊用途寄存器SP(R13) LR(R14) PC(R15)R13(SP):堆栈指针,保存当前处理器模式的堆栈栈顶。

R14(LR):链接R,保存子程序(含发生异常)的返回地址。

R15(PC):程序计数器,保存下一条指令的地址。

注意点:PC指针永远指向取值(什么意思?见第3点流水线)3、ARM7的流水线采用三级流水线,即取指→译码→执行例:假设一共有三条指令:0x4000 ADD PC,PC,#4 ;其中第二个PC指针的值为0x4008,将第二个PC+4=0x400C赋给第一个PC指针(回答上述PC指针永远指向取值的问题)0x4004 SUB0x4008 CMP那么CPU实际执行为:周期取指译码执行T1 ADDT2 SUB ADDT3 CMP SUB ADD解释:当第一CPU周期T1时先取址,取第一个指令的地址。

当第二CPU周期T2时取第二个指令的地址,然后译码,译的是第一个指令的码当第三CPU周期T3时取第三个指令的地址,译第二个指令的码,执行第一个指令所以:PC值=当前程序执行位置+8字节(如果CPSR中的T位为0,则+8;如果T位为1,则+4)4、PLL频率的计算(P133)PLLCFG[4:0]为MSEL[4:0],存放的是PLL 倍频器值(即M 值); 例:MSEL[4:0]=00101 则表示5,M=5+1=6PLLCFG[6:5]为PSEL[1:0],存放的是PLL 的分频器值(即P 值;) 例:PSEL[1:0]=00 则表示P=1 01 则表示P=2 10 则表示P=4 11 则表示P=8 PLL 频率公式:)2()2(P F F M P F F C C L K CCO OSC CCO ⨯⨯=⨯⨯⨯=注意点:CCO F 的范围为156~320MHZ ;例题:晶振的频率为10MHZ ,需要输出的系统时钟为60MHZ ,请问如何配置? 答:OSC F =10MHZ ,所以6==OSCCCLKF F M ,所以 M-1=5,所以MSEL[4:0]=0b00101; 根据CCO F 的范围可知,)2(⨯=CCLK CCOF F P 所以,P 只能取2,即PSEL[1:0]=0b01;所以根据上述得:PLLCFG = (1<<5) | (5) ;这句话的意思是将2(也就是0b01)向左移5位,也就是将PESL 赋值了,然后与5逻辑或,也就是将0b00101赋值给MSEL 了。

则系统时钟设置为:#define Fosc 11059200 ; 晶振10MHz ;#define Fcclk (Fosc * 6) ; 系统频率为Fosc 的整数M 倍#define Fcco (Fcclk*4) ;cco频率为Fcclk的2 P倍#define Fpclk (Fcclk/ 4)*1 ;VPB分频,只能为Fcclk/ 4的1、2、4倍5、引脚连接模块的配置注意点:请各位同学注意LPC2214的引脚描述图P97【1】引脚选择寄存器共3个,每个32位,PINSEL0、PINSEL1、PINSEL2其中每两位控制一个引脚(如何理解?)解释:PINSEL0[1:0]表示该寄存器1位、0位控制P0.0口其中00表示GPIO的功能;01表示TxD(UART0)的功能;10表示PWM1的功能;11保留详细见表P173-P174所以PINSEL0[31:0]控制P0.0~P0.15 PINSEL1[31:0]控制P0.16~P0.31【2】例题:将P0.10配置成GPIO,P0.11配置成CTS(UART1),如何配置?解题分析思路:①首先确定是PINSEL0还是PINSEL1来控制?这里是PINSEL0控制;而且P0.10是PINSEL0[21:20]控制,P0.11是PINSEL0[23:22]控制;②再根据P173的表可得,P0.10的GPIO功能的值为00,P0.11的CTS功能值是01;③[23:22] [21:20]01 00 =4 ,0x04<<20 (0X00400000)这句话的意思是将这四位的值(也就是0x00000004)赋值进去,因为该值是从第20开始的,所以需要左移20,就变成了(0x00400000);④最后写出引脚配置语句,采用可先读寄存器值,然后按位进行逻辑“与”、“或”操作,再回写到该寄存器。

也就是:本题答案:PINSEL0=(PINSEL0 & 0xFF0FFFFF)|(0x04<<20)(本句的意思是,先读出PINSEL0的值,然后和0xFF0FFFFF逻辑与,因为PINSEL0中我们只需要将要设置的0100赋值进去,不能改变其他值,原值&1=原值,起到保护其他值的作用[31 : 24] [23:22][21:20] [19 : 0]二进制:1111 1111 00 00 1111 1111 1111 1111 1111十六进制:FF 0 FFFFF然后我们将要赋值的值左移20位,与原值逻辑或即可)。

6、外部存储器的配置(EMC)【1】系统有4个外部存储器组配置寄存器BCFG0 BCFG1 BCFG2 BCFG3 描述见P155其中PINSEL2[5:4]为BOOT[1:0],也是BCFGn[29:28],表示控制数据总线的宽度00 表示8位01 表示16位10表示32位11保留寄存器的配置选项:①IDCY:为防止总线竞争,存储器内部读/写访问间需间隔空闲时钟周期(1~ 16个cclk);②WST1:读访问长度(等待+操作:3 ~ 34个cclk);③WST2:写访问长度(等待+操作:1 ~ 32个cclk);④RBLE/MW:存储器组的总线宽度(8/16/32位);⑤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 是容量,决定地址总线的宽度,B KB 192512 ,所以为19根地址总线,所以从A0~A18; ③又因为是16位数据宽度,P 口只有8位输出,所以A0为低位,不用接。

④所以实际接线为A1~A18接到SRAM 的A0~A17.见以下接线图为答案。

7、VIC 向量中断控制配置【1】VIC 控制寄存器分三个寄存器:VICIntSelect (中断选择寄存器)、VICIntEnable (中断使能寄存器)、VICIntEnClr (中断使能清零寄存器) P193~P194①VICIntSelect (中断选择寄存器):为32位寄存器,当某一位为1时,表示该通道的中断设置为FIQ ;为0时,分配为IRQ 。

例:VICIntSelect[14]=1 则通道14的EINT0中断设置为FIQ 中断。

②VICIntEnable (中断使能寄存器):为32位寄存器,写入1时,对应通道的中断使能,写入0时,则对应通道中断无效。

例:VICIntEnable = (1<<14);即通道14(也就是EINT0)中断使能; ③VICIntEnClr (中断使能清零寄存器):为32位寄存器,写入1时,对应通道的中断禁止,写入0时,则无效。

例:VICIntEnClr = (1<<14);即通道14(也就是EINT0)中断禁止;P196共有四类:VICVectAddr向量地址寄存器(向量IRQ中断需要用到)VICDefVectAddr默认向量地址寄存器(非向量IRQ中断需要用到)VICVectAddr0~15向量地址寄存器0~15VICVectCntl0~15向量控制寄存器0~15(见下表描述)注意:0~15的数字不是随机的,而是根据slot0~15来确定的,slot为优先级,0最大,15最小;【3】中断的寄存器配置①若配置成FIQ中断:第一步:先用VICIntSelect(中断选择寄存器)选择哪个通道需要设置成FIQ中断第二步:用VICIntEnable(中断使能寄存器)将该通道中断使能。

例:设置EINT0中断为FIQ中断:因为EINT0通道号为14,所以VICIntSelect=(1<<14);VICIntEnable= (1<<14);②若配置成向量IRQ中断:第一步:先用VICIntSelect(中断选择寄存器)选择哪个通道需要设置成IRQ中断第二步:用VICVectCntl0~15(向量控制寄存器0~15)对向量中断进行设置。

第三步:将中断服务地址赋值给VICVectAddr0~15(向量地址寄存器0~15)。

第四步:将用VICIntEnable(中断使能寄存器)将该通道中断使能。

例:设置定时器0中断为向量IRQ中断,分配为slot0,中断服务地址为Timer0_ISR:因为定时器0通道号为4号,所以VICIntSelect = ~(1<<4);VICV ectCntl0 = 0x24 ; 0010 0100 根据上表,可得VICV ectCntl0[5]=1, VICV ectCntl0[4:0]=4VICV ectAddr0 = (unsigned int)Timer0_ISR;VICIntEnable = (1<<4);③若配置成非向量IRQ中断:第一步:先用VICIntSelect(中断选择寄存器)选择哪个通道需要设置成IRQ中断第二步:将非向量中断服务地址赋给VICDefVectAddr(默认向量地址寄存器)第三步:用VICIntEnable(中断使能寄存器)将该通道中断使能。

例:将EINT0设置成非向量中断,中断服务程序地址为Eint0_ISR:VICIntSelect = ~(1<<14);VICDefV ectAddr = (unsigned int) Eint0_ISR;VICIntEnable = (1<<14);【4】综合题型:例:将如下中断进行如下配置EINT0:FIQ 、EINT1:向量IRQ 、EINT2:非向量IRQ,如何配置?答:VICIntSelect = 0x00004000 0100 0000 0000 0000; EINT0(中断源14)=FIQ,其它IRQVICV ectCntl 0 = 0x20|15 0010 0000 =0010 1111; EINT1为向量IRQ,使用slot0;VICV ectCntl0[5]=1, IRQ使能; VICV ectCntl 0[4:0]=15,中断源EINT1编号VICV ectAddr0 = (uint32)Eint1_IRQ ; EINT1中服地址VICDefV ectAddr = (uint32)Eint2_IRQ ; EINT2为非向量IRQVICIntEnable = 0x0001C000 0001 1100 0000 0000 0000 ;使能EINT0~2, 16 15 148、外部中断初始化配置【1】外部中断寄存器P214~216共有四个:EXTINT(外部中断标志寄存器):包含EINT0、EINT1、EINT2、EINT3四个中断标志。

相关主题