历史上的今天

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

正在发生

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

发布者:DazzlingSmile 来源: 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
}

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


结果如下:


关键字:裸机编程  外部中断 引用地址:2440裸机编程之四 外部中断

上一篇:S3C2410启动代码从ADSv1.2移植到KEIL For ARM uV4的方法
下一篇:2440裸机编程之三 通用I/O口

推荐阅读

根据韩媒报道,在梯子到不了的超高层建筑中进行火灾救助的时候,运用等机器人尖端技术结合的消防技术越来越多。 在爆炸、破坏、高温、有毒气体等危险的火灾现场,为了有效的帮助消防员镇压火灾并快速救出被困人员,可增加消防员肌肉力量的可穿戴型机器人开发越来越多。 根据11月8日韩国专利厅的消息,最近10年间(2008-2017年)韩国消防用无人机和机器...
0 引言示波器是一种用途十分广泛的电子测量仪器。电子技术的日新月异,使各类电信号越来越复杂,在工程应用中对信号实时采样率和波形捕获率也有较高的要求,数字示波器成了各个岗位的硬件开发和测试人员必不可少的工具。针对当前柔性工业测量系统的需要,本文给出DSP+CPLD的方案,实现了一种高精度、高集成的便捷式数字化存储示波器的设计,系统尽可能地...
PS5 即将上市,游戏开发商们也已经蓄势待发。昨天索尼 PlayStation 官方公布了动作游戏《神陨》(GodFall)的 PS5 发售预告。值得一提的是,《神陨》在 PS5 上将限时主机独占 6 个月(11 月 12 日发售,登陆 PS5 和 PC 平台),直到 2021 年 5 月 12 日为止,《神陨》届时便可能登陆其它游戏主机平台。上市预告展示了游戏剧情的大致...
这款革命性的Raspberry Pi Build HAT采用RP2040微控制器,可将Raspberry Pi计算机与乐高®拼搭系统进行集成中国上海,2021年11月8日– 安富利旗下全球电子元器件产品与解决方案分销商e络盟即将发售革命性产品Raspberry Pi Build HAT和电源,进一步扩大其Raspberry Pi系列产品阵容。Raspberry Pi Build HAT能够将Raspberry Pi计算机集成至乐高...

史海拾趣

问答坊 | AI 解惑

U盘文件读写模块的说明,单片机读写U盘

U盘文件读写模块的说明,单片机读写U盘…

查看全部问答∨

DSP必看

DSP入门必看(非常好的DSP扫盲文章) DSP入门必看(非常好的DSP扫盲文章)(ZZ)(7) 如何设置硬件断点? 在profiler ->profile point -> break point c54x的外部中断是电平响应还是沿响应? 是沿响应,准确的说,它要检测到100(一个clk的高 ...…

查看全部问答∨

基于MSP430单片机及USB总线的便携式血压计的设计

目前,市场上的血压计大部分仍是水银血压计,电子血压计在国外已经大量普及,而我国才开始应用。水银血压计每次测量必须由医生戴上听诊器进行测量, 测量过程复杂,而且不同的医生,测量结果可能不同。而电子血压计弥补了水银血压计的不足。本文使用低功 ...…

查看全部问答∨

求问wince下的数据库问题

数据库的类型不是 database么? 还有打开数据库的API: HANDLE CeOpenDatabaseEx(   PCEGUID pceguid,   PCEOID poid,   LPWSTR lpszName,   CEPROPID propid,   DWORD dwFlags, ...…

查看全部问答∨

请教PID控制温度的三个经验性参数? 还有开关量PID的问题

1)在公式△u=Kp * [e(n) - e(n-1)]            + Ki * e(n)            + Kd * [e(n) - 2e(n-1) + e(n-2)] 中,Kp,Ki,Kd三个参数我目前用的是4, 0.33, 4, 感 ...…

查看全部问答∨

怎样用waveOutOpen来打开一个设备呢...

我在代码中写 mr = waveOutOpen(&hWave, WAVE_MAPPER, pwfx, (DWORD)(UINT)hevDone, NULL, CALLBACK_EVENT);返回11,查了下MMSYSTEM是INVALID PARAMETER 改写成 mr = waveOutOpen(&hWave, -1, pwfx,0,0,0);试了下,仍然报同样的错 请问到底哪 ...…

查看全部问答∨

求助啊 data abort 的问题

Data Abort: Thread=82927640 Proc=8044c300 \'OffLine.exe\' (注:offline.exe为本人写的程序) 详细解释说明一下,那些都是什么东西啊? 还有这些 Data Abort: Thread=82a57bfc Proc=8044c3f0 \'OffLine.exe\' AKY=00080001 PC=03f81354( ...…

查看全部问答∨

请教串口驱动的问题

硬件流控设置后,当使能RTS,并且可以发送数据时,CTS信号有效是驱动程序实现,还是硬件自动使能的。如果是驱动的话,应该怎样做? 软件流控在中断中如何操作?谢谢!…

查看全部问答∨

mcu选择

做仪器需要一款MCU. 可扩展外部总线. 带LCD控制器可驱动彩色TFT带内部12bit AD、DA、目前我只对AT和STM32稍微熟..暂时STM32更适合..可FSMC只有16bit总线.扩展SRAM性能应该会受影响.(如果将变量存到外部SRAM).. 另外FSMC也 ...…

查看全部问答∨

avr设计功耗问题

最近学习了AVR M16 做了一个点阵的时钟 其中用7805做稳压 串联6节5号电池 即9V转换到5V用3个74HC595串接做列选 IO端口输出相应的段码 用timer0中断刷新点阵用timer2异步时钟32768K晶振 每0.5秒计时一次 实现时钟计时程序上问题不大 走了一天误差了2 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved