外部中断函数
- 格式:docx
- 大小:11.22 KB
- 文档页数:1
Arduino的外部中断Arduino的中断函数格式为attachInterrupt(interrput,function,mode)。
attachInterrupt函数⽤于设置外部中断,有3个参数,interrput表⽰中断源编号(中断号)、function表⽰中断处理函数,mode表⽰触发模式,它们的具体含义如下中断号:可选0或者1,在UNO板上分别对应2和3号数字引脚。
在不同的Arduino型号上位置也不同,只有外部中断发⽣在以下端⼝,Arduino才能捕获到。
以下是常见的⼏种型号板⼦的外部中断编号和对应引脚标号。
中断源编号int.0int.1int.2int.3int.4int.5UNO\Ethernet23 Mega25602321201918Leonardo3201 Due 所有IO⼝均可Due板的每个IO均可以进⾏外部中断,中断号即所使⽤的中断引脚编号。
中断处理函数:指定中断的处理函数,是⼀段⼦程序,当中断发⽣时执⾏该⼦程序,其中参数值为函数的指针。
触发模式:有下列⼏种类型LOW 低电平触发CHANGE 电平变化,⾼电平变低电平、低电平变⾼电平RISING 上升沿触发FALLING 下降沿触发HIGH ⾼电平触发(该中断模式仅适⽤于Arduino due)如果不需要使⽤外部中断了,可以⽤中断分离函数detachInterrupt(interrupt )来取消这⼀中断设置。
Example Code ⽤外部中断实现LED的亮灭切换1const byte ledPin = 13; //LED的引脚2const byte interruptPin = 2; //中断源引脚,根据所⽤板⼦查表得到中断编号interrupt3volatile byte state = LOW;45void setup()6 {7 pinMode(ledPin, OUTPUT);8 pinMode(interruptPin, INPUT_PULLUP);9 attachInterrupt(interrupt, blink, CHANGE);10 }1112void loop()13 {14 digitalWrite(ledPin, state);15 }1617void blink()18 {19 state = !state;20 }。
CC2530外部中断⼀、中断基础概念内核与外设之间的主要交互⽅式有两种:轮询和中断。
中断系统使得内核具备了应对突发事件的能⼒。
在执⾏CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执⾏的程序,转⽽去执⾏另外⼀段特殊程序来处理出现的紧急事务,处理结束后,CPU⾃动返回到原来暂停的程序中去继续执⾏。
这种程序在执⾏过程中由于外界的原因⽽被中间打断的情况,称为中断。
采⽤中断技术后,可以为计算机系统带来以下好处:1)实现分时操作速度较快的CPU和速度较慢的外设可以各做各的事情,外设可以在完成⼯作后再与CPU进⾏交互,⽽不需要CPU去等待外设完成⼯作,能够有效提⾼CPU的⼯作效率。
2)实现实时处理在控制过程中,CPU能够根据当时情况及时做出反应,实现实时控制的要求。
3)实现异常处理系统在运⾏过程中往往会出现⼀些异常情况,中断系统能够保证CPU及时知道出现的异常,以便CPU去解决这些异常,避免整个系统出现⼤的问题。
两个重要的概念:<1> 中断服务函数:内核响应中断后执⾏的相应处理程序。
例如ADC转换完成中断被响应后,CPU执⾏相应的中断服务函数,该函数实现的功能⼀般是从ADC结果寄存器中取⾛并使⽤转换好的数据。
<2> 中断向量:中断服务程序的⼊⼝地址,当CPU响应中断请求时,会跳转到该地址去执⾏代码。
⼆、 CC2530中断CC2530具有18个中断源,每个中断源都有它⾃⼰的位于⼀系列SFR 寄存器中的中断请求标志。
相应标志位请求的每个中断可以分别使能或禁⽤。
Tip:(1)当调⽤中断服务例程时清除硬件。
(2)另外的 IRQ 掩码和 IRQ 标志位存在。
三、CC2530中断处理函数格式书写中断服务函数与⼀般⾃定义函数不同,有特定的书写格式:#pragma vector = 中断向量__interrupt void 函数名称(void){/*此处编写中断处理函数的具体程序*/PxIFG = 0; //先清除Px引脚的中断状态标志位PxIF = 0; //再清除Px端⼝组的中断状态标志位}<1> 在每⼀个中断服务函数之前,都要加上⼀句起始语句:#pragma vector = <中断向量><中断向量>表⽰接下来要写的中断服务函数是为那个中断源服务的,该语句有两种写法:#pragma vector = 0x7B或者#pragma vector = P1INT_VECTOR前者是中断向量的⼊⼝地址,后者是头⽂件“ioCC2530.h”中的宏定义。
单片机外部中断详解及程序单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。
比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。
在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。
如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。
但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。
因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。
实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。
下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。
电路结构和接线不变,仅把程序改为下面的形式。
#include ;unsigned int t=500; //定义一个全局变量t,并设定初始值为500次//===========延时子函数,在8MHz晶振时约1ms=============void delay_ms(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//============主函数==================================void main( void ){DDRB = 0xFF; //设置端口B为输出方向PORTB = 0xFF; //设置端口B的输出为全高电平DDRD = 0x00; //设置端口D为输入方向PORTD = 0xFF; //设定端口D为内部上拉方式,无信号输入时处于高电平状态MCUCR = 0x0A; //设定INT0、INT1为下降沿触发GICR = 0xC0; //使能INT0、INT1中断SREG = 0x80; //使能总中断while(1){PORTB = 0x55; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个msPORTB = 0xAA; //让接在端口B上的LED显示01010101 delay_ms(t); //延时t个ms}}//============中断函数(外部0)==========================#pragma vector = INT0_vect__interrupt void INT0_Server(void){t = 100; //设定t的值为100次}//============中断函数(外部1)==========================#pragma vector = INT1_vect__interrupt void INT1_Server(void){t = 500; //设定t的值为500次}把上述程序进行编译并下载到单片机中,可以看到结果与第二个示例中的完全一致。
一、介绍Micropython外部中断函数的概念Micropython是一种精简版本的Python编程语言,专门用于嵌入式系统和微控制器。
它提供了对硬件的直接访问和控制,使得开发者可以使用Python语言来编写嵌入式系统的程序。
外部中断函数是Micropython中一个重要的功能,可以监听和响应外部事件,例如按键按下、传感器触发等,从而实现系统对外部环境的实时响应。
二、Micropython外部中断函数的基本原理1. 外部中断函数的概念外部中断函数是一种特殊的功能,能够在系统的运行过程中,实时地对外部事件进行监听和响应。
它可以在不影响系统正常运行的情况下,立即中断当前的程序执行,执行预先定义的外部中断函数。
这种功能对于嵌入式系统来说非常重要,因为它能够使系统实时地响应外部事件,从而提高系统的可靠性和实用性。
2. Micropython外部中断函数的实现在Micropython中,外部中断函数是通过预先定义的中断处理函数来实现的。
用户可以使用特定的语法和API接口来注册外部中断处理函数,当外部事件发生时,系统会立即执行相应的中断处理函数。
在中断处理函数中,用户可以编写对外部事件的响应逻辑,例如读取传感器数值、控制执行器等。
这种机制可以使得Micropython系统能够实时地响应外部事件,从而实现更加智能和可靠的嵌入式系统。
三、Micropython外部中断函数的应用场景1. 按键按下事件在很多嵌入式系统中,按键按下事件是一个非常常见的外部事件,例如控制器、机器人等。
通过注册外部中断函数,系统可以实时地监测按键按下事件,并且执行相应的逻辑,例如控制器可以根据按键按下事件来实现不同的操作,机器人可以通过按键按下事件来启动或者停止运动。
2. 传感器触发事件传感器是嵌入式系统中常用的外部设备,可以用来感知周围的环境信息,例如光线、声音、温度、湿度等。
通过注册外部中断函数,系统可以实时地监测传感器触发事件,并且执行相应的逻辑,例如控制系统可以根据光线传感器触发事件来调节亮度,温度传感器触发事件来控制风扇开关等。
A VR学习笔记之【外部中断】【一】Mega16共有三个外部中断,外部中断相比定时器而言它的寄存器比较少,因此相对比较简单。
我们现在只关心需要用的部分,其他的暂且放弃不管。
和外部中断相关的特殊功能寄存器有:①MCU控制寄存器(MCUCR)在上面八位的寄存器中,白色的部分使我们要关心的,灰色部分就不用管了。
资料上对后面四位(第四位)的作用有介绍。
ISC11与ISC10控制中断1的触发方式。
下表为ISC10/11的值对应触发方式:SC11与ISC10控制中断0的触发方式。
下表为ISC00/01的值对应触发方式:我们在使用外部中断0和1的时候,其触发方式的设置便是通过以上ISC的不同值实现的。
至于INT2下面有介绍。
②MCU控制与状态寄存器(MCUCSR)这个寄存器只有一个BIT与外部中断相关。
ISC2,我们通过和INT0/1的对比可以发现ISC的后缀数字命名只有规律的,这会方便我们记忆。
同时在说明文档上说了很长一段关于ISC2的说明:他的意思说早了,他也就是想说:ISC=0的话INT2是下降沿出发中断,ISC=1是上升沿出发。
这才是应该说明的最重要的点。
他后面还说了:(1)如果你让ISC=0那么外部的低电平必须保持到当前正在运行的指令运行结束才会出发,换一句意思就是,如果外部时间过短,有可能导致INT2不被触发。
(2)他又说明,如果改变ISC2的值的话有可能触发中断,导致误判,因此如果你想改变其中断触发方式的话,首先把通用中断控制寄存器(GICR)里面控制INT2的中断开关关了,这样便不会触发中断了。
③通用中断控制寄存器(GICR)他就是个中断开关。
前面三位依次赋值便会打开响应中断。
当然总中断开关也要打开才行(SREG|=BIT(7))。
④通用中断标志寄存器(GIFR)他就是一个中断标志,我们也就是说在中断发生的时候中断对用的标志会变为1,此时程序会自动转到中断程序子函数。
然后有硬件自动清零,以等待下一次的中断发生。
资料来源:/zzwdkxx/article/details/9036679 STM32-外部中断学习笔记2013-06-07 10:1813368人阅读评论(1) 收藏举报分类:STM32(25)目录(?)[+]中断分类STM32的EXTI控制器支持19 个外部中断/ 事件请求。
每个中断设有状态位,每个中断/ 事件都有独立的触发和屏蔽设置。
STM32的19个外部中断对应着19路中断线,分别是EXTI_Line0-EXTI_Line18:线0~15:对应外部IO口的输入中断。
线16:连接到PVD 输出。
线17:连接到RTC 闹钟事件。
线18:连接到USB 唤醒事件。
触发方式:STM32 的外部中断是通过边沿来触发的,不支持电平触发。
外部中断分组:STM32 的每一个GPIO都能配置成一个外部中断触发源,STM32 通过根据引脚的序号不同将众多中断触发源分成不同的组,比如:PA0,PB0,PC0,PD0,PE0,PF0,PG0为第一组,那么依此类推,我们能得出一共有16 组,STM32 规定,每一组中同时只能有一个中断触发源工作,那么,最多工作的也就是16个外部中断。
寄存器组EXTICR寄存器组,总共有4 个,因为编译器的寄存器组都是从0 开始编号的,所以EXTICR[0]~ EXTICR[3],对应《STM32参考手册》里的EXTICR1~ EXTICR 4(查了好久才搞明白这个数组的含义!!)。
每个EXTICR只用了其低16 位。
EXTICR[0] ~EXTICR[3]的分配如下:EXTI寄存器的结构体:typedef struct{vu32 IMR;vu32 EMR;vu32 RTSR;vu32 FTSR;vu32 SWIER;vu32 PR;} EXTI_TypeDef;IMR:中断屏蔽寄存器这是一个32 寄存器。
但是只有前19 位有效。
当位x 设置为1 时,则开启这个线上的中断,否则关闭该线上的中断。
STM32外部中断原理与配置STM32-外部中断原理与配置IO⼝外部中断原理概述STM32控制器⽀持的外部中断/事件请求中断线M3M4M7EXTI线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唤醒事件。
√√EXSTI线23:连接到LPTIM1异步事件√IO⼝外部中断STM32的每个IO都可以作为外部中断输⼊。
每个外部中断线可以独⽴的配置触发⽅式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专⽤的状态位。
STM32供IO使⽤的中断线只有16个,但是STM32F系列的IO⼝多达上百个,STM32F103ZGT6(112),那么中断线怎么跟io⼝对应呢?GPIO和中断线映射关系GPIOx.0映射到EXTI0GPIOx.1映射到EXTI1……GPIOx.14映射到EXTI14GPIOx.15映射到EXTI15对于M4/M7,配置寄存器为SYSCFG_EXTIRx对于M3,配置寄存器为AFIO_EXTICRx如下图所⽰,EXTI0[3:0]有4个位,可以配置16个,所以可以从PA0选择到PI0。
也就是说16个中断线,最多可以处理16*16个外部引脚的中断。
可以在⼿册中找到SYSCFG 外部中断配置寄存器:16个中断线就分配16个中断服务函数?IO⼝外部中断在中断向量表中只分配了7个中断向量,也就是只能使⽤7个中断服务函数。
从表中可以看出,外部中断线5~ 9分配⼀个中断向量,共⽤⼀个服务函数外部中断线10~15分配⼀个中断向量,共⽤⼀个中断服务函数。
中断服务函数列表:EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandlerIO⼝外部中断HAL库配置⽅法外部中断操作使⽤到的函数分布⽂件stm32fxxx_hal_gpio.hstm32fxxx_hal_gpio.c外部中断配置:外部中断的中断线映射配置和触发⽅式都是在GPIO初始化函数中完成:GPIO_InitTypeDef GPIO_Initure;GPIO_Initure.Pin=GPIO_PIN_0; //PA0GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发GPIO_Initure.Pull=GPIO_PULLDOWN;HAL_GPIO_Init(GPIOA,&GPIO_Initure);void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init){uint32_t position;uint32_t ioposition = 0x00;uint32_t iocurrent = 0x00;uint32_t temp = 0x00;/* Check the parameters */assert_param(IS_GPIO_ALL_INSTANCE(GPIOx));assert_param(IS_GPIO_PIN(GPIO_Init->Pin));assert_param(IS_GPIO_MODE(GPIO_Init->Mode));assert_param(IS_GPIO_PULL(GPIO_Init->Pull));/* Configure the port pins */for(position = 0; position < GPIO_NUMBER; position++){/* Get the IO position */ioposition = ((uint32_t)0x01) << position;/* Get the current IO position */iocurrent = (uint32_t)(GPIO_Init->Pin) & ioposition;if(iocurrent == ioposition){/*--------------------- GPIO Mode Configuration ------------------------*//* In case of Alternate function mode selection */if((GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)){/* Check the Alternate function parameter */assert_param(IS_GPIO_AF(GPIO_Init->Alternate));/* Configure Alternate function mapped with the current IO */temp = GPIOx->AFR[position >> 3];temp &= ~((uint32_t)0xF << ((uint32_t)(position & (uint32_t)0x07) * 4)) ;temp |= ((uint32_t)(GPIO_Init->Alternate) << (((uint32_t)position & (uint32_t)0x07) * 4));GPIOx->AFR[position >> 3] = temp;}/* Configure IO Direction mode (Input, Output, Alternate or Analog) */temp = GPIOx->MODER;temp &= ~(GPIO_MODER_MODER0 << (position * 2));temp |= ((GPIO_Init->Mode & GPIO_MODE) << (position * 2));GPIOx->MODER = temp;/* In case of Output or Alternate function mode selection */if((GPIO_Init->Mode == GPIO_MODE_OUTPUT_PP) || (GPIO_Init->Mode == GPIO_MODE_AF_PP) || (GPIO_Init->Mode == GPIO_MODE_OUTPUT_OD) || (GPIO_Init->Mode == GPIO_MODE_AF_OD)) {/* Check the Speed parameter */assert_param(IS_GPIO_SPEED(GPIO_Init->Speed));/* Configure the IO Speed */temp = GPIOx->OSPEEDR;temp &= ~(GPIO_OSPEEDER_OSPEEDR0 << (position * 2));temp |= (GPIO_Init->Speed << (position * 2));GPIOx->OSPEEDR = temp;/* Configure the IO Output Type */temp = GPIOx->OTYPER;temp &= ~(GPIO_OTYPER_OT_0 << position) ;temp |= (((GPIO_Init->Mode & GPIO_OUTPUT_TYPE) >> 4) << position);GPIOx->OTYPER = temp;}/* Activate the Pull-up or Pull down resistor for the current IO */temp = GPIOx->PUPDR;temp &= ~(GPIO_PUPDR_PUPDR0 << (position * 2));temp |= ((GPIO_Init->Pull) << (position * 2));GPIOx->PUPDR = temp;/*--------------------- EXTI Mode Configuration ------------------------*//* Configure the External Interrupt or event for the current IO */if((GPIO_Init->Mode & EXTI_MODE) == EXTI_MODE){/* Enable SYSCFG Clock */__HAL_RCC_SYSCFG_CLK_ENABLE();temp = SYSCFG->EXTICR[position >> 2];temp &= ~(((uint32_t)0x0F) << (4 * (position & 0x03)));temp |= ((uint32_t)(GPIO_GET_INDEX(GPIOx)) << (4 * (position & 0x03)));SYSCFG->EXTICR[position >> 2] = temp;/* Clear EXTI line configuration */temp = EXTI->IMR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & GPIO_MODE_IT) == GPIO_MODE_IT){temp |= iocurrent;}EXTI->IMR = temp;temp = EXTI->EMR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & GPIO_MODE_EVT) == GPIO_MODE_EVT){temp |= iocurrent;}EXTI->EMR = temp;/* Clear Rising Falling edge configuration */temp = EXTI->RTSR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & RISING_EDGE) == RISING_EDGE){temp |= iocurrent;}EXTI->RTSR = temp;temp = EXTI->FTSR;temp &= ~((uint32_t)iocurrent);if((GPIO_Init->Mode & FALLING_EDGE) == FALLING_EDGE){temp |= iocurrent;}EXTI->FTSR = temp;}}}}和串⼝中断⼀样,HAL库同样提供了外部中断通⽤处理函数HAL_GPIO_EXTI_IRQHandler,我们在外部中断服务函数中会调⽤该函数处理中断。
51单片机中断函数(原创版)目录1.51 单片机中断函数概述2.51 单片机中断函数的分类3.51 单片机中断函数的响应过程4.51 单片机中断函数的应用实例5.总结正文一、51 单片机中断函数概述在 51 单片机中,中断函数是一种在程序运行过程中,响应外部或内部事件的机制。
通过中断函数,单片机可以在执行过程中,暂停当前任务,转去处理其他更重要的任务,待处理完毕后,再回到原任务继续执行。
这种机制可以有效提高程序的实时性和响应速度,使得单片机更加智能化和灵活。
二、51 单片机中断函数的分类51 单片机的中断函数主要分为两大类:外部中断函数和内部中断函数。
1.外部中断函数:外部中断函数是由外部设备产生的中断请求信号触发的,例如按键、传感器等。
当外部设备产生中断请求时,单片机会暂停当前任务,转去处理外部中断,待处理完毕后,再回到原任务继续执行。
2.内部中断函数:内部中断函数是由单片机内部产生的中断请求信号触发的,例如定时器中断、串行通信中断等。
当单片机内部产生中断请求时,单片机会暂停当前任务,转去处理内部中断,待处理完毕后,再回到原任务继续执行。
三、51 单片机中断函数的响应过程当外部或内部事件产生中断请求时,51 单片机会进行如下响应过程:1.中断请求信号被捕获:当外部或内部事件产生中断请求时,单片机会捕获到该信号。
2.中断响应:单片机接收到中断请求信号后,会立即停止当前任务的执行,转去处理中断请求。
3.中断处理:单片机会根据中断类型,调用相应的中断服务函数进行处理。
4.中断返回:中断服务函数处理完毕后,单片机会返回原任务继续执行。
四、51 单片机中断函数的应用实例以定时器中断为例,定时器中断是一种常见的内部中断,当定时器计数值到达设定值时,会产生中断请求。
单片机接收到中断请求后,会调用定时器中断服务函数进行处理,例如更新计时器计数值、执行特定任务等。
处理完毕后,单片机会返回原任务继续执行。
五、总结51 单片机中断函数是一种在程序运行过程中,响应外部或内部事件的机制。
(stm32f103学习总结)—stm32外部中断⼀、外部中断介绍1.1 EXTI简介 EXTI简介 STM32F10x外部中断/事件控制器(EXTI)包含多达 20 个⽤于产⽣事 件/中断请求的边沿检测器。
EXTI的每根输⼊线都可单独进⾏配置,以选 择类型(中断或事件)和相应的触发事件(上升沿触发、下降沿触发或 边沿触发),还可独⽴地被屏蔽。
(stm32f103有19个)1.2 EXTI结构框图1.3 外部中断/事件线映射 STM32F10x的EXTI具有20个中断/事件线,如下:(stm32f103有19个以太⽹唤醒事件没有;stm32f107有20个) STM32F10x 的 EXTI 供外部 IO ⼝使⽤的中断线有 16 根,但是我们使⽤的 STM32F103 芯⽚却远远不⽌ 16 个 IO ⼝,那么 STM32F103 芯⽚怎么解决这个问题的呢? 因为 STM32F103 芯⽚每个 GPIO 端⼝均有 16 个管脚,因此把每个端⼝的 16 个 IO 对应那 16 根中断线 EXTI0-EXTI15 。
⽐如:GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G)分别对应中断线 EXTI0-EXTI15,这样⼀来每个中断线就对应了最多 7 个 IO ⼝,⽐如:GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。
但是中断线每次只能连接⼀个在 IO ⼝上,这样就需要通过 AFIO 的外部中断配置寄存器 1 的 EXTIx[3:0]位来决定对应的中断线映射到哪个GPIO 端⼝上,对于中断线映射到 GPIO 端⼝上的配置函数在stm32f10x_gpio.c 和 stm32f10x_gpio.h 中,所以使⽤到外部中断时要把这个⽂件加⼊到⼯程中,在创建库函数模板的时候我们默认已经添加。
EXTI 的 GPIO 映射图如图 18.1.3 所⽰:⼆、外部中断配置步骤 要使⽤外部中断我们就需要先配置它,通常都需经过这⼏步:(1)使能IO ⼝时钟,配置IO ⼝模式为输⼊(2)开启 AFIO 时钟,设置 IO ⼝与中断线的映射关系RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //开启AFIO 时钟void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource); //设置IO ⼝与中断线的映射关系即哪个io ⼝哪⼀个管脚作为中断输⼊线GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); //这⾥以配置GPIOA ⼝ GPIOA 的第0管脚作为中断输⼊线(3)配置中断分组(NVIC ),使能中断(4)初始化EXTI ,选择触发⽅式(5)编写EXTI 中断服务函数(中断函数固件库中已经定义必须使⽤下列函数名不能⾃⼰定义)EXTI0_IRQHandlerEXTI1_IRQHandlerEXTI2_IRQHandlerEXTI3_IRQHandlerEXTI4_IRQHandlerEXTI9_5_IRQHandlerEXTI15_10_IRQHandler三、编写外部中断控制程序 要实现外部中断⽅式控制LED ,程序框架如下:(1)初始化对应端⼝的EXTI (第三部分中的1-4⼩步)1 void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);2 typedef struct3 {4 uint32_t EXTI_Line; //中断/事件线5 EXTIMode_TypeDef EXTI_Mode; //EXTI 模式6 EXTITrigger_TypeDef EXTI_Trigger; //EXTI 触发⽅式7 FunctionalState EXTI_LineCmd; //中断线使能或失能8 }EXTI_InitTypeDef ;(2)编写EXTI中断函数(3)编写主函数1/*******************************************************************************2* 函数名 : My_EXTI_Init3* 函数功能 : 外部中断初始化4* 输⼊ : ⽆5* 输出 : ⽆6*******************************************************************************/7void My_EXTI_Init(void)8{9 NVIC_InitTypeDef NVIC_InitStructure;10 EXTI_InitTypeDef EXTI_InitStructure;1112 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //AFIO使能13 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);//选择GPIO管脚⽤作外部中断线路14//EXTI0 NVIC 配置15 NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;//EXTI0中断通道16 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级17 NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //⼦优先级18 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能19 NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器20//初始化EXTI 配置21 EXTI_InitStructure.EXTI_Line=EXTI_Line0;22 EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;23 EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising;24 EXTI_InitStructure.EXTI_LineCmd=ENABLE;25 EXTI_Init(&EXTI_InitStructure);26}1/*******************************************************************************2* 函数名 : EXTI0_IRQHandler3* 函数功能 : 外部中断0函数4* 输⼊ : ⽆5* 输出 : ⽆6*******************************************************************************/7void EXTI0_IRQHandler(void)8{9 if(EXTI_GetITStatus(EXTI_Line3)==1) //判断EXTI中断标志位状态函数10 {11 //填写中断中需要完成的程序12 }13 EXTI_ClearITPendingBit(EXTI_Line3); //在结束中断服务函数前,清楚中断标志位1415 }。
外部中断函数
外部中断是指由外部硬件设备所产生的中断信号,如输入输出设备、定时设备等。
当外部中断信号发生时,CPU会停止执行当前程序,并跳转到外部中断服务程序(一般称为中断向量表)执行,以响应外部设备的请求和处理。
外部中断函数一般包括以下几个方面的内容:
1. 中断初始化
中断初始化主要包括对中断控制寄存器的设置和中断向量表的初始化。
中断控制寄存器包括一些位控制器(如中断请求使能、嵌套中断控制等),一般需要根据具体的中断请求设置相关寄存器。
中断向量表是用来保存每个中断源对应的中断处理函数。
在初始化过程中,需要将中断向量表的每个位置初始化为相应中断源的处理函数地址。
2. 中断服务程序的编写
中断服务程序是处理具体中断请求的程序。
它在中断向量表中的地址被启动后,会促使CPU在中断响应后立即执行。
因此,中断服务程序需要尽可能地短小精悍,以避免在中断响应期间对系统的影响。
中断服务程序设计的最终目的是尽可能快地处理中断请求,并返回正常程序执行。
3. 中断嵌套控制
中断嵌套控制用来控制多个中断请求同时发生的情况。
由于每个中断源的中断优先级不同,因此需要对中断响应的优先级进行设置。
在高优先级中断程序执行时(如定时器),如果产生低优先级的中断需求,则可以设置相应的“屏蔽位”来延迟该中断请求的响应,以确保高优先级中断程序能够及时地执行完毕。
4. 中断清除和退出
中断清除是指在中断处理过程中统计计数器、设置标志位、清除中断请求等操作。
中断退出是实现程序从中断服务程序恢复到主程序执行之前所必需的工作。
中断退出需要处理相关寄存器、栈指针、状态字等。
在退出中断时,还需要确保中断响应已结束并将执行权转交给主程序。
总之,外部中断函数是嵌入式系统中非常重要的一部分,尤其是对于实时控制系统来说。
外部中断的正确设置和处理,可以极大地提高嵌入式系统对外界环境的响应能力,为系统的稳定性和实时性提供有力保障。