STM32上的外部中断

发布者:黄金大花猫最新更新时间:2019-03-06 来源: eefocus关键字:STM32  外部中断 手机看文章 扫描二维码
随时随地手机看文章

        今天记录一下关于外部中断的知识点以及在32上外部中断的相关寄存器以及配置的流程。


一、原理介绍


        首先,什么是中断


        中断就是将正在做的事情停下来,先去完成另外一件事情,完成后继续回来做这件事。


        比如:在吃饭的时候有电话打来,去接电话,打完电话后继续吃法。


        在计算机科学中,中断(英语:Interrupt)是指处理器接收到来自硬件或软件的信号,提示发生了某个事件,应该被注意,这种情况就称为中断。


        通常,在接收到来自外围硬件(相对于中央处理器和内存)的异步信号,或来自软件的同步信号之后,处理器将会进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个运行信息切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种运行信息切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是即时系统中尤为有用。

        上图就是中断的流程图,可以看出中断也支持嵌套,高级别的中断可以打断低级别的中断。


        中断的分类:根据中断的来源可以分为内部中断、外部中断


                            根据中断来源的性质不同可以分为软件中断、硬件中断


                            根据系统处理和响应的方式可以分为向量中断、非向量中断


        今天主要记录外部中断的一些要点,其他的分类方式以及各类中断的区分以后会再写博客记录。


        外部指的是相对CPU来说的,也就是说这个中断是发生在CPU外的。


        外部中断的触发方式有:电平触发和跳沿触发 


        边沿触发和电平触发基本就是触发器和锁存器的区别。

        触发器是边沿触发,只有当时钟上升(或下降)的一瞬间,触发器会读取并锁存输入信号。输出信号仅在时钟信号上升(或下降)的一瞬间会发生变化。

        锁存器是电平触发,只要使能(enable)信号处于高电平(或低电平),输出就会随着输入信号变化,直到使能信号变为低电平(或高电平)时,输出才会锁存,不再随输入变化。

二、在32上的外部中断

        STM32F4的每个IO都可以作为外部中断输入。

         STM32F4的中断控制器支持22个外部中断/事件请求:

        EXTI线0~15:对应外部IO口的输入中断。

        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唤醒事件。

        每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。


        但是值得注意的是:外部IO口有16条中断线,但并不是能设置16个外部中断


        IO口外部中断在中断向量表中只分配了7个中断向量,也就是只能使用7个中断服务函数


        中断线5-9分配一个中断向量,共用一个中断服务函数,中断线10-15分配一个中断向量,公用一个中断服务函数。


        中断的配置过程还是比较简单的


        1、使能时钟


        2、初始化IO口为输入模式


        3、设置IO口与中断线的映射关系,并设置触发条件。


        4、配置中断优先级(抢占、响应)以及中断分组。


        5、编写中断服务函数(中断函数的最后一个语句是清除中断标记位)


        关于中断优先级,要强调一些:在STM32上的中断优先级与51上的中断优先级不同,51上只是给每个中断一个数字,高优先级的可以打断低优先级,若低优先级的中断在高优先级中断执行的时候发生会被忽略;在32上中断优先级有抢占优先级和响应优先级之分,其中抢占优先级类似于51上的中断优先级,高抢占优先级的中断会打断低抢占优先级的中断,而响应优先级就是给相同抢占优先级的中断排了一个次序,若俩个相同抢占优先级的中断同时发生时,会先执行高响应优先级的中断,低响应优先级的中断会在之后执行。这样可以选择的配置方式就更多了。


        在32上配置外部中断的代码还是很简单的,使能时钟和配置IO口的代码就不贴的


        关于配置中断       


Ex_NVIC_Config(GPIO_E,2,FTIR); //下降沿触发

MY_NVIC_Init(3,2,EXTI2_IRQn,2); //抢占3,子优先级2,组2

        第一个函数用来配置PE2为下降沿中断,第二个函数设置中断线2的抢占优先级为3,响应优先级为2,中断分组为2。


        接下来编写中断服务函数


void EXTI2_IRQHandler(void)

{

delay_ms(10); //消抖

if(KEY2==0)   

{  

LED0=!LED0;  

}  

EXTI->PR=1<<2;  //清除LINE2上的中断标志位  

}

        首先是10ms的软件去抖动,此处的含义是按键按下后改变LED0的状态,最后要清除中断标志位。


三、总结


        外部中断在开发中是时常用到的,但是对外部中断的使用也是有许多技巧和策略的,我了解的并不多,这需要时间和经验的积累,我知道的一点就是,在中断中处理尽可能少的事情,最好只是设置一个标志,把主要工作留给主函数来执行。


        以上就是我对外部中断的总结


关键字:STM32  外部中断 引用地址:STM32上的外部中断

上一篇:错误解决:STM32F103串口1与串口3相同代码却结果不同
下一篇:STM32上的PWM

推荐阅读最新更新时间:2024-03-16 16:24

