STM32之外部中断 EXTI

发布者:Huanle666最新更新时间:2022-05-24 来源: eefocus关键字:STM32  外部中断  EXTI 手机看文章 扫描二维码
随时随地手机看文章

STM32中断控制线支持19个外部中断/事件请求,每个中断都有对应状态位和独立的触发与屏蔽设置。STM32F103的19个外部中断为:


线0-15:对应GPIO口的输入中断。

线16:连接到PVD输出(掉电检测,掉电时可立即保存重要数据作用)。

线17:连接RTC闹钟事件。 线18:连接到USB唤醒事件


STM32的每个IO口都可以作为外部中断源的输入端,而IO口使用的中断线只有16根,且引脚GPIOx.0~GPIOx.15(x=A~G)分别对应中断线0-15.这样每个中断线对应了7个IO口。如线0对应引脚GPIOA.0/GPIOB.0/GPIOC.0/GPIOD.0/GPIOE.0/GPIOF.0/GPIOG.0,但是每个中断线每次只能连接到1个IO口上。即同一时刻EXTIx只能响应一个端口的事件触发,不能同时响应所有IO端口的事件,但可以分时复用。


EXTI TO GPIO

*1、GPIO与中断映射配置通过函数来实现


void GPIO_EXTILineConfig ( uint8_t  GPIO_PortSource,uint8_t  GPIO_PinSource );


例如


GPIO_EXTILineConfig(GPIO_PortSourceGPIOE , GPIO_PinSource2);


即外部中断线2就和GPIOE映射起来了,显然是GPIOE.2连接EXTI2中断线。

设置中断触发方式:


void EXTI_Init( EXTI_InitTypeDef * EXTI_InitStruct )


例如设置中断线line4的中断为下降沿触发


EXTI_InitTypeDef EXTI_InitStructure;

EXTI_InitStructure.EXTI_Line=EXTI_Line4;//选择中断线4,即EXTI4

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中断模式

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿触发

EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中断使能

EXTI_Init(&EXTI_InitStructure); 

//根据EXTI_InitStruct结构体中指定的参数初始化外设 EXTI 寄存器


设置好了中断线和GPIO的映射关系,然后又设置好了中断的触发模式等参数,涉及到中断,当然不能忘了设置中断控制体NVIC的中断优先级。


2、设置NVIC的中断优先级


NVIC_InitTypeDef     NVIC_InitStructure;

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能外部中断通道

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; 

//抢占优先级 2

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道

NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始化


3、 配置完中断优先级后,需要编写中断服务程序


stm32f10x_it.c文件是专门用来存放中断服务函数的。文件中默认只有几个关于系统异常的中断服务函数,而且都是空函数,在需要的时候自行编写。相信部分像我一样的初学者会有疑问,中断服务函数的名称可以自己定义吗?不行。中断服务程序的名字必须要与启动文件startup_stm32f10x_hd.s中的中断向量表定义的一致。

需要注意的一点,IO口16个外部中断只有7个函数名:


EXTI0_IRQHandler    ;EXTI Line0

EXTI1_IRQHandler    ;EXTI Line1

EXTI2_IRQHandler    ;EXTI Line2

EXTI3_IRQHandler    ;EXTI Line3

EXTI4_IRQHandler    ;EXTI Line4


EXTI9_5_IRQHandler  ;EXTI Line9..5

EXTI15_10_IRQHandler;EXTI Line15..10


中断线在5后就不能单独命名,如果写成EXTI5_IRQHandler…编译器是不会报错的,不过中断服务程序不能正常工作。


编写中断服务函数经常需要使用两个函数:


ITStatus EXTI_GetITStatus(uint32_t  EXTI_line);

//放在中断服务程序开头,检测中断标志位

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

//放在函数的结尾


第一个是判断某个中断线上的中断是否发生(即标志位是否置位)

第二个是清除中断线上的标志位(即清除标志位)


常用的外部中断服务程序格式


格式一:


void EXTI4_IRQHandler(void)

{

    if(EXTI_GetITStatus(EXTI_Line4) != RESET)//判断是否置位

        Dosomething();//执行中断事件

    EXTI_ClearITpendingBit(EXTI_Line4);//清除Line4标志位

}


格式二:


void EXTI_IRQHandler(void)

{

    if(EXTI_GetFlagStatus(EXTI_Line4) != RESET)

        Dosomething();

    EXTI_ClearFlag(EXTI_Line4);

}


EXTI_GetITStatus() 会先判断中断该中断是否使能,使能了的话在判断该标志位是否置位;而EXTI_GetFlagStatus()会直接判断中断标志位是否置位(所以显得马虎一点)。一般情况下首选EXTI_GetITStatus().


关于外部中断EXTI大概就这些了,其他的还要靠自己去动手操作才能掌握更多。


-- From #IRONMAN#

-- 4/24/2017


关键字:STM32  外部中断  EXTI 引用地址:STM32之外部中断 EXTI

上一篇:stm32adc多通道数据采集
下一篇:stm32 SysTick定时器常见问题和实现延时

推荐阅读最新更新时间:2024-11-19 12:23

