EXTI(外部中断/事件)控制器NVIC(嵌套中断向量控制器)中断系统编程步骤1.11.21.3第四章中断系统编程1.1EXTI(外部中断/事件)控制器EXTI:Externalinterrupt/event,外部中断、外部事件1.1.3STM32单片机的EXTI配置1.1.1STM32单片机的EXTI工作机制1.1.2STM32单片机的EXTI线路对于互联型产品,外部中断/事件控制器由20个产生事件/中断请求的边沿检测器组成;对于其它产品,则由19个能产生事件/中断请求的边沿检测器组成。如下图所示。每个输入线可以独立地配置输入类型(脉冲或挂起)和对应的触发事件(上升沿或下降沿或者双边沿都触发)。每个输入线都可以独立地被屏蔽。挂起寄存器保持着状态线的中断请求。1.1.1STM32单片机的EXTI工作机制STM32F10xSTM32单片机的EXTI(外部中断与外部事件)控制器结构框图(EXTI线)(即APB2clock)STM32单片机的外部中断、外部事件机制1、外部中断的请求机制2、外部事件的请求机制中断和事件的比较图中的蓝色虚线箭头,标出了外部中断信号的传输路径:首先外部信号从编号1的芯片引脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断“登记(挂起)请求寄存器”,最后经过编号4的与门输出到M3内核的NVIC中断控制器。在这个通道上有4个控制部分①外部的信号首先经过边沿检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器同时控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。1、外部中断的请求机制②接下来是编号3的或门,这个或门的另一个输入是“软件中断/事件寄存器”,从这里可以看出,软件可以优先于外部信号请求一个中断或事件,既当“软件中断/事件寄存器”的对应位为“1”时,不管外部信号如何,编号3的或门都会输出有效信号。③一个中断或事件请求信号经过编号3的或门后,进入“登记(挂起)请求寄存器”,到此,中断和事件的信号传输通路都是一致的,也就是说,“登记(挂起)请求寄存器”中记录了外部请求信号。④外部请求信号最后经过编号4的与门,向CM3内核的NVIC中断控制器发出一个中断请求,如果“中断屏蔽寄存器”的对应位为“0”,则该请求信号不能传输到与门的另一端,实现了中断的屏蔽。STM32F10x如果一个发生的中断(异常)不能被即刻响应,就称它被“挂起”(pending)。不过,少数fault异常是不允许被挂起的。一个中断(异常)被挂起的原因,可能是系统当前正在执行一个更高优先级中断(异常)的服务例程,或者因相关掩蔽位的设置导致该中断(异常)被除能。在ARMCortex-M3中,对于每个中断(异常)源,在被挂起的情况下,都会有一个对应的“挂起状态寄存器”保存其中断(异常)请求,直到该中断(异常)能够执行为止,这与MCS51单片机是完全不同的。在MCS51单片机中,中断请求信号是由产生中断的设备保持住。现在NVIC的挂起状态寄存器的出现解决了这个问题,即使设备在后来已经释放了请求信号,曾经的中断请求也不会错失。对不能立即响应的中断请求信号的处理方法不同:2、外部事件的请求机制图中红色虚线箭头,标出了外部事件信号的传输路径:外部请求信号经过编号3的或门后,进入编号5的与门,这个与门的作用与编号4的与门类似,用于引入“事件屏蔽寄存器”的控制;最后脉冲发生器把一个跳变的信号(边沿检测电路检测到的跳变信号)转变为一个单脉冲,输出到芯片中的其它功能模块。在这张图上我们也可以知道,从外部激励信号来看,中断和事件是没有分别的,只是在芯片内部分开,一路信号会向CPU产生中断请求,另一路信号会向其它功能模块发送脉冲触发信号,其它功能模块如何相应这个触发信号,则由对应的模块自己决定。中断和事件的比较事件本质上就是一个触发信号,是用来触发特定的外设模块或核心本身(唤醒);事件只是一个触发信号(脉冲),而中断则是一个固定的电平信号事件可以触发中断,也可以不触发;中断有可能被更优先的中断屏蔽,事件不会被屏蔽STM32F10x1.1.2STM32单片机的EXTI线路(或STM32单片机的GPIO与EXTI的映射关系)STM32单片机的112个通用I/O端口线(口的某一位,称为口线)以下图的方式连接到16个外部中断/事件(EXTIx)线上:------其中每根EXTIx线上可接PAx~PGx共7个通用I/O端口线其中之一。x=0~15。(16*7=112)STM32F10x……STM32F10x外部中断配置寄存器1(AFIO_EXTICR1)STM32F10x外部中断配置寄存器2(AFIO_EXTICR2)STM32F10x外部中断配置寄存器3(AFIO_EXTICR3)STM32F10x外部中断配置寄存器4(AFIO_EXTICR4)STM32F10xPAx、PBx、PCx、PDx和PEx端口的相同口线对应的是同一个外部中断/事件源EXTIx(x:0~15)。注意:∵配置GPIO口线上的EXTI(外部中断/事件),是通过AFIO_EXTICRx寄存器来进行的。∴使用前,必须先使能AFIO时钟。虽然,挂接在APB2总线上的,既有EXTI外设,又有AFIO外设,但当使用EXTI外设时,使能时钟的是使能AFIO时钟。STM32F10x另外四个EXTI线的连接方式如下:●EXTI线16连接到PVD(电源电压检测)输出●EXTI线17连接到RTC闹钟事件●EXTI线18连接到USB唤醒事件●EXTI线19连接到以太网唤醒事件(只适用于互联型产品)另外,在固件库函数RCC_APB2PeriphClockCmd()中:参数RCC_APB2Periph指定的APB2外设,不包括EXTI外设,即固件库函数不能使能EXTI外设对应的时钟。STM32单片机的可屏蔽中断通道对应的中断向量表位置优先级优先级类型名称说明地址……18可设置PVD连接到EXTI的电源电压检测(PVD)中断0x0000_0044……613可设置EXTI0EXTI线0中断0x0000_0058714可设置EXTI1EXTI线1中断0x0000_005C815可设置EXTI2EXTI线2中断0x0000_0060916可设置EXTI3EXTI线3中断0x0000_00641017可设置EXTI4EXTI线4中断0x0000_0068位置优先级优先级类型名称说明地址……2330可设置EXTI9_5EXTI线[9:5]中断0x0000_009C……4047可设置EXTI15_10EXTI线[15:10]中断0x0000_00E04148可设置RTCAlarm连接到EXTI的RTC闹钟中断0x0000_00E44249可设置USB唤醒连接到EXTI的从USB待机唤醒中断0x0000_00E8……6269可设置ETH_WKUP连接到EXTI的以太网唤醒中断0x0000_0138STM32F10x位置优先级优先级类型名称说明地址……4148可设置RTCAlarm连接到EXTI的RTC闹时中断0x0000_00E4……310可设置RTC实时时钟(RTC)全局中断0x0000_009C不同注意:STM32F10x1.1.3STM32单片机的EXTI配置1、EXTI(外部中断/事件)定义3、EXTI_InitTypeDef初始化EXTI参数定义4、EXTI_Init初始化EXTI定义2、GPIO_EXTILineConfig选择GPIO管脚接EXTIx线每个EXTI:共有6个设置寄存器①中断屏蔽寄存器(EXTI_IMR):IMR--Interruptmaskregister,用于屏蔽(或开放)来自线X(0~19)上的中断请求。②事件屏蔽寄存器(EXTI_EMR):EMR--Eventmaskregister,用于屏蔽(或开放)来自线X(0~19)上的事件请求。③上升沿触发选择寄存器(EXTI_RTSR):RTSR--Risingtriggerselectionregister,用于屏蔽(或开放)来自输入线X上的上升沿触发(中断和事件)④下降沿触发选择寄存器(EXTI_FTSR):FTSR--Fallingtriggerselectionregister,禁止输入线x上的下降沿触发(中断和事件)⑤软件中断事件寄存器(EXTI_SWIER):SWIER--Softwareinterrupteventregister,输入线X上的软件中断/事件。由软件来请求一个中断或事件。⑥挂起寄存器(EXTI_PR):PR--Pendingregister。PRx:挂起位(Pendingbit),当其为1时,登记了外部请求信号。1、EXTI外部中断/事件定义STM32F10xESTM32F10x1、EXTI外部中断/事件定义在文件“stm32f10x_map.h”中定义如下:typedefstruct{vu32IMR;vu32EMR;vu32RTSR;vu32FTSR;vu32SWIER;vu32PR;}EXTI_TypeDef;//用结构体EXTI_TypeDef定义EXTI外部中断/事件//或称用结构体EXTI_TypeDef定义EXTI寄存器组编程时,EXTI外部中断/事件的具体配置是从EXTI寄存器组开始。首先,用结构体EXTI_TypeDef定义EXTI寄存器组:EXTI外部中断/事件的6个设置寄存器STM32F10xEXTI外部中断/事件寄存器组的首地址:/*Peripheralbaseaddressinthebit-bandregion*/#definePERIPH_BASE((u32)0x40000000)/*Peripheralmemorymap*/#defineAPB1PERIPH_BASEPERIPH_BASE#defineAPB2PERIPH_BASE(PERIPH_BASE+0x10000)#defineAHBPERIPH_BASE(PERIPH_BASE+0x20000)0x40010400#defineEXTI_BASE(APB2PERIPH_BASE+0x0400)#ifdef_EXTI#defineEXTI((EXTI_TypeDef*)EXTI_BASE)#endif/*_EXTI*/2、GPIO_EXTILineConfig选择GPIO管脚接EXTIx线①其中参数GPIO_PortSource可能的取指:GPIO_PortSourceGPIOA,GPIO_PortSourceGPIOB,GPIO_PortSourceGPIOC,GPIO_PortSourceGPIOD,GPIO_PortSourceGPIOE,GPIO_PortSourceGPIOF,GPIO_PortSourceGPIOGSTM32F10x在文件“stm32f10x_gpio.h”中,定义/*GPIOPortSources---------------------------------------------------------*/#defineGPIO_PortSourceGPIOA((u8)0x00)#defineGPIO_PortSourceGPIOB((u8)0x01)#defineGPIO_PortSourceGPIOC((u8)0x02)#defineGPIO_PortSourceGPIOD((u8)0x03)#defineGPIO_PortSourceGPIOE((u8)0x04)#defineGPIO_PortSourceGPIOF((u8)0x05)#defineGPIO_PortSourceGPIOG((u8)0x06)注意:在第2版固件函数库中,“10.2.17函数GPIO_EXTILineConfig”有错误,见下应该去掉“_”。STM32F10x②其中参数GPIO_PinSource可能的取指:GPIO_PinSourcex(x=0~15