您的位置 首页 嵌入式

ARM入门笔记(8)

中断控制实验一.背景实际上ARM的中断与51单片机的中断类似,都有类似的中断入口地址(ARM称异常向量表)。只不过51给两个相互的中断入口

中止操控试验

一.布景

实际上ARM的中止与51单片机的中止相似,都有相似的中止进口地址(ARM称反常向量表)。只不过 51给两个彼此的中止进口之间留有满足的空间(如外部中止0的中止进口在03H处,而定时器0的中止进口在0BH处),在这段空间中能够放多条指令,这样在编写中止处理程序时十分灵敏。ARM总共有7种中止(或反常)类型,它们的进口分别为00H、04H ┄┄ 1CH,进口与进口之间只够放一条指令,这条一般为“BXX”或许“LDR PC, ResetAddr”的跳转指令。

二.试验意图

在IRQ中止向量地址(0x18)处设置一个断点后全速运转,用按钮发生PIO中止输入信号,使发生中止,而跳转到设置的断点处。

三.试验程序和参数设置

1>连接器选项设置与上个试验相同
2> 发动代码

与前几个试验比较,使能了IRQ中止后再跳到C言语的主函数。

AREA init,CODE,READONLY
CODE32
Mode_USR EQU0x10 ;CPSR中各种处理器形式对应的操控位
USR_Stack EQU0x00204000 ;界说RAM的最高地址,无重映射
ENTRY
B InitReset ; 0x00 Reset handler
Undefvec B undefvec ; 0x04 Undefined Instruction
swivec B swivec ; 0x08 Software Interrupt
pabtvec B pabtvec ; 0x0C Prefetch Abort
dabtvec B dabtvec ; 0x10 Data Abort
rsvdvec B rsvdvec ; 0x14 reserved
irqvec B irqvec ; 0x18 IRQ
fiqvec B fiqvec ; 0x1c FIQ
InitReset
MSR CPSR_c,#Mode_USR ;使能FIQ,IRQ中止
LDR SP,=USR_Stack
IMPORT main
b main
END

3> C言语代码

#i nclude “AT91SAM7S64.h”
#i nclude “Board.h”
unsigned int Key_Val;
unsigned int key;
int main(void)
{
*AT91C_PMC_SCER = 0x1; //使能体系时钟寄存器的处理器时钟
*AT91C_PMC_PCER = 1 91C_ID_PIOA; //使能PIOA外围时钟
*AT91C_PIOA_PER = SW_MASK; //使能KEY引脚的I/O口功用
*AT91C_AIC_IDCR = 1 91C_ID_PIOA; //制止PIO外围中止功用
*AT91C_PIOA_ODR = SW_MASK;//使能4个KEY管脚的输入功用
AT91C_BASE_AIC -> AIC_SMR[AT91C_ID_PIOA] = AT91C_AIC_PRIOR_HIGHEST| AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED;//中止形式(优先级和触发形式)
*AT91C_AIC_ICCR = 1 91C_ID_PIOA; //中止铲除
*AT91C_PIOA_IDR = 0xffffffff; //制止一切PIO口的中止功用
*AT91C_PIOA_IER = SW3_MASK; //使能PIO的SW3脚中止功用
*AT91C_AIC_IECR = 1 91C_ID_PIOA; //使能PIO外围中止功用
while (1);
}

四.呈现的问题与解决方法

1> CPU进不了中止,即跳不到IRQ中止向量进口地址。

原因是打开了Memory窗口,调查中止相关的寄存器。AXD软件为了在Memory窗口中改写这些寄存器值,在程序运转进程中会拜访CPU中相应寄存器值。当中止源触发后,在跳到IRQ的中止进口之前,IRQ的中止向量寄存器AIC_IVR就因为上述原因被读过 ,这时CPU就以为现已完成对IRQ中止的处理,因此就不再跳转到IRQ中止进口。

2> 刚一履行“MSR CPSR_c,#Mode_USR”句子使能IRQ中止,CPU就当即发生IRQ中止。

原因当上一次发生IRQ中止后,没有读PIO的中止状况寄存器,将其清零。因为中止状况寄存器置1时表明自从上一次读取此寄存器,至少检测到了一次电平改动。所以当没有读该寄存器时,该状况位会一向保持着。又因为在从头装载程序进行调试时,没有复位方针CPU,所以当使能IRQ中止后,因为PIO中止状况寄存器为1的原因此发生中止。

五.总结

个人以为ARM的中止与51的中止,在本质上并没有多大的差异,呈现上述的问题是因为它们在仿真、调试时的差异形成。在用一般的51仿真器进行仿真、调试时,假如咱们不进行如单步、全速等履行程序运转,内部的各种寄存器、状况寄存器等是不会改动的,此刻方针的CPU处于中止相同。而用ARM仿真器进行仿真、调试时,当你不进行如单步、全速等履行程序运转,内部的各种寄存器、状况寄存器还可能会改动,方针的CPU还会处处呼应外部,这种状况在调试内部定时器时会愈加显着。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/254317.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部