ARM 练习题
1.描述ARM处理器对异常中断的响应过程。
2.写一个IRQ中断异常处理程序示例,要求允许嵌套IRQ中断发生。(注意:该IRQ中断
可能是在执行另一个IRQ中断异常服务程序时发生。)
3.简单描述一下ARM7的三级流水线,并说明其对程序设计的影响。
4.阅读下面这段代码,并回答以下问题,存储器初始的数据见表1。
LDR R0, =(0x12345670)
LDR R1, [R0, #4]!
STR R1, [R0, #4]
LDMDB R0!, {R2, R3}
表 1
执行完上述代码段后,
R0 = 0x__________
R1 = 0x__________
R2 = 0x__________
R3 = 0x__________
上述代码段中的STR指令是对哪一个存储单元进行操作的?操作后,在该存储单元里的数据是什么?
5.寄存器R1里放的数值是0x1,请问执行下面这一段代码后,寄存器R1里的内容是多少?
CPSR的高4位是什么内容?解释为什么。
LDR R0, Label2
STR R0, Label1
Label1
SUBS R1, R1, #1
Label2
ADDS R1, R1, #1
STR R0, Label3
NOP
NOP
Label3
SUBS R1, R1, #1
6.写一个对应下面C语言中的if-then-else功能的ARM代码段。
int gcd(int a, int b)
{ while (a!=b)
if (a>b)
a=a-b;
else
b=b-a;
return a;
}
7.启动代码中,异常向量表的定义如下
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xB9205F80
LDR PC, [PC, # -0xFF0]
LDR PC, FIQ_Addr
(a) 在异常向量表的定义中,为什么使用LDR指令跳转,而不使用B指令跳转?
(b) 在异常向量表的定义中,语句“DCD 0xB9205F80”起什么作用?
(c) 在异常向量表的定义中,对应IRQ中断的入口为什么使用“LDR PC, [PC, # -0xFF0]”这一条指令,解释原因?
8.编写一段蜂鸣器程序(要求有注释),实现由GPIO的P0.7管脚控制蜂鸣器周期性的蜂
鸣,其流程图如下
9.将8位无符号整数变量Data的值输出到P0.0 ~ P0.7,使用IOxPIN来实现,编写相应代
码并要求加注释。
10.外部中断唤醒掉电设计:以下代码是初始化外部中断0,用它来唤醒掉电的LPC2114,
请补充代码
PINSEL0 = 0X00000000;
PINSEL1 = ___________; //设置I/O口连接,P0.16设置为EINT0 EXTMODE = __________; //设置EINT0为电平触发模式
EXTPOLAR = __________; //设置EINT0为低电平触发
EXTWAKE = ___________; //允许外部中断0唤醒掉电的CPU
EXTINT = ___________; //清除外部中断标志
11.计算PLL设置值:假设有一个基于LPC2114的系统,所使用的晶振为11.0592MHz石
英晶振。请计算出最大的系统时钟cclk 频率为多少MHz?此时PLL的M值和P值各为多少?请列出计算公式,并编写设置PLL的程序段。
13.对哪些区域的访问会产生数据终止异常,对哪些区域访问会产生预取指中止异常?什么
时刻会真正产生预取指中止?
14.向量IRQ和非向量IRQ中断的区别和各自的特点?
15.简要说明UART的基本操作方法及流程。
16.编写UART0通信程序(包括所有必要的初始化代码),要求采用向量中断的方式(最高
优先级),从上位机接收数据。设置为6位数据位,2位停止位,奇偶校验选择为偶数,串口通信波特率为115200bps,使能FIFO,并设置触发点为14个字符。这里嵌入式系统的处理器时钟频率为Fcclk,外设时钟频率为Fpclk。(注:要求每行代码加注释)
17.下面是一段uart0通信实验程序(中断方式)主函数的代码,请解释其中划线部分程序的意
思。
int main (void)
{
PINSEL0 = 0x00000005; ________________________________
UART0_INIT(115200, set); // 串口初始化
U0FCR = 0x81; ________________________________
U0IER = 0x01; ________________________________
irqenable(); // 使能IRQ中断
VICINTSELECT = 0x00000000; ________________________________ VICVECTCNTL0 = 0x20 | 0x06; ________________________________ VICVECTADDR0 = (uint32)irq_uart0; ________________________________ VICINTENABLE = 1
}
18.编写代码实现以下功能:
(a) 设置为主模式;
(b) 设置为从模式;
(c) 设置总线频率为fi2c;
(d) 设置中断允许。
19.完成子函数I2C_writeNByte( )实现向从器件写入N字节数据。另外,完成I2C中断服务
程序中作为主机模式发送数据的相应状态的处理代码。
20.使用LPC2131的SPI接口作为主机向74HC595发送数据:要求P0.29连接74HC595的
片选引脚(该引脚为低电平有效),设置合理的时钟分频,并要求数据在SCK的第一个时钟沿采样,SCK为低有效,数据传输MSB在先,禁止SPI中断。完成编写main()主函数,MSPI_Init( )初始化函数,以及MSPI_SendData( )向SPI总线发送数据函数。
21.用定时器0实现1秒定时,使用中断方式实现定时控制,让蜂鸣器每秒钟蜂鸣一次。编
写主程序及中断服务程序。
22.使用定时器1的输入捕获功能,获取延时参数,用于控制LED1的闪烁频率。程序首先
设置P0.17引脚连接CAP1.2,同时设置LED1控制口输出,再通过T1CCR设置CAP1.2为下降沿捕获,最后启动定时器。程序读取捕获的值,用作延时参数,控制LED1闪烁。
(注:delay子程序已经提供,请完成主程序部分并注释。)
#include “config.h”
const uint32 LED1 = 1 <<18; //P1.18控制LED1,低电平点亮
/*********************************************************
void delay(uint32 dly)
{ uint32 i;
for ( ; dly>0; dly-- )
for (i=0; i<10; i++);
}
**********************************************************/
int main (void)
{
}
23.匹配寄存器值为
MR0 =100
MR1 =41、MR2 = 78 (PWM2 输出)
MR3 =53 、MR4 = 27 (PWM4输出)
MR5 =65 (PWM5输出)
请分别画出PWM2,PWM4,PWM5的输出波形(单个周期)。
24.阅读下面代码,回答问题。
# include “config.h”
# define CYCLE_DATA 2000
# define DUTY_CYCLE_DATA 1000
int main(void)
{
PINSEL0 = 0x00080000;
PWMPR = 0x00;
PWMMCR = 0x02;
PWMMR0 = CYCLE_DATA;
PWMMR6 = DUTY_CYCLE_DA TA;
PWMLER =0x41;
PWMPCR = 0x4000;
PWMTCR = 0x09;
while(1);
return(0);
}
(a)画出PWM输出波形。
(b)若需要输出双边沿控制PWM信号,应如何修改程序?
(c)更改了匹配寄存器的值并置位PWMLER的相应位,新匹配值是否立即生效?
25.设置P0.30连接AD0.3,对AD0.3进行电压采样,进行AD转换,将转换后的电压通过
UART0发送到上位机。
26.使用RTC部件作秒中断定时器,在发生秒增量中断时取反蜂鸣器控制口。
27.基于uC OS-II操作系,使用信号量实现行为的同步,当RTC部件秒时钟中断,LED闪
耀一次。
28.基于uC OS-II操作系,编写两个任务,一个任务用于SPI通信(作为主机接收数据),
另一个任务控制蜂鸣器响。使用消息邮箱,将SPI通信接收到的一个字节的数据用来控制蜂鸣器响的时长。