历史上的今天
返回首页

历史上的今天

今天是:2024年11月08日(星期五)

正在发生

2019年11月08日 | 2440裸机编程之四 外部中断

2019-11-08 来源:51hei

2440有60个中断源(有的中断源还有几个子中断源),中断原理如下图:



中断源使中断源请求寄存器(SRCPND)的相应位置一,中断模式寄存器(INTMOD)选择是IRQ还是FIQ模式,如果是IRQ,在中断屏蔽寄存器(INTMSK)不屏蔽的情况下,会产生中断,同时中断请求寄存器(INTPND)的相应位被置一。


2440 外部中断 编程步骤:
外部中断初始化()
{
引脚初始化: 设置相应引脚为外部中断功能 GPxCON
  选择相应触发模式    EXTINT

中断初始化: 清除SRCPNF、INTPND中的相应中断标志位
  中断例程地址 -> 中断向量表 pISR_EINTx
  使能相应中断 rINTMSK
}


中断例程()  __irq
{
  ……中断程序……
  清除SRCPNF(先)、INTPND(后)中的相应中断标志位
}


这是一个外部中断0的实验程序(GPF0作外部中断源):
//********************************************************************
void Main(void)
{     
    int i;
    ……硬件初始化……

Eint0_init();
while(1);

}

void  Eint0_init(void)  //EINT0初始化
{
Uart_Printf("n外部中断实验:Eint0n"); 
rGPFCON = rGPFCON & ~7 |  2  ; //设置GPF0 为 外部中断模式
rEXTINT0 = rEXTINT0 & ~7 | 2   ;//设置EINT0 为 下降沿触发

rSRCPND = 1;     //SRCPND写1清0
rINTPND = 1;     //INTPND写1清0
pISR_EINT0 = (U32)Eint0_ISR; //向向量表申请中断向量
rINTMSK = rINTMSK & ~(1);  //禁止EINT0的屏蔽
}


void   Eint0_ISR(void) __irq  //EINT0中断例程
{
Uart_Printf("你按了一次Eint0引脚的按键n"); 
rSRCPND = 1;  //清楚EINT0中断标志
rINTPND = 1; 
}

//*******************************************************************


运行结果如图:




注意中断标志的清除顺序:SUBSRCPND(如果有)->SRCPND->INTPND  ,如果不这样做,中断例程结束后,还会再次引起额外的中断
注意 pISR_EINT0 = (U32)Eint0_ISR;每一个中断例程运行之前,都要把它的地址交给中断向量表(此指60个中断源的eboot中断向量表,非地址0处的异常中断向量表,IRQ发生时,PC先指向异常中断向量表的IRQ位置,再跳转到eboot中断向量表),以在中断发生时,正确进入相应的中断例程,其实是把INTOFFSET中的中断号转换成(在eboot中断向量表的)偏移地址。




外部中断又24个,但不都是一致的,如下图:

EINT0、EINT1、EINT2、EINT3是四个独立的中断源,而EINT4~7组成一个中断源,EINT8~23组成一个中断源。
那么EINT4~7的中断程序如何写,显然不能用EINT0的方式,不然EINT4~EINT7的四个源相互之间无法被区分开,EINT8~23也同理。
所以为了区分它们,要用到EINTMASK和EINTPEND,EINTMASK每一位对应EINT4~EINT23的屏蔽,其他位保留;EINTPEND每一位对应EINT4~EINT23的中断请求,其他位保留;这样就可以顺利区分EINT4~EINT23了。


下面是Eint2和Eint11的中断程序
//********************************************************************
void Main(void)
{     
    int i;
    ……硬件初始化……

Uart_Printf("n外部中断实验:Eint2 和 Eint8_23n");

Eint2_init();
Eint8_23_init(); //EINT11初始化
while(1);

}

void  Eint2_init(void)  //EINT2初始化
{
rGPFCON = rGPFCON & ~3<<4 |  2<<4  ; //设置GPF2 为 外部中断模式
rEXTINT0 = rEXTINT0 & ~7<<8 | 4<<8   ;//设置EINT2 为 上升沿触发
rSRCPND = 1<<2;     //SRCPND写1清0
rINTPND = 1<<2;     //INTPND写1清0
pISR_EINT2 = (U32)Eint2_ISR;  //填入Eint2的中断向量
rINTMSK = rINTMSK & ~(1<<2);  //禁止EINT2的屏蔽
}


void   Eint2_ISR(void) __irq  //EINT2中断例程
{
Uart_Printf("你按了一次Eint2引脚的按键n"); 
rSRCPND = 1<<2;  //清楚EINT2中断标志
rINTPND = 1<<2;
}


void  Eint8_23_init(void)  //Eint8_23初始化
{
rGPGCON = rGPGCON & ~3<<6 |  2<<6  ; //设置GPG3 为 外部中断模式
rEXTINT1 = rEXTINT1 & ~7<<12 | 2<<12   ;//设置EINT11 为 下降沿触发
rEINTPEND = 1<<11;    //***EINTPEND中的 EINT11位 清0
rSRCPND = 1<<5;     //SRCPND中的 Eint8_23位 清0
rINTPND = 1<<5;     //INTPND中的 Eint8_23位 清0
pISR_EINT8_23 = (U32)Eint8_23_ISR;  //填入Eint8_23的中断向量
rEINTMASK = rEINTMASK & ~(1<<11);  //***禁止EINT11的屏蔽
rINTMSK = rINTMSK & ~(1<<5);  //禁止Eint8_23的屏蔽
}


void   Eint8_23_ISR(void) __irq  //EINT2中断例程
{
Uart_Printf("你按了一次Eint8_23引脚的按键n");
rEINTPEND = 1<<11;    //***EINTPEND中的 EINT11位 清0
rSRCPND = 1<<5;     //SRCPND中的 Eint8_23位 清0
rINTPND = 1<<5;     //INTPND中的 Eint8_23位 清0
}

