学习笔记:STM32外部中断

合集下载

stm32外部中断回传参数

stm32外部中断回传参数

stm32外部中断回传参数【最新版】目录1.STM32 外部中断的基本概念2.STM32 外部中断的触发方式3.STM32 外部中断的回传参数4.STM32 外部中断的应用实例5.总结正文一、STM32 外部中断的基本概念STM32 外部中断,也被称为 IO 中断或事件控制器(EXTI)外部中断,是一种在中断系统中产生的中断。

它主要用于检测外部硬件设备的事件,如按键、传感器等。

外部中断可以由上升沿、下降沿或双边沿触发,并且可以单独配置和屏蔽。

在 STM32F103RCT6 芯片中,外部中断通道共有 19 个,每个通道可以独立配置触发事件和屏蔽。

二、STM32 外部中断的触发方式STM32 外部中断的触发方式主要有以下几种:1.上升沿触发:当外部信号从低电平跃升至高电平时,触发外部中断。

2.下降沿触发:当外部信号从高电平跌落至低电平时,触发外部中断。

3.双边沿触发:当外部信号从低电平跃升至高电平,然后再跌落至低电平时,触发外部中断。

三、STM32 外部中断的回传参数当外部中断被触发时,STM32 芯片会将一些相关信息回传给程序,这些信息包括:1.中断类型:用于区分不同类型的外部中断,如按键、传感器等。

2.中断通道:用于指示触发中断的外部中断通道。

3.中断优先级:用于表示当前中断在所有中断中的优先级,便于程序处理。

四、STM32 外部中断的应用实例以下是一个简单的 STM32 外部中断应用实例:假设我们有一个按键,当按键被按下时,触发外部中断。

我们可以通过以下步骤配置 STM32 外部中断:1.配置 GPIO 口:将按键连接到 STM32 的 GPIO 口,并将 GPIO 口设置为外部中断输入模式。

2.配置外部中断:设置触发方式为下降沿触发,并将中断优先级设置为最高。

3.编写中断处理程序:当按键被按下时,执行中断处理程序,实现相应的功能。

五、总结STM32 外部中断是一种灵活的中断方式,可以方便地检测外部硬件设备的事件。

stm32g030外部中断回调函数

stm32g030外部中断回调函数

一、STM32G030外部中断简介1.1 STM32G030外部中断的定义1.2 STM32G030外部中断的原理1.3 STM32G030外部中断的应用场景二、外部中断回调函数的概念和作用2.1 外部中断回调函数的定义2.2 外部中断回调函数的原理2.3 外部中断回调函数的作用三、STM32G030外部中断回调函数的编写步骤3.1 配置外部中断引脚3.2 初始化外部中断3.3 编写回调函数3.4 注册回调函数3.5 案例演示四、外部中断回调函数的注意事项和常见问题4.1 中断优先级设置4.2 中断清除标志位4.3 嵌套中断处理4.4 延时处理问题五、总结和展望5.1 对STM32G030外部中断回调函数的总结5.2 未来发展趋势和技术应用文章正文:一、STM32G030外部中断简介1.1 STM32G030外部中断的定义STM32G030外部中断是指通过外部引脚(通常为GPIO引脚)来触发微控制器的中断请求,从而实现对外部事件的实时响应。

1.2 STM32G030外部中断的原理STM32G030外部中断的原理是通过设置外部中断触发条件和相应的中断优先级,在外部事件触发时,将中断请求发送给中断控制器,由中断控制器将控制权交给中断服务程序,从而实现对外部事件的处理。

1.3 STM32G030外部中断的应用场景STM32G030外部中断广泛应用于各种外部事件的处理,例如按钮按下、传感器检测等实时事件的响应和处理。

二、外部中断回调函数的概念和作用2.1 外部中断回调函数的定义外部中断回调函数是指在外部中断事件触发时自动执行的函数,通常由用户在程序中编写并注册,用于处理外部中断事件。

