历史上的今天
返回首页

历史上的今天

今天是:2025年02月08日(星期六)

正在发生

2020年02月08日 | MICRO2440 中断学习

2020-02-08 来源:eefocus

S3C2440A 中的中断控制器接受来自60 个中断源的请求,部分中断源附带子中断源,他们共用一个中断源。两类中断:IRQ中断和FIQ中断,每一个中断都可以设为IRQ或FIQ,IRQ中断还需经过优先级判决器判定中断流程:以带子中断源的中断有中断为例:带子中断源的中断有中断长生,则子中断源请求寄存器(SUBSRCPND)相应位被置1,该位表明了是哪个子中断源长生的中断,然后看看该中断是否被屏蔽,该屏蔽由子中断屏蔽寄存器(SUBMASK)设置,然后源中断请求寄存器(SRCPND)相应为被置1,该位表明了是哪个中断源长生的,然后看看该中断是否被屏蔽,由中断屏蔽寄存器(MASK)设置,然后再看该中断被设为IRQ还是FIQ,该设置由中断模式寄存(MODE)设置,IRQ中断的话,还要看它的优先级,由优先级寄存器设定,最后得出优先级高的那个中断,在最终的中断请求寄存器(INTPND)中,相应的位被置1,最后等待着CPU响应中断。中断的清除顺序:首先清除SUBSRCPND,然后SRCPND,最后INTPND,清除标志位只须往相应的位写1即可中断优先级每个仲裁器的1 位仲裁器模式控制(ARB_MODE)和选择控制信号(ARB_SEL)的2 位控制优先级,如下:– 如果ARB_SEL 位为00b,优先级顺序为REQ0、REQ1、REQ2、REQ3、REQ4 和REQ5。– 如果ARB_SEL 位为01b,优先级顺序为REQ0、REQ2、REQ3、REQ4、REQ1 和REQ5。– 如果ARB_SEL 位为10b,优先级顺序为REQ0、REQ3、REQ4、REQ1、REQ2 和REQ5。– 如果ARB_SEL 位为11b,优先级顺序为REQ0、REQ4、REQ1、REQ2、REQ3 和REQ5。REQ0 的优先级总是最高并且REQ5 的优先级总是最低。通过改变ARB_SEL 位,可以轮换REQ1 到REQ4 的顺序。如果ARB_MODE 位被设置为0,ARB_SEL 位不能自动改变,这使得仲裁器操作在固定优先级模式中如果ARB_MODE 1,ARB_SEL 位会被轮换方式而改变,例如如果REQ1 被服务,ARB_SEL 位被自动改为01b 以便REQ1 进入到最低的优先级。ARB_SEL 改变的详细结果如下:– 如果REQ0 或REQ5 被服务,ARB_SEL 位不会改变– 如果REQ1 被服务,ARB_SEL 位被改为01b。– 如果REQ2 被服务,ARB_SEL 位被改为10b。– 如果REQ3 被服务,ARB_SEL 位被改为11b。– 如果REQ4 被服务,ARB_SEL 位被改为00b。IRQ类型的中断优先级,FIQ不存在,从上倒下,优先级依次降低中断向量:#define _RAM_STARTADDRESS  0x30000000#define _ISR_STARTADDRESS  0x33ffff00     #define _MMUTT_STARTADDRESS 0x33ff8000#define _STACK_BASEADDRESS 0x33ff8000#define HEAPEND    0x33ff0000#define _NONCACHE_STARTADDRESS 0x31000000#define pISR_RESET (*(unsigned *)(_ISR_STARTADDRESS+0x0))#define pISR_UNDEF (*(unsigned *)(_ISR_STARTADDRESS+0x4))#define pISR_SWI (*(unsigned *)(_ISR_STARTADDRESS+0x8))#define pISR_PABORT (*(unsigned *)(_ISR_STARTADDRESS+0xc))#define pISR_DABORT (*(unsigned *)(_ISR_STARTADDRESS+0x10))#define pISR_RESERVED (*(unsigned *)(_ISR_STARTADDRESS+0x14))#define pISR_IRQ (*(unsigned *)(_ISR_STARTADDRESS+0x18))#define pISR_FIQ (*(unsigned *)(_ISR_STARTADDRESS+0x1c))#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20))#define pISR_EINT1 (*(unsigned *)(_ISR_STARTADDRESS+0x24))#define pISR_EINT2 (*(unsigned *)(_ISR_STARTADDRESS+0x28))#define pISR_EINT3 (*(unsigned *)(_ISR_STARTADDRESS+0x2c))#define pISR_EINT4_7 (*(unsigned *)(_ISR_STARTADDRESS+0x30))#define pISR_EINT8_23 (*(unsigned *)(_ISR_STARTADDRESS+0x34))#define pISR_CAM (*(unsigned *)(_ISR_STARTADDRESS+0x38))#define pISR_BAT_FLT (*(unsigned *)(_ISR_STARTADDRESS+0x3c))#define pISR_TICK (*(unsigned *)(_ISR_STARTADDRESS+0x40))#define pISR_WDT_AC97 (*(unsigned *)(_ISR_STARTADDRESS+0x44))   #define pISR_TIMER0   (*(unsigned *)(_ISR_STARTADDRESS+0x48))#define pISR_TIMER1   (*(unsigned *)(_ISR_STARTADDRESS+0x4c))#define pISR_TIMER2 (*(unsigned *)(_ISR_STARTADDRESS+0x50))#define pISR_TIMER3 (*(unsigned *)(_ISR_STARTADDRESS+0x54))#define pISR_TIMER4 (*(unsigned *)(_ISR_STARTADDRESS+0x58))#define pISR_UART2 (*(unsigned *)(_ISR_STARTADDRESS+0x5c))#define pISR_LCD (*(unsigned *)(_ISR_STARTADDRESS+0x60))#define pISR_DMA0 (*(unsigned *)(_ISR_STARTADDRESS+0x64))#define pISR_DMA1 (*(unsigned *)(_ISR_STARTADDRESS+0x68))#define pISR_DMA2 (*(unsigned *)(_ISR_STARTADDRESS+0x6c))#define pISR_DMA3 (*(unsigned *)(_ISR_STARTADDRESS+0x70))#define pISR_SDI (*(unsigned *)(_ISR_STARTADDRESS+0x74))#define pISR_SPI0 (*(unsigned *)(_ISR_STARTADDRESS+0x78))#define pISR_UART1 (*(unsigned *)(_ISR_STARTADDRESS+0x7c))#define pISR_NFCON (*(unsigned *)(_ISR_STARTADDRESS+0x80))#define pISR_USBD (*(unsigned *)(_ISR_STARTADDRESS+0x84))#define pISR_USBH (*(unsigned *)(_ISR_STARTADDRESS+0x88))#define pISR_IIC (*(unsigned *)(_ISR_STARTADDRESS+0x8c))#define pISR_UART0 (*(unsigned *)(_ISR_STARTADDRESS+0x90))#define pISR_SPI1 (*(unsigned *)(_ISR_STARTADDRESS+0x94))#define pISR_RTC (*(unsigned *)(_ISR_STARTADDRESS+0x98))#define pISR_ADC (*(unsigned *)(_ISR_STARTADDRESS+0x9c))//中断处理程序,以__irq标明

