中断优先级:为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干个级别,称作中断优先级。 中断屏蔽:
中断向量:中断服务程序的入口地址。
中断响应:中断响应是当中央处理机发现已有中断请求时,中止,保存现行程序执行,并自动引出中断处理程序的过程。
中断控制:CPU能否暂停正在执行的中断服务程序,而转去执行为另一个中断源而编写的中断服务程序,如果另一个中断源的优先级高,CPU就暂停正在执行中断服务程序而转去执行为另一个中断源而编写的中断服务程序,否则,另一个中断源就不能打断正在执行的中断服务程序。
17、 结合ARM VIC 结构原理图,简述ARM体系结构中的中断控制原理。
1) 向量中断控制器(VIC)的功能特点? 2) 中断信号的来源?中断信号的标示? 3) 中断信号如何屏蔽?如何清除? 4) ARM核从何处获得中断向量? 5) 如何将中断源指派为IRQ、FIQ? 6) 向量IRQ的设置方法? 答:(1)最多32个中断请求输入;16个向量IRQ中断;16个优先级,可动态分配优先级; 可产生软件中断;当I=1时,禁止IRQ中断,反之使能之;当F=1时,禁止FIQ中断,反之使能之。 (2)
软件中断使能寄存器 VICSoftInt 软件中断清零寄存器 VICSoftIntClear 中断状态寄存器 VICRawIntr 中断使能寄存器 VICIntEnable 中断使能清零寄存器 VICIntEnClr FIQ IRQ 中断选择寄存器 VICIntSelect FIQ中断状态寄存器 VICFIQStatus 中断源 [31:0] IRQ中断状态寄存器 VICIRQStatus 高 向量IRQ0 向量IRQ0控制寄存器 VICVectCntl0 向量IRQ0使能 中断源 IRQ0 VectAddr向量地址0寄存器 优 先 级 向量IRQ15 VICVectAddr0 向量IRQ15控制寄存器 VICVectCntl15 向量IRQ15使能 中断源 VectAddr1硬 件 优 先 级 选 择 IRQ0 IRQ中断信号 IRQ15 向量地址15寄存器 VICVectAddr15 低 非向量IRQ 默认向量地址寄存器 VICDefVectAddr DefIRQ DefVectAd DefIRQ IRQ15 向量地址寄存器 VICVectAddr
答:
18、 ARM 芯片中定时器结构原理如下图,试设计一个周期为2秒的方波发生器。(假设
该系统的外围设备时钟频率Fpclk = 10MHz)
11
答:int mian{
PINSEL0=PINSEL0 & (1(3<<10)) | (2<<10); T0CTCR=0x00; T0TC=0; T0PR=99;
T0MCR=0x02<<3; T0MR1=Fpclk/100; T0EMR | =0xc2; T0TCR=0x01; While(1); }
19、 使用学过的知识设计设计一个汽车用“车速表”,写出你的设计方案并编程实现。
提示:可用霍尔元件将车轮的转动转换为脉冲。车轮每转动一圈会产生一个方波
脉冲。
答: 转动脉冲:
void __irq IRQ_Timer0 (void) {
if ((IO0SET & BEEP) == 0)
IO0SET = BEEP; /* 关闭BEEP */ else
IO0CLR = BEEP;
T0IR = 0x01; /* 清除中断标志*/
VICVectAddr = 0x00; /* 通知VIC中断处理结束 */ }
int main (void)
12
{
int spped=1;
PINSEL1 = 0x00000000; /* 设置管脚连接GPIO */ IO0DIR = BEEP; /* 设置BEEP控制口输出*/ IRQEnable(); /* IRQ中断使能*/ /* 定时器0初始化 */
T0TC = 0; /* 定时器设置为0*/ T0PR = 0; /* 时钟不分频*/
T0MCR = 0x03; /* 设置T0MR0匹配后复位T0TC,并产生中断标志*/ T0MR0 = Fpclk / spped; /* 0.5秒钟定时*/ T0TCR = 0x01; /* 启动定时器*/
/* 设置定时器0中断IRQ */
VICIntSelect = 0x00; /* 所有中断通道设置为IRQ中断*/
VICVectCntl0 = 0x20 | 0x04; /* 设置定时器0中断通道分配最高优先级*/ VICVectAddr0 = (uint32)IRQ_Timer0; /* 设置中断服务程序地址*/ VICIntEnable = 1 << 0x04; /* 使能定时器0中断*/ while (1){
if ((IO0PIN & KEY1) == 0) { spped=10;
T0MR0 = Fpclk / spped; /* 0.5秒钟定时*/ T0TC = 0; /* 定时器设置为0*/ }
else if ((IO0PIN & KEY2) == 0) { spped=20;
T0MR0 = Fpclk / spped; /* 0.5秒钟定时*/ T0TC = 0; /* 定时器设置为0*/ }
else if ((IO0PIN & KEY3) == 0) { spped=30;
T0MR0 = Fpclk / spped; /* 0.5秒钟定时*/ T0TC = 0; /* 定时器设置为0*/ }
else if ((IO0PIN & KEY4) == 0) { spped=40;
T0MR0 = Fpclk / spped; /* 0.5秒钟定时*/ T0TC = 0; /* 定时器设置为0*/ } };
return 0; }
汽车车速: int main (void)
13
{
int Vx;
PINSEL0 = (PINSEL0&(~(3<<20)))|(2<20); PINSEL0 = PINSEL0&(0<<24); T0CTCR &= 0xf0; T0TC = 0; T0PR = 99; T0MCR = 0x03; T0MR0 = Fpclk/300;
T1CTCR = (T1CTCR&(~0x0f)|0xf1); T1TC =0;
T1MCR = 0x00; T1CCR &= ~0x07;
T0TCR = 0x01; T1TCR = 0x01; while (1) {
if ((T0IR&0x01) == 1) {
T0IR = 0x01; Vx = T1TC; T1TC = 0;
VtotalLen += Vx; VthisLen += Vx;
Vspeed = (Vx*L*3.6)/HrN; }
if ((IO0PIN & KClr) == 0) VthisLen = 0; }
return 0; }
14