2.2 外部中断回调函数的原理外部中断回调函数的原理是通过在中断服务程序中调用注册的回调函数来处理外部中断事件,从而实现针对性的事件响应和处理。

2.3 外部中断回调函数的作用外部中断回调函数的作用是实现对外部中断事件的定制化处理,提高系统的灵活性和可维护性。

stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告-STM32实例外部中断实验

stm32外部中断实验报告_STM32实例外部中断实验上⼀篇⽂章我们介绍了 STM32F10x 的中断,这次我们就来学习下外部中断。

本⽂中要实现的功能与按键实验⼀样,即通过按键控制LED,只不过这⾥采⽤外部中断⽅式进⾏控制。

学习时可以参考《STM32F10x 中⽂参考⼿册》-9 中断和事件章节。

外部中断介绍EXTI 简介STM32F10x 外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事件/中断请求的边沿检测器。

EXTI 的每根输⼊线都可单独进⾏配置,以选择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或边沿触发),还可独⽴地被屏蔽。

EXTI 结构框图EXTI 框图包含了 EXTI 最核⼼内容,掌握了此框图,对 EXTI 就有⼀个全局的把握,在编程的时候思路就⾮常清晰。

从图中可以看到,有很多信号线上都有标号 9 样的“20”字样,这个表⽰在控制器内部类似的信号线路有 20 个,这与 STM32F10x 的 EXTI 总共有20 个中断/事件线是吻合的。

因此我们只需要理解其中⼀个的原理,其他的 19个线路原理都是⼀样的。

EXTI 分为两⼤部分功能,⼀个产⽣中断,另⼀个产⽣事件,这两个功能从硬件上就有所差别,这个在框图中也有体现。

从图中标号 3 的位置处就分出了两条线路,⼀条是 3-4-5 ⽤于产⽣中断,另⼀条是 3-6-7-8⽤于产⽣事件。

下⾯我们就来介绍下这两条线路:(1)⾸先看下产⽣中断的这条线路(1-2-3-4-5)1.标号 1 为输⼊线,EXTI 控制器有 20 个中断/事件输⼊线,这些输⼊线可以通过寄存器设置为任意⼀个 GPIO,也可以是⼀些外设的事件,这部分内容我们会在后⾯专门讲解。

输⼊线⼀般是存在电平变化的信号。

2.边沿检测电路,EXTI 可以对触发⽅式进⾏选择,通过上升沿触发选择寄存器和下降沿触发选择寄存器对应位的设置来控制信号触发。

边沿检测电路以输⼊线作为信号输⼊端,如果检测到有边沿跳变就输出有效信号 1 给红⾊框 3 电路,否则输出⽆效信号 0。

Stm32中断优先级相关概念与使用笔记

Stm32中断优先级相关概念与使用笔记

Stm32中断优先级相关概念与使用笔记一、基本概念1.ARM cortex_m3内核支持256个中断(16个内核+240外部)和可编程256级中断优先级的设置,与中断控制核中断优先级控制的寄存器(NVIC、SYSTICK等)属于cortex_m3内核的部分。

STM32采用了cortex_m3内核,所以这些部分仍旧保留使用,但并不是完全使用的,只是使用了一部分。

2.STM32目前支持的中断共为84个(16个内核+68个外部),和16级可编程中断优先级的设置(仅使用中断优先级设置8bit中的高4位,见后面解释)。

《参考最新101xx-107xx STM32 Reference manual, RM0008》。

以下主要对外部中断进行说明。

3.68个外部中断(通道)在STM32中已经固定的分配给相应的外部设备,每个中断通道都具备自己的中断优先级控制字节PRI_n(8位,但在STM32中只有高4位有效),每4个通道的8位中断优先级控制字(PRI_n)构成一个32位的优先级寄存器(Priority Register)。

68个通道的优先级寄存器至少有是17个32位的寄存器,它们是NVIC寄存器的一部分。

4.这4bit的中断优先级控制位还要分成2组看,从高位开始,前面的定义抢先式优先级,后面为子优先级。