void __irq IicISR(void)

{

       rSRCPND |= 0x1<<27;

       rINTPND |= 0x1<<27;

       flag = 0;                //清标志

}


//中断处理程序与中断源的并联


pISR_UART0 = (U32)uartISR;

       pISR_IIC = (U32)IicISR;








1,系统默认分配那几个向量地址

A,当然第一个是复位,复位程序那里禁用掉看门狗,设置各个中断模式的SP位置

注意:调用C函数,首先要设置好堆栈,例如main函数。

B,其他几个中断向量入口地址,当发生相应的中断后,系统自动跳到相应的入口地址处

2,中断处理程序:

a)      计算返回地址

b)      保护现场,压入那个模式的堆栈

c)       中断处理

d)      清除中断标志

e)       恢复现场

f)        中断返回

     

.global _start

_start:    

    b   Reset

HandleUndef:

    b   HandleUndef

 HandleSWI:

    b   HandleSWI

HandlePrefetchAbort:

    b   HandlePrefetchAbort

HandleDataAbort:

    b   HandleDataAbort

HandleNotUsed:

b   HandleNotUsed

HandleIRQ:

    b   HandleIRQ

HandleFIQ:

    b   HandleFIQ

 

Reset:                 

    ldr sp, =4096           @ 设置栈指针,因为以下都是C函数   bl  disable_watch_dog   @ 关闭看门狗否则CPU会不断重启

    msr cpsr_c, #0xd2       @ 进入中断模式

    ldr sp, =3072           @ 设置中断模式栈指针

    msr cpsr_c, #0xd3       @ 进入管理模式

    ldr sp, =4096           @ 设置管理模式栈指针,

                       @ 其实复位之后,CPU就处于管理模式,

    bl  init_led            @ 初始化LED的GPIO管脚

    bl  init_irq            @ 调用中断初始化函数,在init.c中

    msr cpsr_c, #0x53       @ 设置I-bit=0,开IRQ中断

   

    ldr lr, =halt_loop      @ 设置返回地址

    ldr pc, =main           @ 调用main函数

