精华内容
下载资源
问答
  • 中断控制寄存器
    千次阅读
    2012-08-01 15:31:00

    用S3C2410的中断方式来控制I/O端口或部件操作时,除了要对I/O端口或者部件的相应寄存器进行初始化设置外,还需对中断控制器的5个控制寄存器进行初始化设置。这5个寄存器是:中断模式寄存器、屏蔽寄存器、优先级寄存器、中断未决寄存器。源未决寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器、中断未决寄存器。下面分别是5个寄存器的合适进行介绍。

    1、源未决寄存器

    SRCPND寄存器由32位构成,每一位与一个中断请求信号相关联。当某个中断源请求中断服务时,SRCPND寄存器的相应位被置为1,即首先在源未决寄存器中登记。因此该寄存器记录了哪个中断源的请求在等待处理。注意SRCPND寄存器的每一位由中断源自动设置,而不管中断屏蔽寄存器中对应的位是否被屏蔽,此外,SRCPND寄存器也不受中断控制器的优先级逻辑影响。

    2、中断模式寄存器

    S3C2410的中断模式有两种:FIQ模式和IRQ模式。32位的INTMOD寄存器中的每一位都与一个中断源相关联,确定对应的中断源请求采用哪种模式。如果某位被设置成1,则相应的中断按FIQ模式处理。若设置成0,则按IRQ模式处理,该模式又称为普通中断模式。

    3、中断屏蔽寄存器

    INTMSK寄存器也是由32为组成,每一位与一个中断源相对应。若某位设置为1,则中断控制器不会处理该位所对应的中断源提出的请求。如果设置为0,则对应的中断源提出的中断请求可以被处理。即使某屏蔽位设置为1,其对应的中断源产生中断请求时,相应的源未决位设置成1.

    4、优先级寄存器

    PRIORTY寄存器是IRQ中断模式下的中断优先级控制寄存器,每个中断源在寄存器中有3位对应,分别带别ARB_SEL的32位和ARB_MODE的一位。该寄存器的地址是0x4a00000c,复位初始状态为0x0000007f.

    5、中断未决寄存器

    INTPND寄存器是32位寄存器,寄存器中的每一位对应一个中断源。只有未被屏蔽且具有最高优先级、在源未决寄存器中等待出路的中断请求可以把去对应的中断未决位置1.因此INTPND寄存器只有一位可以设置为1,同时中断控制器产生IRQ信号给ARM920T核。在IRQ的中断服务例程里设计者可以读取该寄存器,从而获知哪个中断源被处理。

    出自文德数据:www.idcvendor.com

    转载于:https://www.cnblogs.com/give-love/archive/2012/08/01/2618399.html

    更多相关内容
  • 本文主要讲了单片机中断系统的控制寄存器IE和IP,希望对你的学习有所帮助。
  • C中断控制寄存器.pdf

    2021-11-06 23:03:12
    C中断控制寄存器.pdf
  • 5-02 中断控制寄存器.zip
  • 8051中断控制寄存器

    千次阅读 2013-11-18 13:55:22
    1.定时器/计数器控制寄存器TCON  定时器/计数器控制寄存器TCON的地址为88H,可以位读写,其功能如下: TCON.7 TCON.6 TCON.5 TCON.4 TCON.3 TCON.2 ...
    1.定时器/计数器控制寄存器TCON

        定时器/计数器控制寄存器TCON的地址为88H,可以位读写,其功能如下:

    TCON.7

    TCON.6

    TCON.5

    TCON.4

    TCON.3

    TCON.2

    TCON.1

    TCON.0

    TF1

    TR1

    TF0

    TR0

    IE1

    IT1

    IE0

    IT0

        ⑴TF1是定时器T1的溢出申请位。定时器T1被允许计数以后,从初值开始加1计数,当产生溢出时置TF1=1,向CPU请求中断。到CPU响应该中断后才由硬件清0,也可以由查询程序清0。

        ⑵TF0是定时器T0的溢出申请位。TF0实际上是T0中断触发器的一个输出端。

        ⑶IE1是外部中断INT1请求标志位。当CPU检测到在INT1管脚上出现低电平或脉冲下降沿的外部中断信号时,由硬件置位IE1=1,请求中断。CPU响应中断并运行中断服务程序后,如脉冲边沿触发方式,则IE1位被硬件自动清0。

        ⑷IT1是外部中断INT1请求控制位,由程序来置1或清0。

    IT1=0时,外部中断INT1被设置为电平触发方式,当INT1输入低电平时,置位IE1,申请中断,直到该中断被CPU响应。同时,在该中断服务程序执行完之前,外部中断源有效电平必须被撤消,否则将产生另一次中断。

    IT1=1时,外部中断1为边沿触发方式,CPU如果采样高电平到低电平跳变,则硬件自动对IE1置1,申请中断。CPU响应中断后,IE1由硬件自动清0。

        ⑸IE0是外部中断INT0请求标志位。

        ⑹IT0是外部中断INT0触发方式控制位。

    2.串行口控制寄存器SCON

        串行口控制寄存器SCON的地址为98H,SCON的低两位锁存串行口接收中断和发送中断源RI和TI。其功能如下:

    SCON.7

    SCON.6

    SCON.5

    SCON.4

    SCON.3

    SCON.2

    SCON.1

    SCON.0

     

     

     

     

     

     

    TI

    RI

        RI和TI是串行口内部中断申请标志位。⑴当串行口发送完一个字符后,由内部硬件置TI为1;⑵当串口接收完一个字符后,由内部硬件自动置RI为1。

        注意:在CPU响应串行口的中断时,并不清TI和RI中断标志为0,TI和RI必须有软件清0。

    3.中断允许寄存器IE

        中断允许寄存器IE的地址为0A8H,其功能如下:

    IE.7

    IE.6

    IE.5

    IE.4

    IE.3

    IE.2

    IE.1

    IE.0

    EA

     

    ET2

    ES

    ET1

    EX1

    ET0

    EX0

        ⑴EA是CPU中断总允许位。EA=1,CPU开放中断;EA=0,CPU屏蔽所有的中断请求。

        ⑵ES是串行中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。

        ⑶ET1是定时器T1的溢出中断允许位。ET1=1时允许T1溢出中断;反之依然。

        ⑷EX1是外部中断INT1中断允许位。EX1=1时,允许外部中断1中断;反之依然。

        ⑸ET0是定时计数器T0的溢出中断允许位。

        ⑹EX0是外部中断INT0允许位。

        8051系统复位后,IE中各位均被清0,即禁止所有中断。

    4.中断源优先级设定寄存器IP

        中断源优先级设定寄存器IP的地址为0B8H。8051单片机具有两个中断优先级,每个中断源可编程为高优先级中断或低优先级中断,并可实现二级中断嵌套。其功能如下:

    IP.7

    IP.6

    IP.5

    IP.4

    IP.3

    IP.2

    IP.1

    IP.0

     

     

    PT2

    PS

    PT1

    PX1

    PT0

    PX0

        ⑴PT2是定时器/计数器T2中断优先控制位。PT2=1,设定定时器T2为高优先级中断;PT2=0,为低优先级。

        ⑵PS是串行中断优先控制位。PS=1,设定串行口为高优先级中断;反之依然。

        ⑶PT1是定时器/计数器T1中断优先控制位。PT1=1,设定定时器T1为高优先级中断;反之依然。

        ⑷PX1是外部中断INT1中断优先控制位。PX1=1,设定外部中断INT1为高优先级中断;反之依然。

        ⑸PT0是定时器/计数器T0中断优先控制位。

        ⑹PX0是外部中断INT0中断优先控制位。

        8051复位后,IP低5位全部清0,将所有中断源设置为低优先级中断。

    展开全文
  • PS:SUBSRCPND寄存器的作用是对SRCPND寄存器的补充,因为ARM的寄存器是32位的,但是中断是不止这么多的,比如说INT_UART0,它就对应了SUBSRCPND寄存器的三个中断,分别是 UART0 error interrupt, UART0 ...
           作者:蔡于清  www.another-prj.com
    首先要感谢原文作者的奉献,在看到这一篇文章之后,确实有很大收获,清晰易懂。当然我这里也结合一些自己的认识,在一些地方加了自己的看法,括号内PS内容,那我也希望大家看的时候,如果有不一样的意见,或者是觉得要有完善和补充的地方,留言提出來,我们在蔡前辈的基础上來一起完善这篇文章,让更多的朋友有更多的收获。

            在进入正题之前,我想先把ARM920T的异常向量表(Exception Vectors)做一个简短的介绍。:
            ARM920T 的异常向量表有两种存放方式,一种是低端存放(从0x00000000处开始存放),另一种是高端存放(从0xfff000000处开始存放)。关于为什 么要分两种方式进行存放这点我将在介绍MMU的文章中进行说明,本文采用低端模式。ARM920T能处理有8个异常,他们分别是:
    Reset,Undefined instruction,Software Interrupt,Abort (prefetch),Abort (data),Reserved,IRQ,FIQ
    下面是某个采用低端模式的系统源码片段:

    _start:
    b Handle_Reset
    b HandleUndef
    b HandleSWI
    b HandlePrefetchAbort
    b HandleDataAbort
    b HandleNotUsed
    b HandleIRQ
    b HandleFIQ
    . .

    . .
    other codes

            上面这部分片段一般出现在一个名叫“head.s”的汇编文件里,“b Handle_Reset”这条语句就是系统上电之后运行的第一条语句。也就是说这部分代码的二进制码必须位于内存的最开始部分(这正是低端存放模式), 因为上电后CPU会从SDRAM的0x00000000处取第一条指令并执行。

    Address     Instruct
    0x00000000: b Handle_Reset
    0x00000004: b HandleUndef
    0x00000008: b HandleSWI
    0x0000000C: b HandlePrefetchAbort
    0x00000010: b HandleDataAbort
    0x00000014: b HandleNotUsed
    0x00000018: b HandleIRQ
    0x0000001C: b HandleFI

            上面是该程序段在系统上电后加载到内存后的分布情况,我们可以看到每条指令占用了4个字节。
            上电后,PC指针会跳转到Handle_Reset处开始运行。以后系统每当有异常出现,则CPU会根据异常号,从内存的0x00000000处开始查表 做相应的处理,比如系统触发了一个IRQ异常,IRQ为第6号异常,则CPU将把PC指向0x00000018地址 (4*6=24=0x00000018)处运行,该地址的指令是跳转到“中断异常服务例程”(HandleIRQ)处运行。以上就是我对异常向量表的一个 简单介绍。现在可以进入我们文章的主题 “中断异常处理”,s3c2410的中断分快中断(FIQ)和普通中断(IRQ),我们讨论的重点是普通中断(IRQ)。

     

    s3c2410的中断异常处理模块总共由以下寄存器构成
      SRCPND (SOURCE PENDING REGISTER)
      INTMOD (INTERRUPT MODE REGISTER)
      INTMSK (INTERRUPT MASK REGISTER)
      PRIORITY ( PRIORITY REGISTER)
      INTPND (INTERRUPT PENDING REGISTER)
      INTOFFSET (INTERRUPT OFFSET REGISTER)
      SUBSRCPND (INTERRUPT SUB SOURCE PENDING)
      INTSUBMSK   (INTERRUPT SUB MASK REGISTER)

     

    下面我将讲解每个寄存器在一个中断处理流程中所扮演的角色:
        SRCPND/ SUBSRCPND 这两个寄存器在功能上是相同的,它们是中断源引脚寄存器,在一个中断异常处理流程中,中断信号传进中断异常处理模块后首先遇到的就是SRCPND/ SUBSRCPND ,这两个寄存器的作用是用于标示出哪个中断请求被触发。SRCPND 的有效位为32,SUBSRCPND 的有效位为11,它们中的每一位分别代表一个中断源。SRCPND 为主中断源引脚寄存器,SUBSRCPND 为副中断源引脚寄存器。
    这里列举出SRCPND 的各个位信息:

     

            每个位的初始值皆为0。假设现在系统触发了TIMER0中断,则第10bit将被置1,代表TIMER0中断被触发,该中断请求即将被处理(若该中断没有被屏蔽的话)。SUBSRCPND 情况与SRCPND 相同,这里就不多讲了。(PS:SUBSRCPND寄存器的作用是对SRCPND寄存器的补充,因为ARM的寄存器是32位的,但是中断是不止这么多的,比如说INT_UART0,它就对应了SUBSRCPND寄存器的三个中断,分别是

    UART0 error interrupt, UART0 transmit interrupt, UART0 receive interrupt, 而这三个中断分别对应SUBSRCPND的第0,1,2三位 )
            INTMOD 寄存器有效位为32位,每一位与SRCPND 中各位相对应,它的作用是指定该位相应的中断源处理模式(IRQ还是FIQ)。若某位为0,则该位相对应的中断按IRQ模式处理,为1则以FIQ模式进行处理,该寄存器初始化值为0x00000000 ,即所有中断皆以IRQ 模式进行处理。(详细请参考s3c2410操作手册)。
            INTMSK/ INTSUBMSK 寄存器为中断屏蔽寄存器 ,INTMSK 为主中断屏蔽寄存器,INTSUBMSK 为副中断屏蔽寄存器。INTMSK 有效位为32,INTSUBMSK 有效位为11,这两个寄存器各个位与SRCPNDSUBSRCPND 分别对应。它们的作用是决定该位相应的中断请求是否被处理。若某位被设置为1,则该位相对应的中断产生后将被忽略(CPU不处理该中断请求),设置为0则对其进行处理。这两个寄存器初始化后的值是0xFFFFFFFF0x7FF ,既默认情况下所有的中断都是被屏蔽的。


            到目前为止我们总共讲解了 SRCPND,INTMOD,INTMSK,SUBSRCPND,INTSUBMSK
    五个寄存器,在继续讲解PRIORITY寄存器之前我们先来看一张图。
            先弄清楚一点,现在要讨论的是一个中断优先级的判断问题。为什么会有中断有先级的问题呢?我们知道CPU某个时刻只能对一个中断源进行中断处理,如果现在 有3个中断同时发生了,那CPU要按什么顺序处理这个3个中断呢?这正是引入优先级判断的原因所在,通过优先级判断,CPU可以按某种顺序逐个处理中断请 求。3sc2410的优先级判断分为两级。
             如上图所示, SRCPND 寄存器对应的32个中断源总共被分为6个组,每个组由一个 ARBITER(0~5) 寄存器对其进行管理。中断必须先由所属组的 ARBITER(0~5) 进行第一次优先级判断(第一级判断)后再发往 ARBITER6 进行最终的判断(第二级判断)。 ARBITER(0~5) 这六个组的优先级已经固定,我们无法改变,( PS:这里有跟作者意见不一样的地方,ARBITER0-5 的优先级并不是固定的,ARBITER6 就是控制ARBITER0-5 的优先级顺序的,我们可以看PRIORITY 寄存器的ARB_SEL6 ,如果是00b的话,那当然就是ARBITER0 > ARBITER1 > ARBITER 2 > ARBITER3 > ARBITER4 > ARBITER5 ,但如果ARB_SEL6是 01b的话,那就是0 >2>3>4>1>5了,这样的设计可以完善我们的优先级控制机制 )也就是说由 ARBITER0 控制的该组中断优先级最高(该组产生的中断进行第一级判断后永远会以REQ0向 ARBITER6 传递过去)其次是 ARBITER1, ARBITER2, ARBITER4, ARBITER4, ARBITER5 .我们能够控制的是某个组里面各个中断的优先级顺序。怎么控制?通过 PRIORITY 寄存器进行控制:]
    以下是PRIORITY寄存器各个位的参数表

            从表上我们可以知道PRIORITY 寄存器内部各个位被分为两种类型,一种是ARB_MODE ,另一种为ARB_SEL, ARB_MODE 类型有7组对应ARBITER(0~6)PS:原文表格不全,这里截了一个完整的图表,ARB_SEL 类型有7组对应ARBITER(0~6)。 现在我将以ARBITER2 为例,讲解中断组与PRIORITY 寄存器中ARB_SEL, ARB_MODE 之间的相互关系。
               首先我们看到ARBITER2寄存器管理的该组中断里包括了6个中断,分别是 INT_TIMER0,INT_TIMER1,INT_TIMER2,INT_TIMER3,INT_TIMER4,INT_UART2 ,她们的默认中断请求号分别为 REQ0,REQ1,REQ2,REQ3,REQ4,REQ5 。我们先看 PRIORITY 寄存器中的 ARB_SEL2 ,该参数由两个位组成,初始值为00。从该表可以看出00定义了一个顺序 0-1-2-3-4-5 ,这个顺序就是这组中断组的优先级排列,这个顺序指明了以中断请求号为0(REQ0)的INT_TIMER0具有最高的中断优先级,其次是INT_TIMER1,INT_TIMER2…。假设现在 ARB_SEL2 的值被我们设置为01。则一个新的优先级次序将被使用,01对应的优先级次序为 0-2-3-4-1-5 ,从中可以看出优先级最高和最低的中断请求和之前没有变化,但 本来处于第2优先级的INT_TIMER1中断现在变成了第5优先级 。从 ARB_SEL2 被设置为00,01,10,11各个值所出现的情况我们可以看出,除最高和最低的优先级不变以外,其他各个中断的优先级其实是在做一个 旋转排列rotate )。为了达到对各个中断平等对待这一目标,我们可以让优先级次序在每个中断请求被处理完之后自动进行一次旋转,如何自动让它旋转呢?我们可以通过 ARB_MODE2 达到这个目的,该参数只有1个 bit,置1代表开启对应中断组的优先级次序旋转,0则为关闭。事实上当该位置为1之后,每处里完某个组的一个中断后,该组的 ARB_SEL 便递增在1(达到11后恢复为00)。
        现在我们另 ARB_MODE2=1,ARB_SEL2=00, 则当前 ARBITER2 的优先级顺序为 0-1-2-3-4-5 ,假设现在该组的1号中断请求INT_TIMER1和2号中断请求INT_TIMER2被同时触发,CPU根据优先级判断后决定先把INT_TIMER1中断向 ARBITER6 进行发送(在ARBITER6做第最终优先级判断),接着再向 ARBITER6 发送INT_TIMER2中断。请注意,在INT_TIMER1被处理完毕后,该组中段的优先级次序被 自动做了一次旋转 ,旋转后 ARBITER2优先级顺序变为0-2-3-4-1-5 。假设之后某个时刻该组的INT_TIMER1和INT_TIMER2又被同时触发,则此时CPU优先处理的会是INT_TIMER2。若我们另ARB_MODE2=0,则改组的中断优先级次序在任何情况下都不做任何改变,除非我们 人为地重新设置了ARB_SEL2 的值。
        呼。。。好累。。。终于说完了麻烦的优先级-_-…继续。。。
    INTPND 寄存器可能是整个中断处理过程中我们要特别注意的一个寄存器了,他的操作比较特别,怎么特别?请听我慢慢道来.:]
    先看一下该寄存器各位详细功能列表
        正如你所见的, INTPND 寄存器与 SRCPND 长得一模一样,但他们在中断异常处理中却扮演着不同的角色,如果说 SRCPND 是中断信号进入中断处理模块后所经过的第一个场所的话,那么 INTPND 则是中断信号在中断处理模块里经历的最后一个寄存器。它的每个位对应一个中断请求,若该位被置1,则表示相应的中断请求被触发,描述到这里你可能会发现它不仅和 SRCPND 长得一模一样,就连功能都一样,其实不然,他们在功能上有着重大的区别。SRCPND是中断源引脚寄存器,某个位被置1表示相应的中断被触发,但我们知道在同一时刻内系统可以触发若干个中断,只要中断被触发了, SRCPND 的相应位便被置1, 也就是说SRCPND 在同一时刻可以有若干位同时被置1然而INTPND 则不同,他在某一时刻只能有1个位被置1 ,INTPND 某个位被置1(该位对应的中断在所有已触发的中断里具有最高优先级且该中断没有被屏蔽),则表示CPU即将或已经在对该位相应的中断进行处理。于是我们可以有一个总结: SRCPND说明了有什么中断被触发了,INTPND说明了CPU即将或已经在对某一个中断进行处理。
    特别注意:每当某一个中断被处理完之后,我们必须 手动地把SRCPND/SUBSRCPND , INTPND 三个寄存器中与该中断相应的位由1设置为0 ,刚才我说 INTPND 的操作很特别,它的特别之处就在于对当我们要把该寄存器中某个值为1的位设置为0时,我们不是往该位置0,而是 往该位置1 。假设 SRCPND=0x00000003,INTPND=0x00000001 ,该值说明当前0号中断和1号中断被触发,但当前正在被处理的是0号中断,处理完毕后我们应该这样设置 INTPND和SRCPND
      SRCPND="0x00000002"              //位0被置为0
      INTPND =0x00000001             //位0被置为0( 方法是往该位写入1
    INTOFFSET 寄存器的功能则很简单,它的作用只是用于表明哪个中断正在被处理。下面是该寄存器各位详细功能列表
        若当前INT_TIMER0被触发了,则该寄存器的值为10,以此类推。
        现在我把整个中断流程用一个图加以说明
    以上这个图清楚地说明了一个中断异常处理流程。
        下面我用INT_TIMER0, INT_TIMER2和INT_UART0三个中断完整地介绍一次中断异常处理。首先我们得做几个假设:
    假设1:这三个中断的屏蔽被取消。
    假设2: PRIORITY 寄存器中ARB_MODE2,ARB_MODE5皆为0,既不进行优先级的自动旋转排序,任何时候
           ARBITER2,ARBITER5 控制的中断组优先级次序分别为0-1-2-3-4-5和1-2-3-4。
    假设3:这三个中断皆为IRQ类型。
    假设4:这三个中断同时被触发。
    INT_TIMER0,INT_TIMER2和INT_UART0三个中断被同时触发,此时三个中断信号流向 SRCPND 寄存器,使该寄存器中的第10位,12位,28位被置为1,中断信号继续向前流经 INTMASK 寄存器,这三个中断都没有被屏蔽,于是信号进一步流经 INTMODE 寄存器,这三个中断皆为IRQ类型,故中断信号继续向前流向 PRIORITY 寄存器,经过优先级判断,INT_TIMER0中断信号使 INTPND 寄存器的第10位置1(INT_TIMER0优先级最高),此时 INTOFFSET 寄存器的值为10,CPU转向相应的中断服务例程进行处理。处理完毕后,我们的程序将 INTPNDSRCPND 的第10置为0,至此INT_TIMER0中断处理完毕。 此时SRCPND 的第12位,28位仍为1(这两个中断请求未被处理), 故他们会继续被CPU已刚才描述的方式进行处理。
    中断异常处理就先讲到这吧

    以上是原帖内容,再次感谢作者。。。

     

    PS

    在对 2410 的裸板进行中断实验的过程中,从菜鸟的角度出发,我把学到了一些东西和之前 ARM 体系结构的理论结合起来:

     

    1、 ARM 处理器中, r13 sp )和 r14 lr )分别对应 6 个不同状态下的物理寄存器,其中 1 个是用户、系统模式共用的,其他分别对应 5 种异常模式( Exception Mode )。要在后续程序中使用中断,则应先把要用到的各种模式的堆栈设置好,如设置 IRQ 和系统模式的 sp

    msr cpsr_c, #0xd2        @进入IRQ模式,IRQ和FIQ都处于禁止状态
    ldr sp, = 0x33000000

    msr cpsr_c, #0xdf        @进入系统模式,IRQ和FIQ都处于禁止状态
    ldr sp, = 0x34000000

    bl init_irq              @初始化中断
    msr cpsr_r, #0x5f        @置控制域的I位为0,打开irq中断。实验中只用到irq

          2、   如果用到按键等中断控制,是属于外部中断的( External Interrupt ),就需要配置 EINT 相关的寄存器。




     



    展开全文
  • 直接对STM32的寄存器操作来配置外部中断

            STM32F103在上课的时候只学习了基础的知识,可以通过老师给的例程来修改一些简单的功能,比如修改定时器的频率、修改ADC通道等;但是后面自己买了一块STM32F103C8T6的开发板,刚拿到手没有模板,发现自己点亮一个灯都很困难,后面又看了数据手册,对于以前用过的功能,如何去配置还是不太懂,以前学习的东西只是知其然而不知其所以然。

            现在有空闲时间了所以从头学习一下,希望可以从寄存器开始学习,今天学习了通过直接配置寄存器来配置外部中断,通过CSDN记录下来,加深自己印象,也方便以后回忆,要是里面有错误请多多指正。


            首先要了解的是ISER寄存器(Interrupt Set-Enable Registers),这是一个中断使能寄存器组,这个寄存器组可以在core_cm3.h这个文件中找到,下面这个是我在Keil中的截图:        

            CM3 内核支持 256 个中断,这里用 8 个 32 位寄存器来控制,每个位控制一个中断。

            STM32 的可屏蔽中断最多只有 68 个,这里有用的就是三个(ISER[0~2]),总共可以表示 96 个中断。而 STM32 只用了其中的前 68 位。

            ISER[0]的 bit0~31 分别对应中断0~31ISER[1]的 bit0~32 对应中断 32~63ISER[2]的 bit0~3 对应中断 64~67;这样总共 68 个可屏蔽中断就分别对应上了。要使能某个中断,必须设置相应的 ISER 位为 1。

            在STM32的头文件stm32f10x.h中可以查看每一个中断对应的中断号,在170行左右,如下图:         要想设置外部中断,就要先使能对应的中断,比如我要设置PA0外部中断,PA0这个中断源产生的外部中断是EXTI0,中断序号是6,也就是说ISER[0]的第6位控制着EXTI0_IRQn是否使能,往该位写1使能中断,如图:

    就可以使能EXTI0这个外部中断了。

            前面已经完成了大的中断的使能,接下来还有一系列的操作,STM32F103有19个外部中断,通过中断屏蔽寄存器(EXTI_IMR)就可以看出来,如下图:

            其中,位0到位15对应16根中断线的使能,这16根中断线可以连接到Px0~Px15(x位A、B、C、D....)的外部引脚上,比如要想配置PA1为外部中断,那么要把中断屏蔽寄存器(EXTI_IMR)的位0置1,当然这只是第一步。

            从数据手册里面可以看到配置中断的过程,如下:

            前面通过EXTI_IMR寄存器使能对应的中断线,然后要设置上升沿触发和下降沿触发通过

    EXTI_RTSR(Rising Trigger)和EXTI_FTSR( Falling Trigger)两个寄存器来设置,如下图:

             往对应寄存器的对应位写1就可以了,可以同时允许上升沿和下降沿触发。

            一根中断线只能选择一个外部输入引脚作为中断源,比如EXTI0这个中断线,它的外部中断源只能从Px0(PA0、PB0、PC0.....)等引脚中选择一个,通过往AFIO_EXTICRx(x=0、1、2、3)这个寄存器里面写入数据来选择具体哪一个引脚作为外部中断输入源。

            具体写什么数据可以看下面的表:        

             由4个位来决定一个中断线的中断源,比如往最低四位写入0,那么PA0就是中断线EXTI0的中断输入源,写往最低四位写入0001,那么PB0就是中断线EXTI0的中断输入源。写程序的时候要注意的是,在keil里面这样的寄存器一共有4个AFIO->EXTICR[0]AFIO->EXTICR[3]对应AFIO_EXTICR1到AFIO_EXTICR4.

            设置了外部中断源之后,然后通过SCB->AIRCR寄存器设置中断优先级分组,然后通过NVIC->IP设置中断优先级就可以了。

            

            上面就是配置STM32的外部中断的一个大致的流程,需要注意的是,在配置外部中断的时候,需要使能对应端口的时钟,把对应的引脚设置为输入模式,同时还要使能IO复用功能的时钟,即APB2 外设时钟使能寄存器(RCC_APB2ENR)的第一位AFIOEN然后再进行外部中断寄存器的配置。

            以配置PA0为外部中断为例,总的代码如下:

       //配置PA0为外部中断
        
        RCC->APB2ENR |= 1<<2 | 1<<0; //使能PA口时钟和AFIO复用功能时钟
        GPIOA->CRL &= 0xFFFFFFF0;
        GPIOA->CRL |= 0x00000008;     //配置PA0为上下拉输入
        GPIOA->ODR |= 1<<0;             //通过往ODR寄存器写1配置PA0为上拉输入
    
        
        
        NVIC->ISER[0] |= 1<<6;  //使能EXTI0这个外部中断
        EXTI->IMR |= 1<<0;      //使能EXTI0外部中断线
        EXTI->FTSR |= 1<<0;        //下降沿触发
        
        AFIO->EXTICR[0] |= 0x00; //配置PA0位外部中断输入源
        
        
        /*
        接下来是配置中断分组和中断优先级,中断分组配置一次之后会一直有效。
    
        就算不进行下面的配置,使用默认的也是可以的,这两个寄存器对应其他知识,以后再添加。
        配置中断分组 ------->>   SCB->AIRCR寄存器。
        配置中断优先级 ------->> NVIC->IP[x]寄存器,x为对应中断号。
        
        然后就完成了对中断的配置
        */
        

            然后到启动文件startup_stm32f10x_hd.s去找到中断服务函数的名称,从下面可以看到EXTI0的中断服务函数为EXTI0_IRQHandler。

             然后就可以写外部服务函数,触发中断后就会自动执行里面的代码。

    void EXTI0_IRQHandler(void)
    {
    	delay_ms(15);//按键消抖
    
    	/*
    	这里面写入要执行的代码
    	*/
    	
    	EXTI->PR |= 1<<0;//软件清除中断标志位
    }
    

            这里提到EXTI->PR寄存器,它是中断挂起寄存器。当外部中断线上发生了选择的边沿事件,该寄存器的对应位会被置为1,需要用软件置0。和前面的EXTI->IMR中断屏蔽寄存器一样的。

             以上就是配置外部中断的大致思路了。

    展开全文
  • STC学习:中断相关寄存器

    千次阅读 2021-08-19 09:53:42
    中断允许寄存器IE、IE2和INT_CLKO IE:中断允许寄存器(可位寻址) SFR name bit B7 B6 B5 B4 B3 B2 B1 B0 IE name EA ELVD EADC ES ET1 EX1 ET0 EX0 EA:CPU的总中断允许位,EA=1,CPU开放中断,EA=0,CPU...
  • 要正确应用ARM处理器必须首先对它的系统寄存器进行正确配置,下面简要介绍一下ARM寄存器,包括一些中断寄存器设置如中断状态(0x8000.0240,0x8000.1240,0x8000.2240)和中断屏蔽寄存器(0x8000.0280,0x8000....
  • arm中断控制寄存器详解

    千次阅读 2010-07-15 09:02:00
    s3c2410的中断异常处理模块总共由以下寄存器构成 SRCPND(SOURCE PENDING REGISTER) INTMOD(INTERRUPT MODE REGISTER) INTMSK(INTERRUPT MASK REGISTER) PRIORITY( PRIORITY REGISTER)...
  • 51单片机与中断相关的寄存器

    千次阅读 2020-05-22 15:52:51
    51单片机与中断相关的寄存器简介中断控制寄存器IE中断优先级控制寄存器IP定时器控制寄存器TCON串行口控制寄存器SCON 简介 中断控制寄存器 IE 中断优先级控制寄存器 IP 定时器控制寄存器 TCON 串行口控制寄存器 SCON...
  • 【stm32f103】stm32 外部中断寄存器版) 中断分类  STM32的EXTI控制器支持19 个外
  • 在具体操作串口之前需要对单片机的一些与串口有关的特殊功能寄存器进行初始化设置,主要是设置产生波特率的定时器1、串行口控制和中断控制
  • 2. CPRS 寄存器中的中断控制位 (1) CPRS 寄存器位 3. (1) CPRS 寄存器位 一. 中断控制 ( 基于 S3C6410 开发板 ) 本节 基于 S3C 6410 开发板, 不同的开发板 以及 不同 的芯片 中断控制机制是.....
  • S5PV210中的中断相关寄存器有很多,这里我只详细介绍我们常用的几个比较重要的寄存器: * VICnINTENABLE和VICnINTENCLEAR * VICnINTSELECT * VICnIRQSTATUS和VICnFIQSTATUS * VICnVECTPRIORITY0~VICnVECTPRIORITY31...
  • ARM中断控制寄存器介绍(1)

    千次阅读 2012-12-26 01:39:40
    1、s3c2410的中断异常处理模块总共由以下寄存器构成 SRCPND(SOURCE PENDING REGISTER) INTMOD(INTERRUPT MODE REGISTER) INTMSK(INTERRUPT MASK REGISTER) PRIORITY( PRIORITY REGISTER) INTPND...
  • 配置EXTI的中断屏蔽寄存器(EXTI_IMR); 配置具体触发引脚(SYSCFG_EXTICR); 配置中断允许(ISER);(当然也可以配置优先级分组,我这里不需要,因此省略) 首先看EXTI的中断/事件框图: 要想触发中断,首先...
  • 图为SPI操作控制寄存器的各位分配情况,表描述了各位的功能定义。  图 SPI操作控制寄存器(SPICTL)  表 SPI操作控制寄存器功能定义 欢迎转载,信息来源维库电子市场网(www.dzsc.com) 来源:ks99
  • 51单片机中断相关寄存器

    千次阅读 多人点赞 2018-12-31 15:52:58
    中断允许寄存器IE EA——全局中断 ES——串口中断 ET2——定时器2中断 EX1——外部中断1 ET1——定时器1 中断 EX0——外部中断0 中断优先级寄存器IP PS——串口 PT——计时器 PX——外部中断  置0...
  •  SUBSRCPND 寄存器被用来标识 INT_RXD0、INT_TXD0 等中断(S3C2410中这类中断有 11 个,而 S3C2440 中有 15 个)是否已经发生,每位对应一个中断。当这些中断发生并且没有被 INTSUBMSK 寄存器屏蔽,则它们中的若干位...
  • zynq中断寄存器操作

    千次阅读 2020-08-12 23:20:18
    zynq中断寄存器操作 概述: 1. Zynq的中断类型有: 软件中断(Software Generated Interrupt, SGI,中断号0-15)(16–26 reserved) 私有外设中断(Private Peripheral Interrupt, PPI,中断号27-31), 共享外设...
  • 寄存器 中断

    千次阅读 2020-08-25 11:05:08
    ISER[8]: ISER 全称是: Interrupt Set-Enable Registers,这是一个中断使能寄存器组。 有用的就是三个(ISER[0~2]]),总共可以表示 96 个中断。而 STM32F4 只用了其中的前 82 个。 ISER[0]的 bit0~31 分别对应...
  • CM3 内核支持 256 个中断,其中包含了 16 个内核中断和 240 个外部中断,并且具有 256 级的可编程中断设置。 但 STM32 并没有使用 CM3 内核的全部东西,而是只用了它的一部分。 STM32 有 84 个中断,包括 16 个...
  • ARM Cortex-M3与Cortex-M4中断相关寄存器

    千次阅读 2020-10-27 15:26:30
    NVIC寄存器列表 中断使能寄存器 ...中断和复位控制寄存器(AIRCR)、系统处理优先级寄存器(SCB->SHP[0-11]) 系统处理控制和状态寄存器(SCB->SHCSR) PRIMASK、FAULTMASK BAS...
  • 外部中断使用指南(寄存器设置)

    千次阅读 2021-05-23 08:28:58
    (寄存器:GPxxCON)例:②配置外部中断触发模式,上升沿触发,下降沿触发,双边触发,高电平触发,低电平触发(寄存器:EXT_INT_x_CON)例:③取消屏蔽外部中断(寄存器:EXT_INT_x_MASK)例:④通过向量中断控制器(VI...
  • Intc的verilog源代码,用于接收中断源的中断信号,并判断优先级,依次发给CPU,CPU通过查状态寄存器IFSR确定需要服务的中断源,从而按优先级执行中断服务程序。
  • 2、软件把CPU内部的A,B类寄存器的值等推入堆栈保存,把当前PC寄存器的值放入IRP/NRP寄存器中以备中断返回能找到当前被打断的位置。 3、CPU的PC指针读出中断向量表的地址,也就是把“ISTP寄存器的ISTB值+子中断向量...
  • 分析其中的CPU:(ALU、寄存器组、控制单元是必要的,其他非必要) 一个完整的CPU: 将ALU拿出来: 分析其中的Quiz: ① A + B = C 操作数:A B;运算:+;运算结果:C; 标志位:比如说用10+9=19,19...
  • 【单片机】常用寄存器(STC89C52)

    千次阅读 2021-07-03 16:24:13
    一、定时器0/1 1、控制寄存器 TCON为定时器/计数器T0、T1的控制寄存器,同时也锁存T0、T1溢出中断源和外部请求 中断源等,TCON格式如下: TCON : 定时器/计数器中断控制寄存器 (可位寻址)]

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 156,262
精华内容 62,504
关键字:

中断控制寄存器

友情链接: Pull-SDK-Demo-master.zip