4bit的组合可以有以下几种形式:5.在一个系统中,通常只使用上面5种分配情况的一种,具体采用哪一种,需要在初始化时写入到一个32位寄存器AIRC(Application Interrupt and Reset Control Register)的第[10:8]这2个位中。

这3个bit位有专门的称呼:PRIGROUP(具体写操作后面介绍)。

比如你将0x05(上表的编号)写到AIRC的[10:8]中,那么也就规定了你的系统中只有4个抢先式优先级,相同的抢先式优先级下还可以有4个不同级别的子优先级。

6.AIRC中PRIGROUP的值规定了设置和确定每个外部中断通道优先级的格式。

STM32F0—外部中断 (4)

STM32F0—外部中断 (4)
事件是一个简单脉冲,用来 触发内核唤醒
内部线
注意
1.对于外部线,还可软件产生中断/事件;内部线则不行 2.内部线只有在STOP模式下才能产生中断/事件;非STOP模式下内部线被自动关闭
2
寄存器组:中断、事件掩码配置
内部线默认产生中断,也可以配置产生事件
3
寄存器组:边沿选择
可以同时选择上升沿和下降沿 外部线可由用户配置检测的边沿;内部线固定检测上升沿
Up to 55 GPIOs can be used as EXTI line(0..15) EXTI line 16 is connected to the PVD output EXTI line 17 is connected to the RTC Alarm event EXTI line 18 is reserved (internally held low) EXTI line 19 is connected to RTC tamper and Timestamps EXTI line 20 is reserved (internally held low) EXTI line 21 is connected to Comparator 1 output EXTI line 22 is connected to Comparator 2 output EXTI line 23 is connected to I2C1 wakeup EXTI line 24 is reserved (internally held low) EXTI line 25 is connected to USART1 wakeup EXTI line 26 is reserved (internally held low) EXTI line 27 is connected to CEC wakeup.

stm32外部中断的使用(含实例)

stm32外部中断的使用(含实例)

stm32外部中断的使⽤(含实例)中断对于开发嵌⼊式系统来讲的地位绝对是⽏庸置疑的,在C51单⽚机时代,⼀共只有5个中断,其中2个外部中断,2个定时/计数器中断和⼀个串⼝中断,但是在STM32中,中断数量⼤⼤增加,⽽且中断的设置也更加复杂。

今天就将来探讨⼀下关于STM32中的中断系统。

1 基本概念ARM Coetex-M3内核共⽀持256个中断,其中16个内部中断,240个外部中断和可编程的256级中断优先级的设置。

STM32⽬前⽀持的中断共84个(16个内部+68个外部),还有16级可编程的中断优先级的设置,仅使⽤中断优先级设置8bit中的⾼4位。

STM32可⽀持68个中断通道,已经固定分配给相应的外部设备,每个中断通道都具备⾃⼰的中断优先级控制字节PRI_n(8位,但是STM32中只使⽤4位,⾼4位有效),每4个通道的8位中断优先级控制字构成⼀个32位的优先级寄存器。

68个通道的优先级控制字⾄少构成17个32位的优先级寄存器。

4bit的中断优先级可以分成2组,从⾼位看,前⾯定义的是抢占式优先级,后⾯是响应优先级。

按照这种分组,4bit⼀共可以分成5组第0组:所有4bit⽤于指定响应优先级;第1组:最⾼1位⽤于指定抢占式优先级,后⾯3位⽤于指定响应优先级;第2组:最⾼2位⽤于指定抢占式优先级,后⾯2位⽤于指定响应优先级;第3组:最⾼3位⽤于指定抢占式优先级,后⾯1位⽤于指定响应优先级;第4组:所有4位⽤于指定抢占式优先级。

所谓抢占式优先级和响应优先级,他们之间的关系是:具有⾼抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套。

当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系,当⼀个中断到来后,如果正在处理另⼀个中断,这个后到来的中断就要等到前⼀个中断处理完之后才能被处理。

