教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 互联网资料 >

ARM中断基础知识 - 图文(2)

来源:网络收集 时间:2026-09-06
导读: 先看下面的关系图(从下到上越来越接近cpu内核): 首先我们不采用中断方式来看各个寄存器的变化,我们用查询的方式查看,以按键中断为例,当有按键按下的时候,各个寄存器怎么变化,相互之间的关系如何: 准备一个

先看下面的关系图(从下到上越来越接近cpu内核):

首先我们不采用中断方式来看各个寄存器的变化,我们用查询的方式查看,以按键中断为例,当有按键按下的时候,各个寄存器怎么变化,相互之间的关系如何: 准备一个能够在串口输出字符的程序。

OK6410的KEY1是接在 GPN0上面的,通过GPNCON把它设置成中断方式,且通过EINT0CON0设置成下降沿触发方式,代码如下:

01 /* set GPNIO to EINT mode , 10 --> Eint */ 02 temp = GPNCON ; 03 temp &= ~(0x3<<0); 04 temp |= (0x2<<0); 05 GPNCON = temp; 06

07 /* set EINT triger mode to falling eage ,01x = Falling edge */ 08 temp = EINT0CON0 ; 09 temp &= ~(0x7<<0); 10 temp |= (0x3<<0); 11 EINT0CON0 = temp;

当按下KEY的时候,会触发中断,并且把这个信号传送到最下层的中断悬起位寄存器

EINT0PEND,这个寄存器不同的bit对应不同的中断。EINT0PEND的上层是中断屏蔽寄存器INTMASK,当这个寄存器设置为屏蔽的时候中断触发信号是无法通过它传送到上层去的。我们先来看看当中断发生的时候EINT0PEND是如何变化的,他的变化会带来怎么样的结果。

01 while (1) 02 {

03 for(ch='a';ch<='z';ch++){

04 if( (EINT0PEND & 0x1)==0x1){ //轮询EINT0PEND有没有被置位 05 uart_putchar('+'); 06 }

07 uart_putchar(ch); 08 delay(); 09 } 10 }

上面的程序是在不停的查询EINT0PEND[0],该bit对应的是外部中断0,如果按下KEY产生一个下降沿,对应位会置位,if语句满足,会打印出一个“+”,然后出来打印字母,按键松开后是否还会满足if呢?看现象:

发现按下一次之后“+”会不停的打印出来,也就是说if语句都是满足的,这就意味着

EINT0PEND置位之后没有被清除,每次查询都还有,所以会不停的打印加号,所以这个寄存器我们必须手动清除,否则触发一次中断后就会不停的响应该中断。 清除的方式就是向对应位写1,我们这里是:

至于清除中断悬起位的方式:

3种清0的写法,只有最后一种是正确的清除。

1 PEND |= 1<<0; (not good) 2 PEND = 0xFFFFFFFF; (not good) 3 PEND = 1<<0; (Good!)

如果PEND寄存器某个bit是0,你写一个1进去,那么会变成1。只有当这位是1的时候写个1进去才会变成0.

第一种:用或的方式,若PEND = 00011111(二进制),PEND | (1<<0) = 00011111,也就是将00011111写入到值为00011111的PEND中,那么PEND的值变成00000000,所有的位都被清0了,而不是我们原本的意思要清除第一位。

第二种:直接赋值,其实和第一种方式是一样的,只不过第一种是先求出或的值然后写进寄存器,如果原本是00011111的PEND,写进0xFFFFFFFF那么PEND中原本是0的位还是0,是1的位全部都清为0 ,还是不是我们想要的结果。

第三种:PEND = 1<< 0 ,加入PEND是00011111,把00000001赋值进来,那么得到PEND的值为00011110,刚好是我们想要的,清除我们想要清除的位。 下面我们看看EINT0MASK的屏蔽作用是怎样的效果: 首先看看EINT0MASK的描述信息:

可以看出哪位置1就是屏蔽对应的中断信号

1 /* EINT0MASK[0] = 1 : Mask EINT0 */ 2 temp = EINT0MASK ; 3 temp &= ~(0x1<<0); 4 temp |= (0x1<<0); 5 EINT0MASK = temp;

屏蔽外部中断0,看中断触发信号能不能通过它传达到上面的寄存器VIC0RAWINTR。 看看VIC0RAWINTR的描述:

先不屏蔽中断,看看能否在VIC0RAWINTR看到中断信号:

01 /* EINT0MASK[0] = 0 : disMask EINT0 */ 02 temp = EINT0MASK ; 03 temp &= ~(0x1<<0); 04 EINT0MASK = temp; 05

06 uart_init(); 07 while (1)

08 {

09 for(ch='a';ch<='z';ch++){

10 if( (VIC0RAWINTR & 0x1)==0x1){ 11 uart_putchar('+'); 12 }

13 uart_putchar(ch); 14 delay(); 15 } 16 }

按下KEY,触发中断,发现现象如下(没有清理EINT0PEND):

说明在 VIC0RAWINTR 检测到中断触发信号了。

如果把EINT0MASK[0]设置为1,即屏蔽信号,看看结果:

怎么按KEY也检测不到中断触发信号,说明EINT0MASK是这里的一道关卡,中断触发信号能否传到上级要看这里有没有屏蔽掉,它相当于一个开关作用。

继续dismask中断触发信号,让它传递到VIC0RAWINTR ,然后清除中断悬起位,看现象是怎样的:

01 /* EINT0MASK[0] = 0 : disMask EINT0 */ 02 temp = EINT0MASK ; 03 temp &= ~(0x1<<0); 04 EINT0MASK = temp; 05

06 uart_init(); 07 while (1) 08 {

ARM中断基础知识 - 图文(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/444994.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)