ARM2200下的中断编程二

发布者:breakthrough3最新更新时间:2017-11-28 来源: eefocus关键字:ARM2200  中断编程 手机看文章 扫描二维码
随时随地手机看文章

四.ARM中断程序编写之外部中断

前言:VIC中断控制器定义了4个外部中断,中断号为EINT0(14),

EINT1(15),EINT2(16),EINT3(17)用来给用户进行编写外部中断(例如按键中断。。。)

1.     在编写外部中断事先要对引脚功能选择寄存器(PINSEL0)进行配置

(参照具体型号的ARM数据手册,此处以LPC2230进行配置)在LPC2230中:

Eg:PINSEL1 = 3<<8;      // 设置管脚连接,P0.20设置为EINT3

2第二部外部中断还要对外部中断方式寄存器(EXTMODE)进行配置来选择每个EINT脚是电平触发还是边沿触发。

A.EXTMODE(外部中断方式寄存器):总共有8位

第0位:对第0位写入1表示对EINT0使用边沿触发,反之,写入0表示对EINT0使用电平触发。

第1位:功能和上面相似只是对EINT1进行配置

第2位:是对EINT2进行配置

第3位:是对EINT3进行配置

第4~7位:保留

Eg;EXTMODE = 1<<3; // 设置EINT3中断为边沿触发模式

EXTMODE = 0<<3;          // 设置EINT3中断为电平触发模式

3第三部外部中断还要对外部中断极性寄存器进行配置(EXTPOLAR)进行配置(在电平触发方式中,EXTPOLAR寄存器用来选择相应引脚是高电平或低电平有效。在边沿触发方式中,EXTPOLAR寄存器用来选择引脚上升沿或下降沿有效)

A EXTPOLAT(外部中断极性寄存器)总共有8位

第0位:是对EINT0进行配置,对该位写入1表示时表示

EINT0高电平或上升沿有效。反之,对该位写入0表示表示EINT0低电平或下降沿有效

第1位:是对EINT1进行配置。功能和上面类似。

第2位:是对EINT2进行配置。功能和上面类似

第3位:是对EINT3进行配置。功能和上面类似

第4~7位:保留位。

Eg:  EXTPOLAR = 0x00;     // 设置EINT3中断为下降沿触发

         EXTPOLAR = 0x00;// 设置EINT3中断为低电平有效

4.第四部配置中断选择寄存器VICIntSelect

功能和前面的类似

Eg; VICIntSelect = 0x00000000; // 设置所有中断分配为IRQ中断

5若外部中断为向量中断则对向量控制寄存器0~15(VICVectCntl0~15)

进行配置。若为非向量中断则此步骤可省掉。

Eg: VICVectCntl0 = 0x20|17; // 分配EINT3中断到向量中断0,0x20表示向量IRQ使能,1<<17表示EINT3在VIC通道17号

6配置外部中断服务程序的地址:

a.若为向量中断则配置向量地址寄存器(VICVectAddrx)

a.     b.若为非向量中断则配置默认向量地址寄存器VICDefVectAddr

eg:  VICVectAddr0 = (int)IRQ_Eint3;      // 设置向量中断服务程序地址IRQ_Eint3(为函数名,可随意起)

VICDefVectAddr = (int)IRQ_Eint3;             // 设置非向量中断服务程序地址

7.清除外部中断标志

切记要在初始化时对EXTINT进行初始化。否则程序会进入异常。

配置外部中断标志寄存器(EXTINT)

A.    通过对EXINT寄存器写人1来将其清零来清除外部中断标志

B.     EXTINT总共有8位

第0位:是对EINT0进行配置,写入1对外部中断EINT0中断进行清除

第1位:是对EINT1进行配置,写入1对外部中断EINT1中断进行清除。

第2位:是对EINT2进行配置,写入1对外部中断EINT2中断进行清除。

第3位:是对EINT3进行配置,写入1对外部中断EINT3中断进行清除。

第4~7位:保留位.

Eg: EXTINT = 1<<3;              // 清除EINT3中断标志

8.对中断使能寄存器(VICIntEnable)进行配置

功能和前面说的类似

Eg: VICIntEnable = 1<<17; // 使能EINT3中断,EINT3在VIC通道17号

注:编写外部中断程序时初始化实例:

1.初始化外部中断3,用向量中断,为边沿触发。

PINSEL1 = 3<<8; // 设置管脚连接,P0.20设置为EINT3

EXTMODE = 1<<3;  // 设置EINT3中断为边沿触发模式

EXTPOLAR = 0x00;  // 设置EINT3中断为下降沿触发

VICIntSelect = 0x00000000;            // 设置所有中断分配为IRQ中断

VICVectCntl0 = 0x20|17;            // 分配EINT3中断到向量中断0

VICVectAddr0 = (int)IRQ_Eint3;    // 设置中断服务程序地址