如果这两个中断同时到达,则中断控制器根据他们的响应优先级⾼低来决定先处理哪⼀个;如果他们的抢占式优先级和响应优先级都相等,则根据他们在中断表中的排位顺序决定先处理哪⼀个。

STM32F103学习笔记(五) 外部中断

STM32F103学习笔记(五) 外部中断

STM32F103学习笔记(五)外部中断首先是外部中断基本的概念:STM32 的每个IO 都可以作为外部中断的中断输入口,这点也是STM32 的强大之处。

STM32F103 的中断控制器支持19 个外部中断/事件请求。

每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

STM32F103 的19 个外部中断为:线0~15:对应外部IO 口的输入中断。

线16:连接到PVD 输出。

线17:连接到RTC 闹钟事件。

线18:连接到USB 唤醒事件。

线16~18还没有学到只看了线0~15。

每个中断线对应着7个GPIO口,形成映射关系,以线0 为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。

而中断线每次只能连接到1 个IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO 上了。

下面我们看看GPIO 跟中断线的映射关系图:根据映射关系,就开始配置按键对应GPIO口和中断的映射了:[csharp] view plain copy <pre name="code" class="csharp"><prename="code" class="html">void EXTIX_Init(void){ EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure; KEY_Init(); // 按键端口初始化RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,EN ABLE); //使能复用功能时钟//GPIOE.2 中断线以及中断初始化配置下降沿触发GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource2);EXTI_InitStructure.EXTI_Line=EXTI_Line2; //KEY2 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寄存器//GPIOE.3 中断线以及中断初始化配置下降沿触发//KEY1GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource3);EXTI_InitStructure.EXTI_Line=EXTI_Line3;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOE.4 中断线以及中断初始化配置下降沿触发//KEY0GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_Pi nSource4);EXTI_InitStructure.EXTI_Line=EXTI_Line4;EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//GPIOA.0 中断线以及中断初始化配置上升沿触发PA0 WK_UPGPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_Pi nSource0);EXTI_InitStructure.EXTI_Line=EXTI_Line0;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//使能按键WK_UP所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//使能按键KEY2所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级2NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;//使能按键KEY1所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; //子优先级1NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;//使能按键KEY0所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级2NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; //子优先级0NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器} //外部中断0服务程序voidEXTI0_IRQHandler(void) { delay_ms(10);//消抖if(KEY3==1) //WK_UP按键{ BEEP=!BEEP; } EXTI_ClearITPendingBit(EXTI_Line0); //清除LINE0上的中断标志位} //外部中断2服务程序voidEXTI2_IRQHandler(void) { delay_ms(10);//消抖if(KEY2==0) //按键KEY2{ LED0=!LED0; }EXTI_ClearITPendingBit(EXTI_Line2); //清除LINE2上的中断标志位} //外部中断3服务程序voidEXTI3_IRQHandler(void) { delay_ms(10);//消抖if(KEY1==0) //按键KEY1{ LED1=!LED1; }EXTI_ClearITPendingBit(EXTI_Line3); //清除LINE3上的中断标志位} void EXTI4_IRQHandler(void){ delay_ms(10);//消抖if(KEY0==0) //按键KEY0 { LED0=!LED0;LED1=!LED1; }EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位} [html] view plain copy。

STM32学习笔记

STM32学习笔记

一、GPIO操作IO 的方法:1)使能IO 口时钟。

调用函数为RCC_APB2PeriphClockCmd()。

2)初始化IO 参数。

调用函数GPIO_Init();3)操作IO。

