ARM7(sc44b0)外部中断笔记
学习小结--ARM7中断原理

PINSEL0 = 0x00000000; // 设置管脚连接 GPIO IO1DIR = LED1; // 设置 I/O 为输出 Time0Init(); // 初始化定时器及使能中断 while(1); // 等待定时器中断或定时器匹配输出 return(0); } B 非 IRQ
把中断服务函数地址给默认向量地址寄存器(VICDefVectAddr - 0xFFFFF034, 读/写)即可!
if( (IO1SET&LED1) == 0 ) {
IO1SET = LED1; } else {
IO1CLR = LED1; } T0IR = 0x01; // 清除中断标志
VICVectAddr = 0x00; // 通知 VIC 中断处理结束 } /**************************************************************************** * 名 称:Time0Init() * 功 能:初始化定时器,定时时间为 S,并使能中断。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void Time0Init(void) {
ARM中断实现过程的个人笔记

HandleWDT # 4
HandleBDMA1 # 4
HandleBDMA0 # 4
HandleZDMA1 # 4
HandleZDMA0 # 4
HandleTICK # 4
HandleEINT4567 # 4
HandleEINT3 # 4
难道将程序从RO拷贝到RW后,ARM的中断后,是直接跳到SDRAM的0地址吗??
RO段指的是程序文件中的只读段,RW是文件中的可读写的段,一般我们将下载代码文件至Flash中,上电复位后,除了进行配置时钟,建立中断向量表这些外,还有一个重要的步骤,进行内存重映射,说的简单电,就是将程序文件从Flash中拷贝出来并将文件中的各段放在内存中对应的位置上,至于为什么这么做,可以在网上查找“bootloader的分析”,有几个文档讲的很详细。void InitInterrupts函数中的 *((volatile unsigned *)temp)=0xEA000000+0x1FFE这句的意思是先给所有的中断一个通用的中断服务函数。至于“ARM的中断后,不是跳到flash的中断向量表中吗?在那里得到放在_ISR_STARTADDRESS 中断服务程序的地址,再跳回到SDRAM中执行吗? ”这个问题,应该在调用InitInterrupts函数后调用了MMU的初始化函数,将0xc000000映射至地址0,在启用MMU后,中断后跳转的地址是0,这个0是虚拟地址
LDMFDsp!,{r0-r7,lr}
SUBSpc,lr,#4
实现中断的返回。
我在用一ARM开发板,看它的示例程序有个问题很是奇怪,怎么想不想不通,特来请教各位。
我的开发板的FLASH的地址是0,SDRAM的地址:0x0c000000. RW的入口设置为0x0c008000.
ARM的异常处理学习笔记转贴

