精华内容
下载资源
问答
  • ARM 中断向量介绍

    2020-12-21 14:44:40
    最后,通过设置中断控制寄存器,设计外部中断EINT3的初始化程序,并给出主程序流程图。实践证明程序运行稳定可靠。引言计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种...

    验证的代码详细分析了基于ARM嵌入式系统的异常处理流程。然后阐明关键字“-irq”的作用,设计出中断处理函数。最后,通过设置中断控制寄存器,设计外部中断EINT3的初始化程序,并给出主程序流程图。实践证明程序运行稳定可靠。

    引言

    计算机体系结构中,异常或者中断是处理系统中突发事件的一种机制,几乎所有的处理器都提供这种机制。异常主要是从处理器被动接受的角度出发的一种描述,指意外操作引起的异常。而中断则带有向处理器主动申请的意味。但这两种情况具有一定的共性,都是请求处理器打断正常的程序执行流程,进入特定程序的一种机制。若无特别说明,对“异常”和“中断”都不作严格的区分。本文结合经过实际验证的代码对ARM9中断处理流程进行分析,并设计出基于S3C2410芯片的外部中断处理程序。

    1.异常中断响应和返回

    系统运行时,异常可能会随时发生。当一个异常出现以后,ARM微处理器会执行以下几步操作:

    1)  将下一条指令的地址存入相应连接寄存器LR,以便程序在处理异常返回时能从正确的位置重新开始执行。

    2)  将CPSR复制到相应的SPSR中。

    3)  根据异常类型,强制设置CPSR的运行模式位。

    4)   强制PC从相关的异常向量地址取下一条指令执行,从而跳转到相应的异常处理程序处。

    这些工作是由ARM 内核完成的,不需要用户程序参与。异常处理完毕之后,ARM微处理器会执行以下几步操作从异常返回:

    1)  将连接寄存器LR的值减去相应的偏移量后送到PC中。

    2)   将SPSR复制回CPSR中。

    3)   若在进入异常处理时设置了中断禁止位,要在此清除。

    这些工作必须由用户在中断处理函数中实现。为保证在ARM处理器发生异常时不至于处于未知状态,在应用程序的设计中,首先要进行异常处理。采用的方式是在异常向量表中的特定位置放置一条跳转指令,跳转到异常处理程序。当ARM处理器发生异常时,程序计数器PC会被强制设置为对应的异常向量,从而跳转到异常处理程序。当异常处理完成以后,返回到主程序继续执行。可以认为应用程序总是从复位异常处理程序开始执行的,因此复位异常处理程序不需要返回。

    2.异常处理程序设计

    2.1   异常响应流程

    由于向量表的限制,只能有一条指令B完成32MB范围内的跳转,并不能保证所有的异常处理函数都位于32MB范围内。为了扩展跳转范围,需要二次跳转才能把异常处理函数的地址传送给PC。异常处理调用关系如图1所示。

    三星公司网站提供了test2410_r11软件包,其中2410init.s有如下代码:

    HandlerXXX

    sub    sp,sp,#4   ;减少sp,保存跳转地址

    stmfd  sp!,{r0}    ;将工作寄存器压入堆栈

    ldr   r0,=HandleXXX ;将HandleXXX地址放入r0

    ldr     r0,[r0]   ;将中断程序入口地址放入r0

    str   r0,[sp,#4]  ;将中断程序入口地址压入堆栈

    ldmfd   sp!,{r0,pc}  ;将工作寄存器和中断程序入口地址弹出到r0和PC

    图1异常处理调用

    并且在RAM中定义了存有中断程序入口地址表_ISR_STARTADDRESS:

    AREA RamData, DATA, READWRITE

    ^   _ISR_STARTADDRESS

    HandleReset                 #   4

    HandleUndef               #   4

    HandleSWI                #   4

    HandlePabort           #   4

    HandleDabort           #   4

    HandleReserved         #   4

    HandleIRQ                #   4

    HandleFIQ                #   4

    通常HandlerXXX位于程序入口地址32MB范围内,HandleXXX是以_ISR_STARTADDRESS为基地址的RAM中地址。该代码主要实现跳转功能,把异常处理程序地址HandleXXX送到PC中。例如产生IRQ中断时,PC会被强制设置为0x18,执行指令:b  HandlerIRQ

    在HandlerIRQ程序段内,处理器做一些必要的处理,就会将_ISR_STARTADDRESS表中存放的IRQ入口地址送入PC,然后开始执行相关中断程序。由于_ISR_STARTADDRESS表存放在RAM中,后面的C语言程序可以方便地更改相关中断服务程序的内容。

    2.2   异常分支

    系统可能存在多个 IRQ/FIQ的中断处理程序。为了从向量表入口处的跳转最终能找到正确的中断处理程序,需要设计一套处理机制和方法来实现。可以在ARM的异常向量表之外,增加一张关联中断控制器的向量表,向量表中的内容对应每个具体的中断源,可以协助跳转到不同的中断处理程序。

    当响应外设的一个中断请求时,首先触发ARM核的中断,进人中断程序,再通过中断控制器识别中断源,使PC能够自动获得中断处理程序的地址。有的芯片支持特殊的硬件分支功能,依据中断源自动跳转到向量表的相应地址,多数情况下是用软件来处理异常分支。

    在S3C2410体系中,中断的调用可以看成是经历了2次“中断向量表”的查询。2410init.s中的以下代码完成功能就是查询中断偏移寄存器INTOFFSET,得到当前中断的中断号,并根据中断号再调用相关的中断服务程序。

    IsrIRQ

    sub    sp,sp,#4

    stmfd         sp!,{r8-r9}

    ldr     r9,=INTOFFSET

    ldr     r9,[r9]

    ldr     r8,=HandleEINT0

    add    r8,r8,r9,lsl #2

    ldr     r8,[r8]

    str     r8,[sp,#8]

    ldmfd         sp!,{r8-r9,pc}

    为了方便C程序使用中断,将IsrIRQ设为IRQ的中断服务程序。

    ldr     r0,=HandleIRQ

    ldr     r1,=IsrIRQ

    str     r1,[r0]

    其中HandleEINT0是用户自己开辟的一块存储空间的起始地址,后面按次序存放中断异常处理程序的地址,也可以理解为二级中断向量表。IsrIRQ从中断控制器处获取中断源信息,然后再从二级中断向量表中的对应地址单元得到异常中断处理程序的入口地址,完成异常响应的跳转。二级中断向量表一般位于 HandleFIQ的后面,也就是以_ISR_STARTADDRESS+0x20为起始地址,这里定义了S3C2410处理器所有中断源的相关中断处理处理程序入口。这种方法的好处是用户程序在运行过程中能够动态改变异常向量。

    2.3   中断函数设计

    为了方便高级语言设计中断处理函数,标准的ARM指令编译器提供了一个用来声明中断处理函数的关键字-irq,使用此关键字声明的函数可以被编译器识别为中断处理函数。编译后的代码在处理异常事件前保存现场信息,处理异常事件后对现场信息进行恢复。中断函数设计如下:

    static void __irq Eint3Int(void){

    ClearPending(BIT_EINT3);

    Uart_Printf("EINT3 interrupt is occurred.\n");

    num_int=3;设置标志位

    }

    定义中断处理程序入口地址:#define pISR_EINT3     (*(unsigned *)(_ISR_STARTADDRESS+0x2c))

    在初始化程序,引用代码pISR_EINT3=(U32)Eint3Int,即可定义地址_ISR_STARTADDRESS+0x2c内容是Eint3Int的地址,外部中断3产生请求时即可调用中断处理函数Eint3Int。

    3.外中断初始化程序设计

    S3C2410X 的中断控制寄存器能接收来自56个中断源的请求。内部的外围模块和外部管脚产生的多个中断请求通过中断控制器冲裁后,向ARM920T核发出FIQ或者 IRQ中断。ARM内核只有2个外部中断输入信号nIRQ和nFIQ,在具体嵌入式系统中,需要用中断控制器管理多个外部中断源,选择其中一个中断,通过 nIRQ或nFIQ向ARM内核发出中断请求,如图2所示。

    图2 FIQ/IRQ中断处理过程

    ARM920T内核可以识别正常中断请求和快速中断请求两种类型的外部中断,中断的行为模式由中断控制器来设置。S3C2410X的中断控制器包括6类寄存器:中断源状态寄存器、中断模式寄存器、中断屏蔽寄存器、优先级寄存器、中断状态寄存器,以及中断偏移寄存器。

    在初始化程序中,需要选择相应管脚的功能,在此定义GPF3为EINT3模式,通过外部中断控制寄存器EXTINT0设定EINT3是下降沿触发方式,通过设置中断源悬挂寄存器SRCPND、中断悬挂寄存器INTPND和中断屏蔽寄存器INTMSK开启EINT3。中断模式寄存器和中断优先级寄存器采用系统默认方式。具体代码实现如下:

    void Eint_Init(void){

    rGPFCON = (rGPFCON & 0x3f0c)|(1<<7);

    rEXTINT0 = (rEXTINT0 & ~(0x7<<12)) | 0x2<<12;

    pISR_EINT3=(U32)Eint3Int;

    图3 主程序流程图

    rSRCPND = BIT_EINT3;

    rINTPND = BIT_EINT3;

    rINTMSK=~( BIT_EINT3);

    }

    如果采用EINT4~EINT23之间的中断源,还需要设置外部中断悬挂寄存器EINTPEND和外部中断掩码寄存器EINTMASK的相关位。

    在C语言的Main()程序中调用Eint_Init()函数,即可完成中断处理的初始化操作。操作流程如图3所示。

    若外部下降沿信号接到GPF3管脚,就可以调用Eint3Int中断处理函数。

    5.结论

    本文作者创新点在于采用的异常处理程序设计方式灵活可靠,可以在系统运行期间动态修改中断向量表,利用C语言也可实现中断处理函数的动态配置。在所设计的键盘处理程序中采用该方法,取得了很好地效果,该方法具有很强的通用性。

    来源:[http://www.jdzj.com]机电之家·机电行业电子商务平台!

    展开全文
  • 然后把内核外设的中断服务函数的地址放在这个数组里面,数组的下标跟中断的优先级对应,我们也把这个中断的编号叫做中断向量。 3、在启动文件执行的时候,内核每个外设的中断服务函数的地址都是已经确定好的,...

    STM32的中断向量表是干什么的?到底有什么用?它放在哪里?

    一、中断向量表里有什么?它放在那里?到底有什么用?
    1、中断向量表实际上就是存放在Code区(也就是STM32内部的Flash区)从0x00000000地址开始的一个数组,数组的成员为4个字节,而且这些数组在启动文件的时候已经初始化好。

    2、STM32根据内核和外设中断优先级,同一标号,标号越小,优先级越大。然后把内核和外设的中断服务函数的地址放在这个数组里面,数组的下标跟中断的优先级对应,我们也把这个中断的编号叫做中断向量。

    3、在启动文件执行的时候,内核和每个外设的中断服务函数的地址都是已经确定好的,地址就存放在中断向量表中,而且在启动文件里面已经写好了中断服务函数,只是这些中断服务函数为空,而且带[weak]弱定义,那么我们就需要在C文件里面重新实现这个中断服务函数,用户写这个中断服务函数的时候,函数名必须跟启动文件里面写的中断函数名对应,因为函数名对应的就是中断服务函数的地址,如果中断服务函数名和启动文件的名字不一样,就默认启动文件里面预先写好的空的中断服务函数,而且是一个死循环,程序就会一直卡死在中断服务函数里面。

    二、那内核是如何响应中断的呢?
    当中断来临的时候,首先取向量,每个中断的中断向量不一样,然后根据向量查询中断向量表,根据里面的地址找到中断服务函数,从而实现整个中断的响应过程。
    https://blog.csdn.net/ZDQ1431/article/details/106374285?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164056830016780271563120%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164056830016780271563120&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-12-106374285.pc_search_result_cache&utm_term=%E5%BC%82%E5%B8%B8%E5%90%91%E9%87%8F%E8%A1%A8%E5%92%8C%E4%B8%AD%E6%96%AD%E5%90%91%E9%87%8F%E8%A1%A8&spm=1018.2226.3001.4187

    【中断】异常和中断的关系、异常向量表和中断向量表的关系

    https://blog.csdn.net/Ivan804638781/article/details/116212899?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164056830016780271563120%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164056830016780271563120&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-2-116212899.pc_search_result_cache&utm_term=%E5%BC%82%E5%B8%B8%E5%90%91%E9%87%8F%E8%A1%A8%E5%92%8C%E4%B8%AD%E6%96%AD%E5%90%91%E9%87%8F%E8%A1%A8&spm=1018.2226.3001.4187

    【嵌入式开发】ARM 异常向量表 ( 异常概念 | 异常处理流程 | 异常向量 | 汇编代码 )

    异常向量概念 : 当异常发生的时候, 程序被强行从一个固定的内存地址执行, 每个种类的异常都有对应的一固定内存地址, 这个内存地址就是异常向量 ;

    异常类型 : ARM 架构 支持 七种类型的异常,
    1.Reset : 处理器在工作时, 突然 按下重启键, 就会触发该异常;
    2.Undefined instructions : 处理器无法识别指令的异常, 处理器执行的指令是有规范的, 如果 尝试执行 不符合要求的指令, 就会进入到该异常指令对应的地址中;
    3.Software interrupt (SWI) : 软中断, 软件中需要去打断处理器工作, 可以使用软中断来执行 ;
    4.Prefetch Abort (instruction fetch memory abort) : 预取指令失败, ARM 在执行指令的过程中, 要先去预取指令准备执行, 如果预取指令失败, 就会产生该异常;
    5.Data Abort (data access memory abort) : 读取数据失败;
    6.IRQ (interrupt) : 普通中断;
    7.FIQ (fast interrupt) : 快速中断, 快速中断要比普通中断响应速度要快一些;

    原文链接:https://blog.csdn.net/shulianghan/article/details/80163777

    x86中断向量表

    https://blog.csdn.net/duguteng/article/details/7552774?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164056830016780271563120%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164056830016780271563120&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-14-7552774.pc_search_result_cache&utm_term=%E5%BC%82%E5%B8%B8%E5%90%91%E9%87%8F%E8%A1%A8%E5%92%8C%E4%B8%AD%E6%96%AD%E5%90%91%E9%87%8F%E8%A1%A8&spm=1018.2226.3001.4187

    展开全文
  • 51内核的最基础的中断源请求有外部中断、定时器中断和串口中断,这也是学习开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM等。以外部中断0为例,在编程中常使用的方式为:void INT0()interrupt 0 using...

    51内核的最基础的中断源请求有外部中断、定时器中断和串口中断,这也是学习和开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM等。以外部中断0为例,在编程中常使用的方式为:

    void INT0()interrupt 0 using 1

    {

    ……

    }

    在这里特别做上笔记:其中前面的void INT0() 只是代表一个普通没有形参的函数而已,函数名写成什么都是可以的,这个到不重要。那么后面的就一个一个词的扣把:(2-1-i-c-中国-电子网,防抓取)

    其中 interrupt n 组成一组,n用来指明中断号,在函数后使用了interrupt关键字后,就会自动的生成中断向量,51内核中断号如下图,这是我今天查的正在使用的MCU:

    c73cae3f2694bd04ab69562ea472b16c.png

    例如:

    12

    interrupt 1 指明是定时器中断0;

    interrupt 2 指明是外部中断1;

    interrupt 3 指明是定时器中断1

    。。。

    对于51内核的MCU,不同厂家及不同型号的内部资源会有所不同,上图是我正在开发的一款中颖SH88F516单片机,由上图可见内部资源还算可以,能够满足一般的产品。后面的using n 指的是使用第n组寄存器。这个之前我在使用的过程中往往忽略了这个,也没有出现什么问题。但是今天注意到这个问题,查完资料后用上发现效果还不如不用,很有肯能是没有把这个知识用好的原因把。对比之后给我的感觉是在使用C语言写程序时,能不用就不用吧。查资料解释说假如在中断函数中使用了using n,中断不再保存R0-R7的值,这也就意味着假如一个高优先级的中断及一个低优先级的中断同时使用了using n,而这个n恰恰相等,那就等着哭把,因为这个BUG还真不是那么好找出来的(今天我就遇到了这个问题)。21ic整理

    其次就是中断优先级的问题了,如图上面的中断表,在右侧第二栏标的很清楚,除了复位之外,就数外部中断0优先级最高了,依次往下排列,那么问题来了,今天刚好就碰到了需要串口0的优先级比定时器0的优先级高。没办法,只好接着啃数据手册,还好这寄存器不多,一会就查到了下表和相关的描述:

    88d5cf0f83b45916893ac7e06024e9ab.png

    所以按照描述修改下优先级就可以达到目的了。

    总结:用到回过头来用到51的中断,发现有些东西在之前学习的时候并没有太在意,导致现在在开发产品上使用的时候不清楚用途。因为工作跟学习性质是不一样的,作为开发者的角度来说,质量往往是第一要求。同时会接触到很多新鲜的事物和技术,但是话又说回来了,最基本的知识还是需要打牢。

    展开全文
  • 向量中断控制器 向量的意思是有值有方向。向量中断的意思是,发生中断后按照指定的值跳转到中断服务函数执行。 中断控制器顾名思义,控制中断 向量 中断向量表 在一张表上记录各种中断它的中断处理函数跳转地址。 ...

    向量中断控制器
    向量的意思是有值有方向。向量中断的意思是,发生中断后按照指定的地址值跳转到中断服务函数执行(默认stm32f4xx_it)。
    中断控制器顾名思义,控制中断

    向量

    中断向量表
    在一张表上记录各种中断和它的中断处理函数跳转地址。
    有点像一本书的目录,ARM 把目录设计好,发生中断的时候跳转到什么地方执行什么样的处理,由开发者设计。
    所以在Cortex M3内核设计阶段,这张表就已经确定下来,它有一个默认的位置。

    在这里插入图片描述

    按照顺序逐一排序。
    当中断或者异常发生的时候,硬件就会自动的跳转到对应的地址上,然后取出跳转地址。这些都是硬件动作。
    这部分的初始化动作,一般是放在处理器s文件上startup code
    在这里插入图片描述
    列举一下s文件的向量标初始化动作

    ; Vector Table Mapped to Address 0 at Reset
                    AREA    RESET, DATA, READONLY
                    EXPORT  __Vectors
                    EXPORT  __Vectors_End
                    EXPORT  __Vectors_Size
    
    __Vectors       DCD     __initial_sp               ; Top of Stack
                    DCD     Reset_Handler              ; Reset Handler
                    DCD     NMI_Handler                ; NMI Handler
                    DCD     HardFault_Handler          ; Hard Fault Handler
                    DCD     MemManage_Handler          ; MPU Fault Handler
                    DCD     BusFault_Handler           ; Bus Fault Handler
                    DCD     UsageFault_Handler         ; Usage Fault Handler
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     SVC_Handler                ; SVCall Handler
                    DCD     DebugMon_Handler           ; Debug Monitor Handler
                    DCD     0                          ; Reserved
                    DCD     PendSV_Handler             ; PendSV Handler
                    DCD     SysTick_Handler            ; SysTick Handler
    
                    ; External Interrupts
                    DCD     WWDG_IRQHandler            ; Window Watchdog
                    DCD     PVD_IRQHandler             ; PVD through EXTI Line detect
                    DCD     TAMPER_IRQHandler          ; Tamper
                    DCD     RTC_IRQHandler             ; RTC
                    DCD     FLASH_IRQHandler           ; Flash
                    DCD     RCC_IRQHandler             ; RCC
                    DCD     EXTI0_IRQHandler           ; EXTI Line 0
                    DCD     EXTI1_IRQHandler           ; EXTI Line 1
                    DCD     EXTI2_IRQHandler           ; EXTI Line 2
    

    这里已经定义好中断函数的函数名称,也就是入口。

    这是默认的向量地址,cortexM3提供了一个向量偏移寄存器。就是说除了默认的向量表可用还可以自己去编辑。
    移寄存器 就是这套新表的首地址。

    使能,除能

    每一个中断对应一个使能位
    在这里插入图片描述

    挂起,pend

    如果中断发生时,正在处理同级或高优先级异常,或者被掩蔽,则中断不能立即得到响
    应。此时中断被悬起。中断的悬起状态可以通过“中断设置悬起寄存器(SETPEND)”和“中
    断悬起清除寄存器(CLRPEND)”来读取,还可以写它们来手工悬起中断。
    在这里插入图片描述

    优先级

    没有什么好说的,8Bit变成3BIt的高低对齐

    活动

    每个外部中断都有一个活动状态位。在处理器执行了其 ISR 的第一条指令后,它的活动
    位就被置 1,并且直到 ISR 返回时才硬件清零。由于支持嵌套,允许高优先级异常抢占某个
    ISR。然而,哪怕一个中断被抢占,其活动状态也依然为 1
    core_CM3.h

    typedef struct
    {
      __IO uint32_t ISER[8];                      /*!< Offset: 0x000  Interrupt Set Enable Register           */
           uint32_t RESERVED0[24];                                   
      __IO uint32_t ICER[8];                      /*!< Offset: 0x080  Interrupt Clear Enable Register         */
           uint32_t RSERVED1[24];                                    
      __IO uint32_t ISPR[8];                      /*!< Offset: 0x100  Interrupt Set Pending Register          */
           uint32_t RESERVED2[24];                                   
      __IO uint32_t ICPR[8];                      /*!< Offset: 0x180  Interrupt Clear Pending Register        */
           uint32_t RESERVED3[24];                                   
      __IO uint32_t IABR[8];                      /*!< Offset: 0x200  Interrupt Active bit Register           */
           uint32_t RESERVED4[56];                                   
      __IO uint8_t  IP[240];                      /*!< Offset: 0x300  Interrupt Priority Register (8Bit wide) */
           uint32_t RESERVED5[644];                                  
      __O  uint32_t STIR;                         /*!< Offset: 0xE00  Software Trigger Interrupt Register     */
    }  NVIC_Type; 
    

    NVIC结构体和NVIC寄存器对应。

    typedef struct
    {
      uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.
                                                       This parameter can be an enumerator of @ref IRQn_Type 
                                                       enumeration (For the complete STM32 Devices IRQ Channels
                                                       list, please refer to stm32f4xx.h file) */
    
      uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel
                                                       specified in NVIC_IRQChannel. This parameter can be a value
                                                       between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                       A lower priority value indicates a higher priority */
    
      uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified
                                                       in NVIC_IRQChannel. This parameter can be a value
                                                       between 0 and 15 as described in the table @ref MISC_NVIC_Priority_Table
                                                       A lower priority value indicates a higher priority */
    
      FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
                                                       will be enabled or disabled. 
                                                       This parameter can be set either to ENABLE or DISABLE */   
    } NVIC_InitTypeDef;
    
    

    NVIC配置结构体
    NVIC_IRQChannel 也就是中断向量索引,代表需要去配置哪个中断
    Priority有抢占优先级,和子优先级
    NVIC_IRQChannelCmd ENABLE/DISABLE

    外部事件管理器
    在这里插入图片描述
    输入线一般是GPIO,经过边沿检测可以探知输入线发生了变化,可以是上边沿检测也可以是下边沿检测。
    软件中断事件寄存器和检测边沿的信号取或运算,说明软件中断可以和外部电平变化一样产生事件源。
    脉冲发生器的作用是探知事件,他的输出作为MCU的内部信号可以链接到其他模块上。事件源通过中断屏蔽寄存器,挂起
    请求寄存器输入到NVIC中,产生中断请求
    对应的中断为EXTI系列

      EXTI0_IRQn                  = 6,      /*!< EXTI Line0 Interrupt                                              */
      EXTI1_IRQn                  = 7,      /*!< EXTI Line1 Interrupt                                              */
      EXTI2_IRQn                  = 8,      /*!< EXTI Line2 Interrupt                                              */
      EXTI3_IRQn                  = 9,      /*!< EXTI Line3 Interrupt                                              */
      EXTI4_IRQn                  = 10,     /*!< EXTI Line4 Interrupt                                              */
      EXTI9_5_IRQn                = 23,     /*!< External Line[9:5] Interrupts  
      EXTI15_10_IRQn              = 40,     /*!< External Line[15:10] Interrupts   
    

    所有的外部事件,只能通过上面的中断索引得到相应。
    在这里插入图片描述
    GPIOx 对应EXTIx (x = 1,2,3…15)
    另外七根 EXTI 线连接方式如下:
    ● EXTI 线 16 连接到 PVD 输出
    ● EXTI 线 17 连接到 RTC 闹钟事件
    ● EXTI 线 18 连接到 USB OTG FS 唤醒事件
    ● EXTI 线 19 连接到以太网唤醒事件
    ● EXTI 线 20 连接到 USB OTG HS(在 FS 中配置)唤醒事件
    ● EXTI 线 21 连接到 RTC 入侵和时间戳事件
    ● EXTI 线 22 连接到 RTC 唤醒事件

    所以GPIOx是固定链接到EXTIx上。
    需要配置GPIOyx y= A,B,C… x= 1,2,3…
    也就是说要明确是哪组的GPIO链接到了EXTI line上。
    在这里插入图片描述
    例如EXTI15 ,是PC15还是PD15还是Px15接着
    EXTI Line
    在这里插入图片描述
    接着配置边沿检测,和通路选择,是中断还是产生脉冲

    以PE1 为例

    在这里插入图片描述
    在这里插入图片描述
    所谓配置就是打通这条路 。

    void EXTI_config(void)
    {
    
      EXTI_InitTypeDef   EXTI_InitStructure;
      GPIO_InitTypeDef   GPIO_InitStructure;
      NVIC_InitTypeDef   NVIC_InitStructure;
    
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
    
       /* Configure PE2 pin as input floating */
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
      GPIO_Init(GPIOE, &GPIO_InitStructure);
    
      /* Connect EXTI Line0 to PE2 pin */
      SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);
    
      /* Configure EXTI Line2 */
      EXTI_InitStructure.EXTI_Line = EXTI_Line2;
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
      EXTI_InitStructure.EXTI_LineCmd = ENABLE;
      EXTI_Init(&EXTI_InitStructure);
    
      /* Enable and set EXTI Line2 Interrupt to the lowest priority */
      NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
      NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;
      NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;
      NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
      NVIC_Init(&NVIC_InitStructure);
    }
    
    
    

    在这里插入图片描述
    在这里插入图片描述
    请求中断悬起寄存器的代表Input Line信号已经发生事件,如果INterrupt MASK也是1 的话,那么这路信号就会进入NVIC
    通过这个办法可以判断具体是哪一路信号发生悬起。

    展开全文
  • 1、中断和事件区别 从外部激励信号来看,中断和事件没有区别。从处理来看,中断会向CPU残剩请求,需要CPU响应中断程序。事件则是对其他模块发出的脉冲信号,具体其他设备如何响应,就由这个模块决定。 2、配置 1、...
  • 本文档的主要内容详细介绍的是51单片机内核的中断及中断向量的详细资料说明。51内核的最基础的中断源请求有外部中断、定时器中断串口中断,这也是学习开发者最长用的。当然还有其他的中断源,比如ADC、SPI、PWM...
  • 这里系统时钟一样,完全可以直接用 cubeMX来进行配置,没必要自己手动配置。 SysTick的主要功能是给RTOS提供时钟节拍做时间基准。HAL库自带的延时函数就是通过它来延时的,但其实这并不值得推荐,一般都是用...
  • CLI ;关中断
  • IC基础知识(十)中断向量地址

    千次阅读 2020-12-24 09:15:42
    中断向量地址
  • PIC24EP64GP204的中断向量表包含7个不可屏蔽陷阱向量多达246个中断源,每个中断源都有自己的中断向量,每个中断向量都包含一个24位宽的地址。每个中断向量单元中编程的值是相关的中断服务程序的起始地址。如下表...
  • keil 51 使用C语言中断向量keil 51 使用C语言中断向量中断源的矢量位置中断源 Keil中断编号 矢量地址最高优先级 6 0x0033外部中断0 0 0x0003定时器0溢出 1 ...
  • 我在IAR里面写软件的,找不到它的向量号,其它的好像都有。#define AWU_vector 0x03#define CLK_CSS_vector 0x04#define CLK_SWITCH_vector 0x04#define SPI_RXNE_vector...
  • 思路的整理:中断的设计 中断的类型 问题1:Java/Js 等语言为什么可以捕获到键盘输入? 问题2:操作系统可以处理键盘按键可以理解,那么我们开机的时候也可以使用键盘,但是那时候操作系统还.
  • Linux中断知识汇总: 【深入理解Linux内核】【中断】内容汇总帖 目录 什么是异常?...从这句话中可以知道异常包括中断(单片机中的中断)+运行模式的切换“中断”+资源访问“中断”。 ..
  • ARM9的中断控制器

    2020-12-21 14:44:42
    然后查询当前中断状态寄存器),硬件会操控PC跳到中断向量入口(IRQ_HANDLE,硬件控制的只要是IRQ中断类型就会进入),在中断跳转函数里面保存现场(保存R0等等工作寄存器)--跳到服务函数(里面进行中断源判断处理)---...
  • 在做IAP升级时,更改了中断向量表app程序存储位置,再烧录程序时程序仍旧从0x0800 0000开始烧录,导致将Bootloader程序擦除。 解决办法: 在工程中在OBJ文件夹下新建xxx.sct的文件,或者从已有程序中复制 .sct...
  • 这篇文章已经说了 STM32 的启动过程:...从stm32f10x.s可以看到,已经定义好了一大堆的中断响应函数,这就是 中断向量表 ,标号__Vectors,表示中断向量表入口地址,例如:AREA RESET...
  •  但是编译说超出范围,报出下面的错误 Error[Lp004]: actual size (0x100) exceeds maximum size (0x80) for block “INTVEC” 因为芯片内部指定中断向量的地址范围就是0x80,有说把icf文件的0x80改成0x100,这样...
  • 概念IRQ(Interrupt Request):指中断模式。FIQ(Fast Interrupt Request):指快速中断模式。IRQ与FIQ是ARM处理器的两种不同编程模式(ARM有7种处理模式)。详述1、对FIQ你必须进快处理中断请求,并离开这个模式。2、IRQ...
  • 中断和中断处理流程

    千次阅读 2020-12-20 04:41:20
    1. 中断概念中断是指由于接收到来自外围硬件(相对于中央处理器内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器...
  • 时钟中断

    2021-07-21 03:25:57
    在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便简化程序的编制,提高系统的效率与可操作性。可以把一些例行的及需要定时执行的程序放在时钟中断中,还可以利用时钟中断协助...
  • 3:TIMER0_A0_VECTOR TIMER0_A1_VECTOR区别 TIMERA使用两个中断向量,其中CCR0优先级最高占用AO_VECTOR;而TIMERA的溢出中断CCRI CCR2占用A1_VECTOR. 其中A1_VECTOR这三个中断通过TAIV中断向量寄存器区分哪个...
  • keil 51 使用C语言的中断向量(Keil 51 USES the C language interrupt vector)keil 51 使用C语言的中断向量(Keil 51 USES the C language interrupt vector)The vector position of the interrupt sourceInterrupt ...
  • When I run "cat /proc/interrupts", I can get the following:CPU0 CPU10: 253 1878 IO-APIC-edge timer1: 3 0 IO-APIC-edge i80427: 1 0 ...
  • 展开全部中断程序是在中断事件发生时调用,程序也不知道什62616964757a686964616fe59b9ee7ad9431333365643536么时候有中断事件发生。子程序是在需要的时候调用,在程序里可以预见它的使用。因为中断是由系统调用的,...
  • 中断基本知识 中断过程: 芯片设计固化了能产生哪些中断,那么每个中断对应的处理...因此对应的中断向量映射表如下: 1 .global _start /* 全局标号 */ 2 3 _start: 4 ldr pc, =Reset_Handler /* 复位中断 ...
  • 在单片机程序设计中,设置一个好的时钟中断,将能使一个CPU发挥两个CPU的功效,大大方便简化程序的编制,提高系统的效率与可操作性。那么你对时钟中断了解多少呢?以下是由学习啦小编整理关于什么是时钟中断的内容...
  • ARM中的异常与中断总共有7种按响应优先级从高到低按中断向量表顺序复位复位数据中止未定义指令中断FIQSWIIRQ预取指令中止预取指令中止数据中止异常...各异常和中断向量在向量表中的位置如下地址中断0x00Reset0x...
  • stm8S的中断向量表: /*------------------------------------------------------------------------- * Interrupt vector numbers *-----------------------------------------------------------------------*/ ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,621
精华内容 16,648
关键字:

向量中断和中断向量的区别