GPIO_Mode有:GPIO_Mode_AIN = 0x0, //模拟输入GPIO_Mode_IN_FLOATING = 0x04, //浮空输入GPIO_Mode_IPD = 0x28, //下拉输入GPIO_Mode_IPU = 0x48, //上拉输入GPIO_Mode_Out_OD = 0x14, //开漏输出GPIO_Mode_Out_PP = 0x10, //通用推挽输出GPIO_Mode_AF_OD = 0x1C, //复用开漏输出GPIO_Mode_AF_PP = 0x18 //复用推挽IO 口速度设置:GPIO_Speed_10MHz = 1,GPIO_Speed_2MHz,GPIO_Speed_50MHz初始化结构体初始化GPIO 的常用格式://初始化PGIO_PC.4为上拉输入GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //PC.4 端口配置GPIO_Mode_IPU = 0x48, //上拉输入GPIO_Init(GPIOC, &GPIO_InitStructure);GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能,GPIOA 时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9 复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA.0 发送端读GPIOA.5 的电平状态:GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5);控制IO 口的输出状态:void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);设置GPIOA 的第1 个端口值为1,那么你只需要往寄存器BSRR 的低16 位对应位写1 即可:GPIOA->BSRR=1<<1;如果你要设置GPIOA 的第1 个端口值为0,你只需要往寄存器高16 位对应为写1 即可:GPIOA->BSRR=1<<(16+1)对应函数void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);STM32 的IO 口做输入使用的时候,是通过调用函数GPIO_ReadInputDataBit()来读取IO 口的状态的在配置STM32 外设的时候,任何时候都要先使能该外设的时钟!二、串口串口设置的一般步骤可以总结为如下几个步骤:1) 串口时钟使能,GPIO 时钟使能2) 串口复位3) GPIO 端口模式设置4) 串口参数初始化5) 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)6) 使能串口7) 编写中断处理函数1.串口时钟使能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

学习笔记:STM32的外部中断(库函数)
在为某引脚配置中断前,同样要先初始化该引脚的配置,用GPIO_Init()函数初始化,不同的是,由于是外部中断,所以输入模式要设置上拉输入。

假设外部中断引脚为PE.2,则该引脚初始化配置的程序为:
IO
IO口作为外部中断输入是复用功能,因此在此基础上还需要对另一个时钟信号进行初始化。

这是IO口作为复用功能时需要进行初始化的时钟,另外,要注意的是,做一般功能使用的IO口只需要调用第一个函数即可,而作为复用功能的IO口,两个函数都要调用,两者缺一不可,否则不能正常使用。

STM32的每个IO都可以作为外部中断的中断输入口,这点也是STM32的强大之处。

STM32F103的中断控制器支持19个外部中断/事件请求。

每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。

STM32F103的19个外部中断为:
线0~15:对应外部IO口的输入中断。

线16:连接到PVD输出。

线17:连接到RTC闹钟事件。

线18:连接到USB唤醒事件。

从上面可以看出,STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止16个,那么STM32是怎么把16个中断线和IO口一一对应起来的呢?于是STM32就这样设计,GPIO的管脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线0~15。

这样每个中断线对应了最多7个IO口,以线0为例:它对应了GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。

而中断线每次只能连接到1个IO口上,这样就需要通过配置来决定对应的中断线配置到哪个GPIO上了。

下面我们看看GPIO跟中断线的映射关系图:
在库函数中,配置GPIO与中断线的映射关系是通过函数GPIO_EXTILineConfig()来实现的:void GPIO_EXTILineConfig(uint8_t GPIO_PortSource,uint8_t GPIO_PinSource)
该函数将端口与中断线映射起来,使用示例是:
GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);
将中断线2与GPIOE映射起来,那么很显然是GPIOE.2与EXTI2中断线连接了。

设置好中断线映射之后,那么到底来自这个IO口的中断是通过什么方式触发的呢?接下来我们就要设置该中断线上中断的初始化参数了。

中断线上中断的初始化是通过函数EXTI_Init()实现的。

EXTI_Init()函数的定义是:
void EXTI_Init(EXTI_InitTypeDef*EXTI_InitStruct);
下面我们用一个使用范例来说明这个函数的使用:
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;//选择外部中断线4
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;//设置EXTI线路为中断请求
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;//设置输入线路下降沿为中断请求EXTI_InitStructure.EXTI_LineCmd=ENABLE;//使能当前中断
EXTI_Init(&EXTI_InitStructure);//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器上面的例子设置中断线4上的中断为下降沿触发。