关于STM32的USART_GetFlagStatus和USART_GetITStatus解析
前言 STM32固件库中提供了串口收发的标志位函数,包括USART_GetFlagStatus(…,…);和USART_GetITStatus(…,…);,两者容易混淆,重点区别就在于:前者返回值是中断标志位状态(读SR寄存器),后者返回值是中断发生与否的判断(读CR寄存器),以下主要对这两个函数进行分析。 一、USART_GETFlagStatus(…,…) /** * @brief Checks whether the specified USART flag is set or not. * @param USARTx: Select the USART or the UART peripheral. * Th
[单片机]
关于<font color='red'>STM32</font>的USART_GetFlagStatus和USART_GetITStatus解析
STM32学习笔记---SysTick定时器
Q:什么是SYSTick定时器? SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。 Q:为什么要设置SysTick定时器? (1)产生操作系统的时钟节拍 SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统 心跳 的节律。 (2)便于不同处理器之间程序移植。 Cortex‐M3处
[单片机]
STM32学习1:GPIO输出实验——点亮三色LED
一、概述: 1、发光二极管简介 发光二极管是半导体二极管的一种,可以把电能转化为光能,常简写为LED。常用的是发红光、绿光或黄光的二极管。发光二极管的反向击穿电压约为5V。它的正向伏安特性曲线很陡,使用时必须串联限流电阻以控制通过管子的电流。限流电阻R可用下式计算: R = (E - UF)/IF 式中E为电源电压,UF为LED的正向压降,IF为LED的一般工作电流。LED广泛应用于各种电子电路、家电、仪表等设备中,做电源或电平指示。 2、STM32 GPIO简介 STM32F4每组通用I/O 端口包括4 个32 位配置寄存器(MODER、OTYPER、OSPEEDR 和PUPDR)、2 个32 位数据寄存
[单片机]
<font color='red'>STM32</font>学习1:GPIO输出实验——点亮三色LED
STM32学习笔记(7):USART串口的使用
1. 串口的基本概念 在STM32的参考手册中,串口被描述成通用同步异步收发器(USART),它提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。USART利用分数波特率发生器提供宽范围的波特率选择。它支持同步单向通信和半双工单线通信,也支持LIN(局部互联网),智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。它还允许多处理器通信。还可以使用DMA方式,实现高速数据通信。 USART通过3个引脚与其他设备连接在一起,任何USART双向通信至少需要2个引脚:接受数据输入(RX)和发送数据输出(TX)。 RX: 接受数据串行输入
[单片机]
STM32单片机中RTC的秒中断的原理解析
RTC(Real Time Clock)是实时时钟的意思,它其实和TIM有点类似,也是利用计数的原理,选择RTC时钟源,再进行分频,到达计数的目的。 该文主要讲述关于RTC的秒中断功能,这个功能类似SysTIck系统滴答的功能。RTC秒中断功能其实是每计数一次就中断一次。注意,这里所说的秒中断并非一定是一秒的时间,它是由RTC时钟源和分频值决定的“秒”的时间,当然也是可以做到1秒钟中断一次。 本文章提供的实例工程,其实验效果是: 主函数间隔0.5秒LED变化一次; 秒中断一次打印数据“RTC Sec.。.”; 也就是LED变化一次,串口打印一次数据“RTC Sec.。.” 扩展部分的功能RTC计数:可以实现RTC闹钟,本文
[单片机]
<font color='red'>STM32</font>单片机中RTC的秒<font color='red'>中断</font>的原理解析
STM32到TM4C123
我主要是最近看ACfly的代码时,发现他有的工程的文件的.s文件讲道理是启动文件不是STM32,而是TM4C123,我怀疑是TI的芯片,查了下果然是的,应该是电赛准备的。但是这里可以看到换成其他芯片也是有专门的启动文件的。 从51单片机到STM32再到TM4C123 目录 系统时钟 GPIO相关 通用定时器相关 PWM相关 UART通信相关 写在前面: 进入TI的学习,说明STM32 已经掌握的差不多了,没有掌握的很好也没关系,正好两块单片机对比着学习更能加深映像。这篇只是简单的介绍TI,篇幅比较短比,主要还是叙述了32和TI的不同的地方,相似的就没有再写出来,不能完全的拿来当作学习资料。 一点学习TI
[单片机]
从<font color='red'>STM32</font>到TM4C123
stm32能跑什么系统
  STM32系列32位微控制器,基于ARM Cortex-M3处理器。它能支持32位广泛的应用,支持包括高性能、实时功能、数字信号处理,和低功耗、低电压操作,同时拥有一个完全集成和易用的开发。   基于STM平台且满足实时控制要求的操作系统,有以下4种可供选择。分别为μC/OS-II、μClinux、eCos、FreeRTOS和都江堰操作系统(djyos)。下面分别介绍这五种嵌入式操作系统的特点及不足。   1、μC/OS-II   μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干
[单片机]
STM32的USB键盘及鼠标的例程介绍
STM32的USB键盘及鼠标例程通过网络可以搜到很,但是在同一个设备中集成键盘及鼠标的例程却比较少见(我通过GOOGLE只搜到圈圈的基于51+D12的版本)。以下为我参考圈圈的例程做出来的集成键盘及鼠标的STM32的程序。 程序上除了usb_desc.c及usb_endp.c外,其它部份同单一的键盘鼠标一样。下面着重说一下usb_desc.c及usb_endp.c的不同之处。 单一键盘鼠标跟集成键盘鼠标这区别主要是报告描述符不同。单一键盘鼠标的报告描述符因只有一组报告输入/输出,故没有报告ID,而集成的有两组报告(键盘及鼠标),所以每一组报告都有一个报告ID加以区别。 另外就是在usb_endp.c中对端点的数据发送不知道是
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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