ARM中断基础知识 - 图文(2)
先看下面的关系图(从下到上越来越接近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 {
相关推荐:
- [互联网资料]2022年厦门大学机电工程系824机械设计
- [互联网资料]东南大学2022年硕士研究生拟录取名单公
- [互联网资料]能源调研报告(精选多篇)
- [互联网资料]初三英语下学期 中考英语 语法填空训练
- [互联网资料]2022内蒙古选调生行测常识备考:新事物
- [互联网资料]自驾必备!在新西兰租什么样的车自驾游
- [互联网资料]佛教素食菜谱44页未完
- [互联网资料]盈利能力分析外文翻译
- [互联网资料]2022年南昌航空大学音乐学院736马克思
- [互联网资料]优选外贸跟单实习报告总结(精品版)
- [互联网资料]银行新员工培训总结
- [互联网资料]2_year_visa_new_guidance_190316
- [互联网资料]天津市五校宝坻一中静海一中杨村一中芦
- [互联网资料]2007--2008学年第一学期高三数学宁波市
- [互联网资料]Chromatic framework for vision in ba
- [互联网资料]幼儿园大班上学期美术教案《心愿树》含
- [互联网资料]2022年华中农业大学信息学院820微型计
- [互联网资料]硬盘坏道的表现 __硬盘使用久了
- [互联网资料]江苏省2016年会计从业资格考试《会计基
- [互联网资料]公共场所卫生监督试卷全解
- 高级英语第一册所有修辞方法及例子总结
- 综合交通枢纽规划与城市发展
- 沃尔玛的企业文化案例分析
- 美国Thanksgiving Day 感恩节 介绍
- PEP六年级英语上册Unit6How do you fee
- 最齐全的中国大型商场购物中心名单
- 数据结构实验报告八—哈夫曼编译码
- 杭州市余杭区人民政府(通知)
- 七年级语文成语运用专项训练
- 微观经济学第三章 消费者行为 课后习题
- 对_钱学森之问_的思考
- Excel_三级联动_下拉菜单
- 办公用品需求计划申请表
- 对外汉语教材必须要知道的发展史
- 挑战杯大学生学术科技作品竞赛作品申报
- 举办民办教育培训机构应具备下列条件
- 太阳能路灯项目设计方案
- 2013年八年级上最新人教版新教材Unit3I
- 【历史】 6-4 《近代科学之父牛顿》 课
- 高中生物《第四章 第二节 探讨加酶洗衣