EXTINT = 1<<3;        // 清除EINT3中断标志  ,次步不能少

VICIntEnable = 1<<17;  // 使能EINT3中断,EINT3在VIC通道17号

2.     初始化外部中断为EINT3,用非向量中断,为电平触发

PINSEL1 = 3<<8; // 设置管脚连接,P0.20设置为EINT3

EXTMODE = 0<<3; // 设置EINT3中断为电平触发模式

EXTPOLAR = 0x00; // 设置EINT3中断为低电平触发

VICIntSelect = 0x00000000;// 设置所有中断分配为IRQ中断

VICDefVectAddr = (int)IRQ_Eint3;       // 设置中断服务程序地址

EXTINT = 1<<3;              // 清除EINT3中断标志  ,次步不能少

VICIntEnable = 1<<17;  //使能EINT3中断,EINT3在VIC通道17号

注:1.在编写中断服务函数时,外部中断为电平触发和边沿触发有区别

3.     在zlg模版中编写中断服务函数时,函数名的前缀是 __irq

函数实例:

1>用外部中断3,用向量中断,为边沿触发的中断服务函数的程序

void   __irq IRQ_Eint3(void)

    uint32  i;

    i = IO0SET;                                               // 读取当前B1控制值

    if( (i&BEEPCON)==0 )                          // 控制B1输出取反

    { 

        IO0SET = BEEPCON;

    }

    else

    {

        IO0CLR = BEEPCON;

    } 

              EXTINT = 1<<3;    // 清除EINT3中断标志,1<<3 等价于 0x08

               VICVectAddr = 0;   // 向量中断结束

  }               

此中断函数实现的功能时当有按键按下时会蜂鸣。

注:1.每个中断服务函数的函数名前缀必须加__irq

2在中断服务程序最后要清除中断标志EXTINT = 1<<3,以及给VICVectAddr寄存器写入0;

3.切记在初始化外部中断时也要对EXTINT引脚进行初始化,否则程序会出现异常。

  2>初始化外部中断为EINT3,用非向量中断,为电平触发

void   __irq IRQ_Eint3(void)

    uint32  i;

    i = IO0SET;                                                // 读取当前B1控制值

    if( (i&BEEPCON)==0 )                            // 控制B1输出取反

    { 

        IO0SET = BEEPCON;

    }

    else

    { 

        IO0CLR = BEEPCON;

    }

    /* 等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位) */

    while( (EXTINT&1<<3)!=0 )  

    { 

        EXTINT = 1<<3;         // 清除EINT3中断标志,

    }

VICVectAddr = 0;               // 向量中断结束

}

 

John哥说明:  

在用电平触发时在中断服务程序最后要清除中断标志时,要使用

  while( (EXTINT&1<<3)!=0 ) 

    { 

        EXTINT = 1<<3;         // 清除EINT3中断标志,

    }