STM32的外设的初始化都是通过结构体来设置初始值的,这里就不罗嗦结构体初始化的过程了。

我们来看看结构体EXTI_InitTypeDef 的成员变量:
4
EXTI_Line是中断线的标号,取值范围为EXTI_Line0~EXTI_Line18。

总共19个中断线,刚好对应开头讲的19个外部中断。

具体用哪个中断线参考上图:GPIO和中断线的映射关系图。

EXTIMode_TypeDef EXTI_Mode是中断模式,可选值为中断请求EXTI_Mode_Interrupt和事件请求EXTI_Mode_Event。

EXTITrigger_TypeDef EXTI_Trigger是触发方式,可以是下降沿触发EXTI_Trigger_Falling,上升沿触发EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发EXTI_Trigger_Rising_Falling。

EXTI_LineCmd是使能中断线,ENABLE(使能)或者DISABLE(复位)。

可见结构体EXTI_InitTypeDef的作用就是设置中断线的中断模式和触发方式的。

我们设置好中断线和GPIO映射关系,然后又设置好了中断的触发模式等初始化参数。

既然是外部中断,涉及到中断我们当然还要设置NVIC中断优先级。

在配置中断优先级之前先要配置中断优先级分组。

中断优先级分组配置函数为:
分组的意思是对控制抢占优先级和子优先级的位数进行分配,该配置函数对所有中断的中断优先级分组起作用。

是针对所有中断的。

其参数是宏定义标识符。

配置好该函数后就要配置特定中断线的优先级了。

比如,设置中断线2的中断优先级的示例为:
结构体NVIC_InitTypeDef为:
该结构体有四个成员,各成员作用为:
NVIC_IRQChannel:定义初始化的是哪个中断,这个我们可以在stm32f10x.h中找到
每个中断对应的名字。

例如我们现在用的是外部中断线2,则为:EXTI2_IRQn。

NVIC_IRQChannelPreemptionPriority:定义这个中断的抢占优先级别。

NVIC_IRQChannelSubPriority:定义这个中断的子优先级别。

NVIC_IRQChannelCmd:该中断是否使能。

(ENABLE/DISABLE)
关于NVIC_IRQChannelPreemptionPriority和NVIC_IRQChannelSubPriority的取值如下图:
我们配置完中断优先级之后,接着我们要做的就是编写中断服务函数。

中断服务函数的名字是在MDK中事先有定义的。

这里需要说明一下,STM32的IO口外部中断函数只有6个,
0-45-9EXTI9_5_IRQHandler
中断线10-15共用中断函数EXTI15_10_IRQHandler。

在编写中断服务函数的时候会经常使用到两个函数,第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):
上的中断标志位:
这个函数一般应用在中断服务函数结束之前,清除中断标志位。

因为有的是多个中断线公用一个中断服务函数,所以进入中断函数后要先判断出是哪个中断线进入的。

常用的中断服务函数格式为:
标志位的函数EXTI_GetFlagStatus和EXTI_ClearFlag,他们的作用和前面两个函数的作用类似。

只是在EXTI_GetITStatus函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而EXTI_GetFlagStatus直接用来判断状态标志位。

讲到这里,相信大家对于STM32的IO口外部中断已经有了一定了了解。

下面我们再总结一下使用IO口外部中断的一般步骤:
1)初始化IO口为输入。

2)开启AFIO时钟与GPIO时钟
3)设置IO口与中断线的映射关系。

4)初始化线上中断,设置触发条件等。

5)配置中断分组(NVIC),并使能中断。

6)编写中断服务函数。

通过以上几个步骤的设置,我们就可以正常使用外部中断了。

下面的程序是用一个按键(PE.2)通过外部中断控制一个LED灯(PC.0)的亮灭。

当按键按下时,该引脚为低电平,并且LED状态翻转一次。

相关文档
最新文档