halt_loop:

    b   halt_loop

 

HandleIRQ:

    sub lr, lr, #4                  @ 计算返回地址

    stmdb   sp!,    { r0-r12,lr }   @ 保存使用到的寄存器

                             @ 注意,此时的sp是中断模式的sp

@ 初始值是上面设置的3072

    ldr lr, =int_return  @ 设置调用EINT_Handle函数的返回地址 

    ldr pc, =EINT_Handle   @ 调用中断服务函数在interrupt.c中

int_return:

    ldmia   sp!,    { r0-r12,pc }^  @ 中断返回, ^表示将spsr的值复制到cpsr

   

void EINT_Handle()

{

    unsigned long oft = INTOFFSET;

    unsigned long val;

    switch( oft )

    {

        // S2被按下

        case 0:

                 case1:

                      。。。。。

}

    //清中断

    if( oft == 5 )

        EINTPEND = (1<<11);   // EINT8_23合用IRQ5

    SRCPND = 1<    INTPND = 1<}

推荐阅读

史海拾趣

FEI Microwave Inc公司的发展小趣事

为了进一步增强自身的实力,FEI Microwave Inc公司积极寻求并购其他具有竞争力的企业。在经过一系列的考察和谈判后,FEI Microwave Inc公司成功收购了某家在微波滤波器领域具有领先技术的公司。这次并购不仅使FEI Microwave Inc公司在技术上得到了极大的补充,也为其在微波通信领域的发展奠定了更加坚实的基础。

API Technologies公司的发展小趣事

API Technologies的初创时期,正值电子行业的蓬勃发展期。公司面临着激烈的市场竞争和技术革新的挑战。然而,创始人凭借对电子技术的深刻理解和敏锐的市场洞察力,成功开发出了一系列高性能、高可靠性的电子元器件,迅速在市场中占据了一席之地。同时,公司也积极寻求与合作伙伴的合作,共同推动技术创新和市场拓展。

Chengdu Sino Microelectronics Technology Co Ltd公司的发展小趣事

面对日新月异的电子技术和不断变化的市场需求,成都华微科技始终坚持持续创新的发展理念。公司不断加大对新技术、新产品的研发投入,积极探索新的商业模式和市场机会。同时,公司还注重人才培养和团队建设,为公司的长远发展储备了丰富的人才资源。正是这种持续创新的精神,使成都华微科技在激烈的市场竞争中始终保持领先地位,引领着中国集成电路设计行业的未来发展。

