当前位置:文档之家› 浙江大学 嵌入式ARM题库

浙江大学 嵌入式ARM题库

浙江大学 嵌入式ARM题库
浙江大学 嵌入式ARM题库

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通信接收到的一个字节的数据用来控制蜂鸣器响的时长。

相关主题
文本预览
相关文档 最新文档