STM32通过DMA采集多通道AD
环境: 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 通过脚PA1,PA2采集AD。每路AD采集10次。 #include ad_driver.h //全局变量 //AD采样存放空间 __IO uint16_t ADCConvertedValue ; //函数 //初始化AD void init_ad(void) { ADC_InitTypeDef ADC_InitStructure; DMA_InitTypeDef DMA_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; //----
[单片机]
stm32中AT发送可变短信
/******************** (C) COPYRIGHT 2015 ************************** * 文件名 :main.c * 描述 :使用方法: p为要发送的短信内容 * center为手机卡的短信中心 * tel为要发送的手机号的号码 * 串口会打印AT操作的内容 **********************************************************************************/ #include stm32f10x.h #include usart1.h #include wchar.h #include wc
[单片机]
STM32 JTAG失效恢复
昨天调试一块STM32L151的板子,用的是JlinkOB,调试时,出现下面的错误: JLink Error:could not start CPU core. JLink Warning:CPU could not be halted 这个错误出现的原因是,程序中有修改JTAG端口(PA13,PA14)的语句,当把JTAG当做普通IO口时,JLink就不能返回调试信息,JLink就读不回相应寄存器的值了。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_Remap_S
[单片机]
STM32笔记(五)---中断应用
一、异常类型 1-1 定义说明 F103 在内核水平上搭载了一个异常响应系统, 支持为数众多的系统异常和外部中断。其中系统异常有 8 个(如果把 Reset 和 HardFault 也算上的话就是 10 个) ,外部中断有 60个。除了个别异常的优先级被定死外,其它异常的优先级都是可编程的。有关具体的系统异常和外部中断可在标准库文件 stm32f10x.h 这个头文件查询到,在 IRQn_Type 这个结构体里面包含了 F103 系列全部的异常声明。 表格 1 系统异常清单 二、NVIC简介 2-1 定义说明 NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。但是各个芯
[单片机]
<font color='red'>STM32</font>笔记(五)---中断应用
STM32F030C6外部中断问题
使用STM32F030C6外部中断的时候碰到一个很奇怪的问题: 1、中断线13一直响应(没有外部触发的这个中断); 2、在debug的时候,按下按键触发中断可以进入中断; 3、但下载到单片机中运行,发现中断没有被触发。 4、debug过程中看到中断触发请求寄存器PR13一直是1; 5、如果把延时函数去掉,debug界面看到中断触发请求寄存器PR13一直是0,其实中断还是一直响应,设置一个断点便知道; 根源问题:打开中断复位时钟函数用错了。这个函数RCC_AHBPeriphResetCmd(RCC_APB2Periph_SYSCFG,ENABLE);改为 RCC_APB2PeriphCl
[单片机]
STM32F030C6<font color='red'>外部中断</font>问题
基于STM32的嵌入式以太网门禁系统设计
  引言   当前,有很多的企业是采用佩戴工作证来完成门禁管理,而且还是采用传统的人工方式完成,不仅容易被人混入,且没有记录,存在各种人为的失误。同时,市场上门禁系统存在传输距离受限制、性能不佳等问题。   随着嵌入式技术日新月异的发展,以及以太网技术的普及,使得基于以太网的嵌入式产品越来越多,发展也越来越快。本文研究的就是采用以太网传输数据和射频芯片识别智能卡相结合的门禁系统,相对于传统的门禁系统,以太网解决了传输距离上的问题。其次,采用了基于80C51内核的射频芯片PN532,使得性能更加稳定。其工作的基本原理是先将智能卡放在门禁系统上,系统读取数据并传送给主芯片STM32进行处理,主芯片处理后再通过以太网协议LwIP将数
[单片机]
基于<font color='red'>STM32</font>的嵌入式以太网门禁系统设计
详解STM32单片机的堆栈
学习STM32单片机的时候,总是能遇到“堆栈”这个概念。分享本文,希望对你理解堆栈有帮助。 对于了解一点汇编编程的人,就可以知道,堆栈是内存中一段连续的存储区域,用来保存一些临时数据。堆栈操作由PUSH、POP两条指令来完成。而程序内存可以分为几个区: 栈区(stack) 堆区(Heap) 全局区(static) 文字常亮区程序代码区 程序编译之后,全局变量,静态变量已经分配好内存空间,在函数运行时,程序需要为局部变量分配栈空间,当中断来时,也需要将函数指针入栈,保护现场,以便于中断处理完之后再回到之前执行的函数。 栈是从高到低分配,堆是从低到高分配。 普通单片机与STM32单片机中堆栈的区别 普通单片机启动时,不需要用bootl
[单片机]
STM32如何高效接收串口数据?
硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 DMA,直接内存存取,可以用它的双手释放CPU的灵魂,所以,本文通过USART3进行串口收发,接受使用DMA的方式,无需CPU进行干预,当接受完成之后,数据可以直接从内存的缓冲区读取,从而减少了CPU的压力。 具体的代码实现如下: usart_driver.h 封装了接口,数据接收回调函数类型,基本数据结构等; usart_driver.c 函数原型实现,中断服务函数实现等; 拷贝这两个文件即可,可以根据目录下的参考用例,进行初始化。 头文件usart_driver.h已经声明了外部函数可能用到的接口; USART3_DR的地
[单片机]
<font color='red'>STM32</font>如何高效接收串口数据?
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved