ARM——精选推荐
- 格式:pdf
- 大小:233.21 KB
- 文档页数:4
1、ARM处理器具有8种基本寻址方式:1.寄存器寻址;2.立即寻址;3.寄存器移位寻址;4.寄存器间接寻址;5.基址寻址;6.多寄存器寻址;7.堆栈寻址;8.相对寻址。 2、实时操作系统的特点:实时性、可靠性和灵活性。从实时系统的应用特点来看实时操作系统可以
分为两种:一般实时操作系统和嵌入式实时操作系统。
3、以下代码是初始化外部中断0,用它来唤醒掉电的LPC2114,请填空。 PINSEL0= =0x00000000; PINSEL1= =(PINSEL1&0xFFFFFFFC) | 0x01;//设置I/O口连接,P0.16设置为EINT0 EXTMODE= =EXTMODE & 0x0E ; //设置EINT0为电平触发模式 EXTPOLAR= =EXTPOLAR & 0x0E; //设置EINT0为低电平触发 EXTWAKE= =EXTWAKE& 0x0E; //允许外部中断0唤醒掉电的CPU EXTINT= = 0x0F ; //清除外部中断标志
EXTMODE = EXTMODE | 0x01; //设置EINT0为边沿触发模式
EXTPOLAR = EXTPOLAR & 0x0E; //初始化EINT0为下降沿中断
4、使用NOP伪指令、比较指令、条件跳转指令等完成一个软件延时子程序,延时长度由R0寄存器的数值控制?
Delay NOP ;空操作
NOP
NOP SUBS R0,R0,#1 ;循环次数减一
BNE Delay ;如果循环未结束,跳转Delay继续 MOV PC,LR ;子程序返回
5、初始化串口0程序。设置为8位数据位,1位停止位,无奇偶校验,入口参数:bps 通讯波特率
void UART0Init(uint32 bps)
{ uint16 Fdiv; PINSEL0=(PINSEL0&(~0x0F))|0x05; //不影响其它管脚连接,设置I/O连接到UART0 U0LCR = 0x83; // DLAB = 1,可设置波特率
Fdiv = (Fpclk/16) / bps; // 设置波特率
U0DLM = Fdiv / 256;
U0DLL = Fdiv % 256;
U0LCR = 0x03; }
6、设计完成主模式I2C的初始化 Void I2C_init(uint32 fi2c) //传入参数为I2C时钟频率
{ if(fi2c > 400000)fi2c = 400000;//过滤传入参数,最高400K时钟频率
PINSEL0=(PINSEL0 & 0xFFFFFF0F)|0x50;//设置引脚连接模块(PINSEL0) I2SCLH=(Fpclk/fi2c+1)/2; //设置通信波特率(I2SCLH、I2SCLL)
I2SCLL=(Fpclk/fi2c)/2;
I2CONCLR= 0x2C; I2CONSET=0x40; //使能主I2C(I2CONSET)
VICIntSelect=0x00000000; VICVectCntl0=0x29; VICVectAddr0=(int)IRQ_I2C; //设置中断向量(VICxxx)
VICIntEnable = 0x0200;
}
7、下列程序语句完成什么操作,并在空格里说明程序中语句的作用?
答: ARM状态切换到Thumb状态。 AREA Example1,CODE,READONLY ;声明代码段Example1
ENTRY ;标识程序入口
CODE32 ;声明32位ARM指令
ARM_CODE
ADR R0,THUMB_CODE+1 BX R0 ; 跳转并切换处理器状态
CODE16 ;声明16位Thumb指令
THUMB_CODE
MOV R0,#10 ; R0 = 10
MOV R1,#20 ; R1 = 20 ADD R0,R1 ; R0 = R0+R1
B
END
8、初始化PWM2双边沿控制输出要求:设置PWM周期为Fpclk/FREQ,设置前沿在周期的1/5
处、设置后沿在周期的2/5处 Void PWM2Out(uint16 FREQ) /*输出频率,单位Hz*/
{ int32u Fpclk;
Fpclk=0x10000; PINSEL0&=0xFFFF3FFF; /*设置引脚连接模块连接PWM1输出*/
PINSEL0|=0x00008000; PWMPCR= 0x404; /*设置PWM2双边沿输出*/
PWMMCR= 0x02; /*MR0匹配后复位定时器*/
PWMPR= 0x00; /*设置预分频值为0*/
PWMMR0= Fpclk/FREQ; /*设置PWM周期*/
PWMMR1 = 0x2000; /*PWMMR0/5设置前沿在周期的1/5处*/ PWMMR2 = 0x4000; /*PWMMR1*2设置后沿在周期的2/5处*/ PWMLER = 0x07; /*使能PWM匹配锁存*/
PWMTCR = 0x09; /*使能PWM,启动定时器*/
}
9、初始化定时器0,要求:匹配寄存器为119999、产生中断,重置TC、定时器计数器0为4号中断
void timer0Init(void) {T0MR0=119999; /*匹配寄存器,120000-1,12000000为1秒*/
T0MCR = 3; /*产生中断,重置TC*/
T0TCR = 1; /*使能定时计数器0*/ VICVectAddr0=(unsigned long)timer0_ISR; /*设置中断向量*/
VICVectCntl0=0x20|4; /*定时器计数器0为4号中断*/
VICIntEnable = 0x00000010; /*开定时计数器0中断*/
}
10、μC/OS-II程序设计如下,在空格里说明程序中语句的作用 int main (void) { OSInit (); /*初始化μC/OS-II*/
OSTaskCreate (Task0,(void *)0, &Task0Stk[Task0StkLengh - 1], 4); /*创建Task0任务*/
OSStart (); /*启动μC/OS-II,任务开始运行*/
return 0;
} void Task0 (void *pdata)
{ pdata = pdata; /* 避免编译警告*/
TargetInit (); /*硬件初始化*/
OSTaskCreate (TaskLED1,(void *)0, &TaskLED1Stk[TaskLED1StkSize - 1], 5); /*创建LED1个任务*/ OSTaskCreate (TaskLED2,(void *)0, &TaskLED2Stk[TaskLED2StkSize - 1], 6); /*创建LED2个任务*/
while (1)
{ OSTimeDly(10); /*延时10个节拍*/
} }
#include "config.h"
#include"stdlib.h" #define LED1 (1<<14) /*定义LED */ #define TaskStkLengh 64 /* 定义用户任务LED的堆栈长度*/
OS_STK TaskLEDStk[TaskStkLengh]; /* 定义任务TaskLED的堆栈*/
void TaskLED(void *pdata); /*任务TaskLED1*/
int main (void)
{ OSInit (); OSTaskCreate (TaskLED,(void *)0, &TaskLEDStk[TaskStkLengh - 1], 3); /*创建LED任务*/
OSStart ();
return 0;
void TaskLED(void *pdata) { pdata = pdata; /* 避免编译警告*/ TargetInit (); /*硬件初始化*/
PINSEL0 &= ~(3<<(2*14)); /*P0.14 LED_RUN 设置成GPIO*/
IO0DIR|= LED1; /*设置LED1控制口为输出*/
while (1)
{ IO0CLR = LED1;
OSTimeDly(25);
IO0SET = LED1;
OSTimeDly(25);
} }
11、设计使用PWM6输出PWM信号, PWM周期69120,设置PWM占空比为50%
#include "config.h"
void TargetInit(void)
{ PWMPR=0x00; //不分频,计数频率为Fpclk
PWMMCR=0x02; //设置PWMMR0匹配时复位PWMTC
PWMMR0=69120; //设置PWM周期
PWMMR6=34560; //设置PWM占空比
PWMLER=0x41; //PWMMR0,PWMMR6锁存
PWMPCR=0x4000; //允许PWM6输出,单边PWM PWMTCR=0x09; //启动定时器,PWM使能
}
int main(void) { uint32 pwmdata; //PWM占空比控制变量
PINSEL0=0x00080000; //设置PWM6连接到P0.9引脚 PINSEL1=0x00000000; //其他引脚设置为GPIO
TargetInit(); //PWM初始化
pwmdata=34560;
while(1)
{ PWMMR0=69120; //设置PWM周期
PWMMR6=pwmdata; //设置PWM占空比
}
}
12、设计延迟蜂鸣器,要求使用LPC21××系列,P0.7引脚控制蜂鸣器,低电平蜂鸣 #include #define uint32 unsigned int /*定义uint32为无符号数*/
#define BEEPCON 0x00000080 /*P0.7引脚控制蜂鸣器,低电平蜂鸣*/
void DelayNS(uint32 dly)
{ uint32 i; for(; dly>0; dly--)
for(i=0; i<500; i++);
}
int main(void) { PINSEL0=0x00000000; /*设置引脚连接GPIO*/ IODIR0=BEEPCON; /*设置I/O为输出*/
while(1)
{ IOSET0=BEEPCON; /*BEEPCON=1*/
DelayNS(500);
IOCLR0=BEEPCON; /*BEEPCON=0*/ DelayNS(500);
}
return(0);
}