这五个故事只是成都华微电子科技有限公司发展历程中的一部分,但它们足以展现出这家公司在电子行业中的坚定决心、技术实力、合作精神和创新能力。正是这些因素的共同作用,使成都华微科技能够在激烈的市场竞争中脱颖而出,成为电子行业的佼佼者。

Antelec公司的发展小趣事

Antelec公司创立于XXXX年,由一群富有远见和热情的电子工程师组成。创立初期,公司专注于研发先进的电子测量与分析技术,成功开发出一种具有高精度和稳定性的测量仪器,填补了市场上的空白。这一技术突破不仅赢得了客户的青睐,也为公司的后续发展奠定了坚实的基础。

Anpec(茂达)公司的发展小趣事

为了适应全球化的市场趋势,茂达电子制定了全面的全球化战略。公司不仅加强了与国际市场的联系,还积极寻求与国际知名企业的合作机会。同时,茂达电子还加大了对海外市场的投入,通过设立海外分支机构、参加国际展会等方式,不断提升品牌知名度和市场影响力。

这五个故事只是Anpec(茂达电子)发展历程中的一部分,但它们充分展示了茂达电子在电子行业中的崛起和成就。作为一家具有创新精神和市场洞察力的企业,茂达电子将继续致力于为客户提供优质的产品和服务,推动电子行业的持续发展。

CHONGQING PINGYANG ELECTRONICS CO.,LTD.公司的发展小趣事

在技术创新的基础上,重庆平洋电子有限公司积极拓展市场,不断提升品牌影响力。公司积极参与国内外各种电子展览和交流活动,与多家知名企业建立了战略合作关系。同时,公司还注重产品质量和售后服务,赢得了客户的信任和好评。随着品牌知名度的提升,公司的市场份额也逐年增长。

问答坊 | AI 解惑

模拟集成电路的分析与设计

一本老书,希望对大家有帮助!…

查看全部问答>

小车控制

本帖最后由 paulhyde 于 2014-9-15 09:15 编辑 小车控制 很好用 试过  …

查看全部问答>

在wince中,如何根据exe名称获得该进程ID?

我用VS2005 C# 现在知道目标程序的exe文件名 如何通过该文件名获得对应进程的ID? ProcessID …

查看全部问答>

怎样用单片机控制电源开关

第一次做开关的课题,不太了解……如果用电磁继电器控制,要用什么型号的呢?我用的是STC89C52单片机……如果能的话,顺便教一下具体使用方法,或者有datasheet   谢谢了~·…

查看全部问答>

MSP430电子教材分享

MSP430电子教材分享…

查看全部问答>

一个很好的C/C++小型IDE,绝对比vc6.0好!!!大家用了就知道!!!

       上一次在辛昕的蛊惑下自己用notepad++和gcc搭建了一个小型的IDE,那个是累啊!!用了感觉还不错,今天在看辛昕的帖子之后又知道了一个软件,c free,百度之找到了下载地址,http://www.skycn.com/soft/16427. ...…

查看全部问答>

【设计工具】关于复位的白皮书WQ272权威推荐

关于复位的白皮书WQ272权威推荐,是Xilinx的大牛写的…

查看全部问答>

請問這個用絕對值電路做 RMS-to-DC 的計算方式

大家好:         如图所示,我想做量测交流电压的有效值,下面的 U1D 和 U1A 运放构成差动式放大回路,工作频率是 10KHZ,上面左边的 U2D、U2A、U2B 构成仪表放大器,放大 R7 上的电压,接着送到 U1B 和 U2C 组成的全波整流 ...…

查看全部问答>

使用LPC1766以太网MAC+DP83640+交换机 实现分布式网络的时间同步 相关问题求教!!!

最近在学习使用LPC1766以太网MAC+交换机+DP83640 实现分布式网络的时间同步,请问以太网帧中的目标、源地址怎么确定? 阅读DP83640器件后发现下面这样的语句:这说明DP83640的地址固定就下面列举的这几个??(感觉不可能) 那如果我在3个4端口的 ...…

查看全部问答>