目的的处理器。 分为:嵌入式微处理器,微控制器,DSP处理器,片上系统。 2、 什么是嵌入式操作系统?常用的嵌入式操作系统有哪些?
嵌入式操作系统,是一种用途广泛的系统软件,
常用的嵌入式操作系统:Clinux? Windows CE VxWorks IIOSC?/? 3、 ARM7TDMI中的T、D、M、I的含义是什么?
T:Thumb指令集扩展,D:支持片上调试,M:增加了64位乘法指令,I:Embedded ICE硬件仿真功能模块
4、ARM7TDMI采用几级流水线?使用何种存储器编址方式?
采用三级流水线,使用冯·诺依曼结构,支持字节(8位)半字(16位)和字(32位)。 5、列举ARM的处理器模式和状态。 ARM处理器模式:【用户模式usr】、特权模式(【系统模式sys】、异常模式(【管理模式svc】、【终止模式abt】、【未定义模式und】、【中断模式irq】、【快中断模式fiq】))。ARM处理器状态为:ARM状态和Thunb状态。
6、ARM处理器模式和ARM处理器状态有何区别?
两个处理器状态之间的切换不影响处理器模式或寄存器内容, 7、PC和LR分别使用哪个寄存器?
PC(程序计数器)使用 R15寄存器,LR(连接寄存器)使用R14寄存器 8、R13寄存器的通用功能是什么? R13的通用功能是堆栈指针
9、写出最小系统的定义,并画出最小系统原理框图。
提供嵌入式处理器运行所必须的条件的电路与嵌入式处理器共同构成了这个嵌入式处理器的最小系统。
10、嵌入式系统项目开发的生命周期分哪几个阶段?各自的具体任务是什么?
识别需求、提出方案、执行项目、结束项目; 识别需求:风险分析和定制系统规范 提出方案:系统规划与设计
执行项目:系统的实现和系统的测试 结束项目:售后服务和项目讨论
11、LPC2000系列ARM7微控制器具有哪两种低功耗模式?如何降低系统功耗(5分)。 空闲模式和掉电模式。在空闲模式下,处理器停止执行指令,在掉电模式下,振荡器关闭,这样芯片没有任何内部时钟。除了控制处理器和系统时钟外,LPC2000系列ARM还允许程序对某个外设进行关闭控制。
12、简述LPC微控制器UART0波特率计算公式和设置何种寄存器参数(5分)。
设置UART通信波特率,就是设置寄存器UnDLL和UnDLM的值,UnDLL和UnDLM寄存器是波特率发生器的除数锁存寄存器,用于设置合适的串口波特率。寄存器UnDLL与UnRBR/UnTHR、UnDLM与UnIER具有同样的地址,如果要访问UnDLL和UnDLM,除
数访问位DLAB必须为1。寄存器UnDLL和UnDLM的计算公式如下:
13、何为系统规范?制定系统规范的目的是什么?
目的是将客户的需求,由模糊的描述转换成有意义的量化数据 14、何谓系统规划?为何要做系统规划? 系统规划就是拟定一个开发进程,使项目在合理的进程范围中逐渐构建完成。其目的是让客户可以进一步地掌握系统开发的进程,并确定检查点,以让双方确定项目是否如预期中的进度完成
15、简述用户代码是否有效的方法。 16、简述芯片是否加密? 17、简述指令的寻址方式并举例。
18、写出中断向量表并简述用户代码有效判别方案。 19、简介WINDOWS环境ARM开发工具和方法。
20、简介LINUX 环境ARM开发工具和方法。
编程设计
状态切换
从ARM状态切换到Thumb状态 从Thumb状态切换到ARM状态
CODE32 CODE16 LDR R0,=LABEI+1 LDR R0,=LABEL BX R0 BX R0 CODE16 CODE32 LABEL MOV R1,#12 LABEL MOV R1,#10
寄存器加法
END AREA Example,CODE,READONLY ENTRY 使能IRQ中断 CODE32 ENABLE_IRQ START MOV R0,#0 MRS R0,CPSR MOV R1,#10 BIC R0,R0,#0X80 LOOP BL ADD_SUB MSR CPSR_C,R0 B LOOP MOV PC,LR ADD_SUB ADDS R0,R0,R1 禁止IRQ中断 MOV PC,LR DISABLE_IRQ
MRS R0,CPSR ORR R0,R0,#0X80
禁止FIQ 中断 FIQEnable
MRS R0,SPSR ORR r0,r0,#0x40 MSR SPSR_C,R0 MOVS PC,LR
延时子程序 DELAY1 NOP NOP NOP SUBS R1,R1,#1 BNE DELAY1 1
PLL配置函数
Uint8 PPLSet(uint32 Fcclk,uint32 Fosc uint32 Fcco) {
Uint8 i;
Uint32 plldat; i=(Fcco/Fcclk); switch(i) { case 2:
plldat=((Fcclk/Fosc)-1)!(0<<5); break; case 4:
plldat=((Fcclk/Fosc)-1)!(1<<5);
break; case 8:
plldat=((Fcclk/Fosc)-1)!(2<<5); break;
VPB设置函数代码
Oid VPB(uint32 Fcclk, uint32 Fpclk) {
Uint8 I;
MSR CPSR_C,R0 MOV PC,LR
使能FIQ中断 FIQEnable
MRS R0,SPSR BIC R0,R0,0X40 MSR SPSR_C,R0 MOVS PC,LR
case 16:
plldat=((Fcclk/Fosc)-1)!(30<<5); break; default:
return(FALSE); break; }
PLLCON=1; PLLCFG=plldat; PLLFEED=0xaa; PLLFEED=0x55;
While((PLLSTAT & (1<<10))==0); PLLCON=3; PLLFEED=0xaa; PLLFEED=0x55; Return(TRUE); }
If(Fpclk/(Fcclk/4))==1){ VPBDIV=0; } Else
If(Fpclk/(Fcclk/4))==2){ VPBDIV=2; } Else 2
MAM部件配置函数
Viod MAMSet(uint32 Fcclk) {
MAMCR=0;
IF (Fcclk<20000000 {
MAMTIM=1; } Else
IF (Fcclk<40000000
If(Fpclk/(Fcclk/4))==4){ VPBDIV=1; } }
{
MAMTIM=2; } Else {
MAMTIM=1; }
MAMCR=2; )
2
Int main(viod) {
PINSEL0=0X00000000; IO0DIR=BEEPCON; While(1) {
IO0SET=BEEPCON; Delayns(10);
IO0CLR=BEEPCON; Delayns(10); }
RETURN(0); }
使用GPIO控制蜂鸣器,设计电路图及程序.
#include “config.h”
#define BEEPCON 0x00000080
Viod DelayNS(uint32 dly) {
Uint32 I;
For(;dly>0;dly--)
For(i=0;i<5000;i++); }
用按键控制蜂鸣器,设计电路和程序。
#include “config.h”
#define BEEPCON 0X00000080
#DEFINE PIN_P014 0X00004000 Int main(viod) {
Uint32 I;
Pinsel0=0x00000000; Io0dir=beepcon; WHILE(1) { If ((io0pin&PIN_P014)!=0) IO0SET=BEEPCON;
Else IO0CLR=BEEPCON; For(i=0;i<1000;i++); }
Return(0); } 3
LPC2000异常向量表
CODE32
AREA vectors,CODE,READONLY ENTRY 4
写出EINT0低电平中断初始化程序。 PINSEL1=(PINSEL1 & 0Xfffffffc)!ox01; EXTMODE=EXTMODE & 0X0E; EXTPOLAR=EXTPOLAR &0X0E;
VICINTSelect=VICIntSelect & (~(1<<14)); VICVectCntl0=0X20!14;
VICVextAddr0=(uint32)EINT0_ISR VIVIntEnable=(1<<14)
写出EINT0下降沿中断初始化程序。 PINSEL1=(PINSEL1 & 0Xfffffffc)!ox01; EXTMODE=EXTMODE & 0X01; EXTPOLAR=EXTPOLAR &0X0E; 5
写出定时器0定时中断初始化程序。 Viod Time0Init(viod) {
T0TC=0; T0PR=0;
T0MCR=0X03;
RESET
LDR PC,ResetAddr LDR PC,UndefinedAddr LDR PC,SWI_tAddr LDR PC,prefetchAddr LDR PC,dataAbortAddr DCD 0xb9205f80 LDR PC,[PC,#0xff0] LDR PC,FIQ_Addr ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_tAddr DCD SoftwareInterrupt prefetchAddr DCD PrefetchAbort dataAbortAddr DCD dataAbort nouse DCD 0 IRQ_ADDR DCD 0
FIQ_Addr DCD FIQ_Handler
T0MR0=Fpclk/100, T0TCR=0X01;
VICIntSelect= VICIntSelect &(~(1<<4)); VICVectCntl0=0X02!4;
VICVectAddr0=(UINT32) Timer0_ISR; VICIntEable=(1<<4); }
写出定时器匹配输出初始化程序。 Viod Time0Init1(viod) {
T0TC=0; T0PR=0;
T0MCR=0X10; T0EMR=0XC0;
T0MR1=Fpclk/2000; T0TCR=0X01; }