//*******************************************************************


结果如下:


推荐阅读

史海拾趣

Dawn Electronics Inc公司的发展小趣事

在快速发展的同时,Dawn Electronics Inc公司始终关注社会责任。公司积极参与公益活动,支持教育、环保等事业。同时,公司还注重环保和可持续发展,采用环保材料和生产工艺,减少对环境的影响。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了坚实的基础。

AVG [AVG Semiconductors(HITEK)]公司的发展小趣事

随着技术的不断进步和产品的日益成熟,AVG开始积极寻求市场扩张的机会。公司先后进入多个国家和地区,通过设立分支机构和与当地企业建立合作关系,逐步扩大了市场份额。同时,AVG还注重品牌建设和提升,通过参加国际电子展会、举办技术研讨会等活动,提高了品牌知名度和影响力。这些举措使得AVG在全球电子行业中的地位逐渐提升。

ANADIGICS公司的发展小趣事

随着全球对可持续发展的关注度不断提高,AVG也积极响应这一趋势,将可持续发展理念融入公司的战略和运营中。公司注重环保和节能减排,采用环保材料和生产工艺,减少对环境的影响;同时,AVG还积极参与社会公益事业,为社会做出贡献。这些举措不仅提升了AVG的社会形象,也为公司的长远发展奠定了坚实的基础。

这些故事只是AVG Semiconductors(HITEK)在电子行业发展中众多精彩瞬间的一部分。通过技术创新、市场扩张、合作伙伴关系的建立以及应对挑战和危机的能力,AVG不断壮大自身实力,为电子行业的发展做出了重要贡献。未来,AVG将继续秉持创新精神和社会责任感,在电子行业中书写更加辉煌的篇章。

Allied Electronic & Semiconductor Technology Inc公司的发展小趣事

近年来,电子行业正经历着深刻的变革,传统半导体市场逐渐饱和,新兴领域如物联网、人工智能等蓬勃发展。面对这一行业变革,AE&ST公司果断进行转型升级。公司调整战略方向,加大在新兴领域的研发投入,同时优化生产流程,降低成本。通过一系列的改革措施,AE&ST公司成功实现了从传统半导体制造商向新兴技术领域的转型。

CANOPUS公司的发展小趣事

CANOPUS的产品逐渐赢得了全球音乐爱好者的喜爱。为了更好地满足市场需求,公司开始积极拓展海外市场。通过与当地经销商合作、参加国际展览等方式,CANOPUS的产品逐渐打入国际市场,并在全球范围内建立了良好的声誉。

BURGESS公司的发展小趣事

2001年对BURGESS来说是具有重要意义的一年。在这一年,BURGESS荣获了女皇赏,这是对其卓越业绩和贡献的极高认可。同时,BURGESS还售出了由Lurssen船厂制造的当时世界上最大的私人超级游艇,这一成就再次证明了其在游艇经纪行业的卓越地位。

问答坊 | AI 解惑

今年的大学生电子竞赛题目,大学生做的出来???

本帖最后由 paulhyde 于 2014-9-15 09:38 编辑 我看了半天,要我在3天3夜做出来,不可想象。 我都3年研发经验了,而且参加过05年的电子竞赛,是天津市2等奖。 可是,看到现在的题目,我怀疑是大学生能做出来的吗??? 如果真能大学生自己做出 ...…

查看全部问答>

盘点2009:中国光伏十大年度关键词

这个世界已经越来越有方向感,一群远见的精英思想正在汇聚成一张清晰的低碳线路图,供人类未来抵达。拯救地球环境,不能或缺中国力量。2009年度,中国光伏正在赶往一条叫做社会责任的低碳大道上。…

查看全部问答>

Camera 应用开发

平台:6410+WINCE6.0 新开一个贴,再讨论一下这个CAMERA应用开发,因为本人一直是做驱动的,现在要写应用,而且是COM接口的directshow,所以有很多东西要向大家请教,    用640X480分辩进行preview 和 拍照都没有问题,但是,我驱动给di ...…

查看全部问答>

讨论 WINCE5 2440 中堆和栈的分配问题

在一个线程中定义一个数组, 大小为320*240*8 定义1:U8 cData[320*240*8];   这个应该存在系统的stack里面,结果data abort失败了,提示就是stack的问题,于是重新 定义2:U8 *cData = new U8[320*240*8]  ,这个没有问题 ...…

查看全部问答>

无线遥控控制直流电机

按键控制无线遥控发送是脉冲 现在我想对接收板接收到无线模块发送的信号进行分析 1.如果只是单个脉冲电机就微动一下 2.如果是连续的脉冲,电机就保持转动状态,再发一个脉冲,电机才停止 现在不知道如何判断发送的是单个脉冲还是连续脉冲 请高 ...…

查看全部问答>

楼主,我能不能用DMA实现这个功能

我用双路AD同步采集,采集后的数据通过DMA传送的一个32位数组空间内,采集100次,100次后AD采样自动从从数组的开始位置存放。是不数不能实现这个功能啊?我怎么做不出来啊,我的数据只能采集16个,而且数据好像不是按我的要求去转换不同的通道…

查看全部问答>

TI 原厂LM3S8962板上调试部分的 CPLD 起到什么样的作用呢

TI  原厂LM3S8962板上调试部分的 CPLD 起到什么样的作用呢? 设计调试仿真器的时候,是否可以不用它?…

查看全部问答>

F2812断货原因

请问F2812为什么出现断货,什么时候恢复正常…

查看全部问答>

Unix环境高级编程 习题

附录A   函数原型 497附录B   其他源代码 512附录C   习题答案 518…

查看全部问答>