ARM 的异常处理学习笔记转贴ARM的异常处理这部分比较不好理解。
当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。
当异常中断处理程序执行完成后,程序返回到发生中断指令的下条指令处执行。
在进入异常中断处理程序时,要保存被中断程序的执行现场,从异常中断处理程序退出时,要恢复被中断程序的执行现场。
1、引起异常的原因(1)、指令执行引起的异常软件中断、未定义指令(包括所要求的协处理器不存在是的协处理器指令)、预取址中止(存储器故障)、数据中止。
(2)、外部产生的中断复位、FIQ、IRQ。
2、ARM中异常中断的种类(1)、复位(RESET)a、当处理器复位引脚有效时,系统产生复位异常中断,程序跳转到复位异常中断处理程序处执行,包括系统加电和系统复位。
b、通过设置PC跳转到复位中断向量处执行称为软复位。
(2)、未定义的指令当ARM处理器或者是系统中的协处理器认为当前指令未定义时,产生未定义的指令异常中断,可以通过改异常中断机制仿真浮点向量运算。
(3)、软件中断这是一个由用户定义的中断指令(SWI)。
可用于用户模式下的程序调用特权操作指令。
在实时操作系统中可以通过该机制实现系统功能调用。
(4)、指令与取终止(Prefech Abort)如果处理器预取的指令的地址不存在,或者该地址不允许当前指令访问,当被预取的指令执行时,处理器产生指令预取终止异常中断。
(5)、数据访问终止(DATAABORT)如果数据访问指令的目标地址不存在,或者该地址不允许当前指令访问,处理器产生数据访问终止异常中断。
(6)、外部中断请求(IRQ)当处理器的外部中断请求引脚有效,而且CPSR的寄存器的I控制位被清除时,处理器产生外部中断请求异常中断。
系统中个外设通过该异常中断请求处7)、快速中断请求(FIQ) 理服务。
(当处理器的外部快速中断请求引脚有效,而且CPSR的F控制位被清除时,处理器产生外部中断请求异常中断。
44B的中断介绍_eint4567配置实例_关于中断嵌套和向量中断

44b0中断介绍一般的ARM7核是软件判断优先级,if there are 10 interrupt requests at the same time, you can determine the interrupt service priority by reading the interrupt pending register。
这会耗费44B0默认没有中断嵌套。
30个中断源,其中EINT4567是OR在同一个源上,UART0和1的ERROR中断也是。
共26个中断位,优先级大致为:EINT0-7—DMA—WDT—T/C0-5—URX—IIC—UTX—RTC—ADCINTCON R/W 0X7中断控制REG:I/F位为屏蔽中断位,即清零为开中断。
INTPND R 0X0中断标志REG:只要产生中断请求,则置位,必须向I/F_ISPC相应位写一清除I_ISPC/F_ISPC W UNDEF中断标志清除REG,用来清除INTPND相应位INTMOD R/W 0X0 IRQ/FIQ选择,0为IRQINTMSK R/W 0X7FFFFFF中断屏蔽REG:1为屏蔽中断,0则中断可用,最高位为GLOBAL位当INTMSK在ISR中置位且向量中断,则INTMSK不会屏蔽已在INTPND中置位的向量。
(bug)应先清除INTPND再置位INTMSK。
I_ISPR R 0X0指示正在被处理的中断,即使INTPND中多个标志位置位,I_ISPR也只有一个位会置位EXTINT R/W 0X0外部中断控制REG:决定每个EINT的触发方式和触发极性,每个EINT占三位,各5种配置方式每个EINT引脚都有数字滤波器,所以大于3时钟周期的信号会被识别。
EXTINTPND R/W 0X0外部中断4567标志REG:指示哪个EINT发生。
必须在ISR中写一清除(R/W?)外部中断4567,非向量模式的配置一、配置寄存器rINTCON = 0x5 ; //无向量中断模式rINTMOD = 0x0 ; //All=IRQ moderPCONG = rPCONG | ( 0xff << 8 ); //EINT7~4rPUPG = rPUPG & (~(0xf << 4)) ; //pull up resister is enablerEXTINT = rEXTINT & (~(0xffff << 16)) ; //EINT4567低电平触发中断pISR_EINT4567 = (unsigned)Key_Interrupt ; //将中断isr地址放入ISR区rINTMSK = ~( BIT_GLOBAL | BIT_EINT4567 ) ; //start INT//#define BIT_GLOBAL (0x1<<26)//#define BIT_EINT4567 (0x1<<21)二、ISR格式为void __irq Key_Interrupt(void)__irq的作用是自动作现场环境保护处理,而且它的处理是不支持中断嵌套的。
ARM 的异常处理学习笔记

ARM 的异常处理学习笔记和优先级。
而S3C44B0 中集成的中断控制器提供了一种更为快速有效的中断响应方式:矢量中断利用中断控制器的硬件方式直接提供对中断服务的快速响应:当多重中断请求信号发生时,由硬件优先级判定逻辑确定哪个中断请求将被响应,同时硬件逻辑还利用向量表中的跳转指令使CPU 直接跳转到相应的中断服务程序入口出。
这样在很大程度上减小了中断响应的延迟。
那么在程序设计上,就需要我们在矢量中断表中对应的地址上放置各个中断请求对应的服务程序入口地址,如:VECTOR_BRANCH: ldr pc,=HandlerEINT0 /*0x00000020*/ ldr pc,=HandlerEINT1 /*0x00000024*/ ldr pc,=HandlerEINT2 /*0x00000028*/ ldr pc,=HandlerEINT3 /*0x0000002C*/ ldr pc,=HandlerEINT4567 /*0x00000030*/ ldr pc,=HandlerTICK /*0x00000034 */ b . b . ldr pc,=HandlerZDMA0 /*0x00000040*/ ldr pc,=HandlerZDMA1 /*0x00000044*/ 6、中断向量表mcu16/embed/arm/arm593.htm a、中断向量表指定了个异常中断及其处理程序的对应关系。
他通常存放在存储地址的低端。
在ARM 体系中,异常中断向量表的大小为32 字节,其中每个异常中断占据4 个字节大小,保留了4 个字节空间。
b、每个异常中断对应的中断向量表中的4 个字节的空间中存放了一个跳转指令或者一个向PC 寄存器中赋值的数据访问指令。
通过这两种指令,程序将跳转到相应的异常中断处理程序处执行。
c、当几个异常中断同时发生时,系统并不能按照一定的次序来处理这些异常中断,例如:当FIQ、IRQ 和第三个其他中断同时发生,FIQ 比IRQ 优先级高,IRQ 会忽略,直到FIQ 返回到用户代码为止。
arm7外部中断简要分析

对《深入浅出arm7lpc》的中断例子进行修改后的运行情况外部中断唤醒功能执行中断程序(取中断程序与等待中断程序部分)为了便于观察,我把原理图中的蜂鸣器换成了led灯,源程序请查看《深入浅出arm7lpc》1。
源程序(唤醒不执行中断)while(1){PCONP = 0x00;PCON = 0x02;if((IO0SET&BEEP) == 0)IO0SET = BEEP;elseIO0CLR = BEEP;EXTINT = 0x01;}运行情况:按键按下,灯亮一下,就灭掉分析:按键后唤醒芯片,执行灯亮,然后清中断标志,然后再次掉电,灯灭注释掉EXTINT = 0x01; 运行情况一样,说明没使能中断的情况下,中断标志不影响IRQEnable();2。
原程序(唤醒+执行中断)void __irq IRQ_Eint0(void){while((EXTINT&0x01)!=0){EXTINT = 0x01;}VICVectAddr=0;}while(1){PCONP = 0x00;PCON = 0x02;if ((IO0SET & BEEP) == 0)IO0SET = BEEP;elseIO0CLR = BEEP;// EXTINT = 0x01;}运行情况:按键,led灯亮,再按键,led灯灭修改1.void __irq IRQ_Eint0(void){if ((IO0SET & BEEP) == 0)IO0SET = BEEP;elseIO0CLR = BEEP;// EXTINT = 0x01;VICVectAddr=0;}while(1){PCONP = 0x00;PCON = 0x02;}运行情况:原来灯灭,按键后灯闪烁,再按键没反应,保持闪烁分析:中断程序中没清中断标志,使一直响应中断修改2。
void __irq IRQ_Eint0(void){if ((IO0SET & BEEP) == 0)IO0SET = BEEP;elseIO0CLR = BEEP;EXTINT = 0x01;VICVectAddr=0;}while(1){PCONP = 0x00;PCON = 0x02;}运行情况:原来灯灭,按住键,灯闪烁,松手,灯保持松手前最后状态(加上按键去抖动,也许无法解决,这是根据电平变化响应中断)修改3。
单片机ARM7 第4章-6-外部中断

上升沿
VIC
注意:这里仅以EINT0为例来进行讲解,EINT1~EINT3与之类似,此处不再重复.
4.10 外部中断输入
电平中断设置
LPC2000系列ARM的电平中断可以设置为高电平触发和 低电平触发. 当EXTPOLAR[0] = 0时,外部中断0设置为低电平触发. 当EXTPOLAR[0] = 1时,外部中断0设置为高电平触发.
VICVectAddr0 VICIntEnable[14] EINT0 通道14 VICIntSelect[14] IRQ FIQ VICVectCntl0 IRQ 通道 VICVectAddr15 分配 VICVectCntl15 VICDefVectAddr 向量IRQ通道15 非向量IRQ通道 向量IRQ通道0
VICVectAddr0 VICIntEnable[14] EINT0 通道14 VICIntSelect[14] IRQ FIQ VICVectCntl0 IRQ 通道 VICVectAddr15 分配 VICVectCntl15 VICDefVectAddr 向量IRQ通道15 非向量IRQ通道 向量IRQ通道0
VIC
注意:这里仅以EINT0为例来进行讲解,EINT1~EINT3与之类似,此处不再重复.
4.10 外部中断输入
边沿中断设置
LPC2000系列ARM的边沿中断可以设置为上升沿触发和 下降沿触发. 当EXTPOLAR[0] = 0时,外部中断0设置为下降沿触发. 当EXTPOLAR[0] = 1时,外部中断0设置为上升沿触发.
外部中断 方式控制
EXTMODE
掉电 唤醒控制 4 中断标志
EXTINT
CPU 其它部件
寄存器汇总
中断信号波形与设置方式 外部中断标志寄存器(EXTINT): 外部中断唤醒寄存器(EXTWAKE): 外部中断极性控制寄存器(EXTPOLAR): 外部中断方式控制寄存器(EXTMODE):
学习小结--ARM7中断原理

2
3 向量地址寄存器 0-15(VICVectAddr0-15 - 0xFFFFF100-13C,读/写)
一般(以 Slot0 为例):VICVectAddr0 = (uint32)IRQ_TIME0 ;
4 向量地址寄存器(VICVectAddr - 0xFFFFF030,读/写) VICVectAddr = 0x00; // 通知 VIC 中断处理结束
二 ,VIC 寄存器 1,中断选择寄存器(VICIntSelect - 0xFFFFF00C,读/写)
该寄存器将 32 个中断请求分别分配为 FIQ 或 IRQ。
一般选 IRQ 时:VICIntSelect = 0x00;
1
2,向量控制寄存器 0-15(VICVectCnt l0-15 - 0xFFFFF200-23C,读/写)
PINSEL0 = 0x00000000; // 设置管脚连接 GPIO IO1DIR = LED1|LED2; // 设置 I/O 为输出 IO1SET = LED1|LED2; Time1Init(); // 初始化定时器及使能中断 Time0Init(); VICIntSelect = 0x00; // 所有中断通道设置为 IRQ 中断 VICDefVectAddr = (uint32)nIRQ_TIME; VICIntEnable = time0|time1; while(1); // 等待定时器中断或定时器匹配输出 return(0); }
}
} /**************************************************************************** * 名 称:Time0Init() * 功 能:初始化定时器,定时时间为 S,并使能中断。 * 入口参数:无 * 出口参数:无 ****************************************************************************/ void Time1Init(void) {
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ARM7(sc44b0)外部中断笔记
对于sc44b0它也是一种单片机,一种比较高级的单片机而已,所以他也跟51单片机一样有外部中断,不同51单片机的是,他有8个外部中断源,对应的是8个管脚,(51只有两个,int0和int1,P3.3和P3.4),分别是Port G八个管脚。
而对于外部中断4 \5\6\7很多都是共用寄存器,他们是通过或逻辑公用一个中断请求线。
下面就具体来说说使用外部中断的一些必要的配置。
一,对管脚的配置,因为Port G有三种功能用法,要通过对rPCONG(端口G
配置寄存器)的配置来选用Port G
的外部中断的功能。
其配置表如下
所以应该将其配置为11(设置为中断功能状态);
二,中断模式的选择,中断模式有两种,FIQ(快速中断模式)和 IRQ(中断模式)两种,一般没有特殊要求都用IRQ模式即可。
可以通过对中断模式寄存器rINTMOD配置获得。
如表下
三,是否允许中断,即中断使能位。
通过对中断控制寄存器INTCON的配置即可,如表下通过对中断控制寄存器的配置即可,
可以看出只要让intcon的【1】位置零即可使中断使能。
四,外部中断方式的选择,低电平或上升沿触发呢,还是别的,这就要对外部中断方式寄存器(EXTINT)的配置,其表如下
由上表可知,如果要用下降沿触发,就可将EXTINT 的值给0x22222222;
将所有的外部中断都设置为下降沿触发。
五,当中断捕抓到以后,要引起什么变化呢?或者说用什么来捕抓呢?在sc44b0中用了两个寄存器来捕抓,一个中断挂起寄存器(INTPND),和外部中断挂起寄存器(EXINTPND),一开始不明白挂起是什么意思,后来才懂,差不多就相当与51单片机的标志位一样,当中断发生后,就将挂起寄存器的对应的某一位置一或置零,外部中断挂起寄存器如表下
中断挂起寄存器:当中断产生后,是将INTPND的【21】位置一的;
所以,判断有无外部中断,就可以通过读取挂起寄存器对应的为,即可知道是否有无中断。
六,当中断发生后,挂起寄存器的对应位(即中断标志位)也发生了置位,那如果要检测下一个中断,就得将挂起寄存器的对应为复原,那怎么复原呢?在51单片机中是将中断标志位软件置零就可,在44b0中也是同样的道理,它是通过将对应的中断挂起寄存器的位置一就行了,对于EXTINTPND,他是直接将对应的位置一,对于EXTINTPND是通过将rI_ISPC的对应位置一(EXTINTPND和I_ISP的位数是一样的,两个是相互对应的)
附上程序;
#define EXTINT4 0
#define EXTINT5 1
#define EXTINT6 2
#define EXTINT7 3
#define EXTINT4567 21
#define INTTRIG_LOW 0x00
#define INTTRIG_HIGH 0x01
#define INTTRIG_FALLING 0x02
#define INTTRIG_RISING 0x04
#define INTTRIG_BOTHEDGE 0x05
void KeyLedTest (void)
{
U32 dwVal;
//设置IO 口PORT G
rPCONG |= 0xff00;//设置GP4--GP7为中断输入脚配置11的时候为中断输入脚
//设置中断
rINTMOD &= ~MASK_BIT(21);//中断模式寄存器即设置为快速中断或普通中断mo
//rINTMOD &= ~MASK_BIT(21)作用是让rINTCON的21位置零
//0是IRQ是指中断模式,1是FIR是指快速中断模式 rINTCON &= ~MASK_BIT(1);//INTCON第一位为0表示允许所有中断
//设置EXTINT4,5,6,7中断模式,我们这里使用低电平触发
// rEXTINT &= 0xffff; //先清除EXTINT4,5,6,7的相应设置bit位
// 外部中断寄存器,设置为双边沿触发
for (;;)
{
dwVal = rINTPND;
if ((dwVal & MASK_BIT(21)) == 0)
{
continue;
}
//EXTINTPND 寄存器,判断是哪个外部中断触发
dwVal = rEXTINTPND;//仿真的时候实际上是到这里的时候读取
// rEXTINTPND外部中断挂起寄存器
if ((dwVal & MASK_BIT(EXTINT4)) != 0)//判断rINTPND对应的挂起中断 //寄存器是否为0或1
{
rEXTINTPND |= MASK_BIT(EXTINT4);//絩EXTINTPND 的EXTINT4位置一清 除EXTINTPND 是通过对EXTINTPND 对应的位写1来清除的
//外部中断4 产生了,点亮LED1
sysUtilsLightLed (LED1, TRUE);
printf("LED1 is on;\n");
}
if ((dwVal & MASK_BIT(EXTINT5)) != 0)
{
rEXTINTPND |= MASK_BIT(EXTINT5);
//外部中断4 产生了,点亮LED2
sysUtilsLightLed (LED2, TRUE);
printf("LED2 is on;\n");
}
if ((dwVal & MASK_BIT(EXTINT6)) != 0)
{
rEXTINTPND |= MASK_BIT(EXTINT6);
//外部中断4 产生了,点亮LED3
sysUtilsLightLed (LED3, TRUE);
printf("LED3 is on;\n");
}
if ((dwVal & MASK_BIT(EXTINT7)) != 0)
{
rEXTINTPND |= MASK_BIT(EXTINT7);
//外部中断4 产生了,点亮LED1,2,3
sysUtilsLightLed (LED_ALL, FALSE);
printf("all leds灯 is off;\n");
}
//最后清除中断位
//rI_ISPC |= MASK_BIT(21);
rI_ISPC = dwVal;//对I_ISPC/ F_ISPC写入1,INTPND 将被自动清除 }
}。