(因为等待外部中断信号恢复为高电平(若信号保持为低电平,中断标志会一直置位)这一点和边沿触发有区别。 

 

注:

1.中断使能清零寄存器VICIntEnClr:那1位置1,则用来屏蔽该位的中断。

2.     当有多个中断源被设置为非向量IRQ中断时,需要在用户程序中识别中断源,并分别作出处理。所以非向量IRQ中断响应延时相对较长。

3.     中断状态寄存器:

a.如果使用了多个非向量IRQ中断或多个FIQ中断,那么在发生中断后要在程序中查找中断源。通过IRQ状态寄存器和FIQ状态寄存器可以了解到这些中断源的中断请求状态。

b. 任何在VIC中使能的中断都会把中断请求反映在“所有中断寄存器(VICRawIntr)中

c.所有中断状态寄存器(VICRawIntr):当某位为1时表示对应位的中断源产生中断请求。

d.FIQ状态寄存器(VICFIQStatus):当某位为1时表示对应位的中断产生FIQ中断请求。

e.IRQ状态寄存器(VICIRQStatus):当某位为1时表示对应位的中断源产生IRQ中断请求


关键字:ARM2200  中断编程 引用地址:ARM2200下的中断编程二

上一篇:ARM2200 下的中断编程三
下一篇:ARM2200下的中断编程一

推荐阅读最新更新时间:2024-03-16 15:47

51单片机——中断系统、外部中断、定时器中断、串口通信C语言入门编程
中断系统: 当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。当几个中断源同时向 CPU请求中断,CPU总是先响应优先级别最高的中断请求。当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。STC89C5X 系列单片机提供了8个中断请求源,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(
[单片机]
51单片机——<font color='red'>中断</font>系统、外部<font color='red'>中断</font>、定时器<font color='red'>中断</font>、串口通信C语言入门<font color='red'>编程</font>
TMS320C32 DSP的中断编程方法及BOOT功能实现
摘要:采用C语言对DSP编程具有很多优点。针对TMS320C32芯片的特点,提出了一种基于C语言的中断编程方法,同时介绍了具体的BOOT功能实现方案,给出了相应的源程序和结论。 关键词:C语言 BOOT表 中断向量 TMS320C3X系列芯片是美国TI公司推出的第一代浮点DSP芯片,具有丰富的指令集、很高的运算速度、较大的录址空间和较高的性价比,在各领域得到了广泛的应用。TMS320C32是TMS320系列浮点数字信号处理器的新产品,在TMS320C30和TMS320C31的基础上进行了简化和改进。在结构上的改进主要包括可变宽度的存储器接口、更快速的指令周期时间、可设置优先级的双通道DMA处理器、灵活的引导程序装入方式、可重新
[应用]
T0作定时器汇编程序(中断法)
单片机T0作定时器实现数码管显示的汇编程序(中断法) 电路是:P0口接数码管的字型码笔段,P2口接数码管的数位选择端. 下面是汇编语言源程序: SECOND EQU 30H TCOUNT EQU 31H ORG 00H LJMP START ORG 0BH LJMP INT0X START: MOV SECOND ,#00H MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOVC A,@A+DPTR MOV P2,A MOV TCOUNT,#00H M
[单片机]
单片机编程技巧--功能强大的时钟中断
在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便和简化程序的编制,提高系统的效率与可操作性。我们可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助主程序完成定时、延时等操作。 下面以6MHz时钟的AT89C51系统为例,说明时钟中断的应用。 定时器初值与中断周期 时钟中断无需过于频繁,一般取20mS(50Hz)即可。如需要百分之一秒的时基信号,可取10mS(100Hz)。这里取20mS,用定时器T0工作于16位定时器方式(方式1)。T0的工作方式为:每过一个机器周期自动加1,当计满0FFFFh,要溢出时,便会产生中断,并由硬件设置相应的标志位供软件查询。即中断
[单片机]
C51编程13-中断篇(外部中断
CPU在执行的过程中,一般来说都是在执行主程序(main函数里面的代码)。如果希望处理其他的功能,可以通过查询的方式进行,判断是否需要处理或者通过中断的方式,进入中断服务函数程序里面执行。 前者是在主程序中判断条件是否成立,如果成立则执行其他功能,否则不执行;后者是CPU在执行过程中,判断是否有中断标志位,响应中断进入中断服务函数,执行相关功能。 MCS-51 单片机中,有两个外部中断(INT0与INT1),中断有两种方式低电平触发与负跳变(下降沿)触发。 下面通过讲INT0说明外部中断,INT1同理。 原理图: P0连接8个LED,INT0引脚连接一个按钮连接到地。 在中断系统中,INT0设计的寄存器中
[单片机]
C51<font color='red'>编程</font>13-<font color='red'>中断</font>篇(外部<font color='red'>中断</font>)
c51单片机定时中断的精确定时编程方法总结
MCS-51单片机的中断响应延迟时间,取决于其它中断服务程序是否在进行,或取决于正在执行的是什么样的指令。单中断系统中的中断响应时间为3~8个机器周期 。无论是哪一种原因引起的误差,在精确定时的应用场合,必须考虑它们的影响,以确保精确的定时控制。根据定时中断的不同应用情况,应选择不同的精确定时编程方法。 文中以定时器T1工作在定时方式1为例,晶振频率为12MHz 。 1 方法1 在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时
[单片机]
TMS320C32 DSP的中断编程方法及BOOT功能实现
摘要:采用C语言对DSP编程具有很多优点。针对TMS320C32芯片的特点,提出了一种基于C语言的中断编程方法,同时介绍了具体的BOOT功能实现方案,给出了相应的源程序和结论。 关键词:C语言 BOOT表 中断向量 TMS320C3X系列芯片是美国TI公司推出的第一代浮点DSP芯片,具有丰富的指令集、很高的运算速度、较大的录址空间和较高的性价比,在各领域得到了广泛的应用。TMS320C32是TMS320系列浮点数字信号处理器的新产品,在TMS320C30和TMS320C31的基础上进行了简化和改进。在结构上的改进主要包括可变宽度的存储器接口、更快速的指令周期时间、可设置优先级的双通道DMA处理器、灵活的引导程序装入方式、可重新
[嵌入式]
ARM处理器中断处理的编程实现
ARM处理器中断处理的编程实现arm编程特别是系统初始化代码的编写中通常需要实现中断的响应、解析跳转和返回等操作,以便支持上层应用程序的开发,而这往往是困扰初学者的一个难题。中断处理的编程实现需要深入了解arm内核和处理器本身的中断特征,从而设计一种快速简便的中断处理机制。需要说明的是,具体的上层高级语言编写的中断服务函数不在本文的讨论范围之内。 arm处理器异常中断处理概述 当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,要恢复被中断的程序的
[单片机]
ARM处理器<font color='red'>中断</font>处理的<font color='red'>编程</font>实现
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved