![](https://img-blog.csdnimg.cn/a9f39a5d45a84a86b8a980f7977c2ad2.png)
EXTI简介
EXTI可以实现对每个中断/时间进行单独配置,可以配置为中断或事件,以及促发事件的属性
EXTI功能框图(EXTI位于APB2总线上)
![](https://img-blog.csdnimg.cn/f11277f480084b71a04504bc223b8379.png)
(可以看野火视频加深理解)
中断/事件线
![](https://img-blog.csdnimg.cn/a43a0272995b4527add91fdf3fd21eed.png)
EXTI0——EXTI15用于GPIO,通过编程可以实现任何一个端口作为EXTI的输入源
由图可知,EXTI0可以通过AFIO的外部中断配置器1(AFIO_EXTICR1)选择配置为PA0,PB0,PC0,PD0.....,其他EXTIx的配置是类似的
EXTI结构体变量
typedef struct{uint32_t EXTI_Line; //中断/事件线选择,可选则EXTI0-EXTI15/*EXTI16-PVD输出 EXTI17-RTC闹钟事件 EXTI18-USB唤醒事件 EXTI19以太网唤醒事件*/EXTIMode_TypeDef EXTI_Mode; //EXTI模式选择 可选择产生中断(EXTI_Mode_Interupt)或者事件(EXTI_Mode_Event)EXTITrigger_TypeDef EXTI_Trigger; //EXTI边沿促发事件,可选上升沿促发,下降沿促发,上升沿和下降沿都促发FunctionalState EXTI_LineCmd; //控制是否使能EXTI线 (ENABLE)或者(DISABLE)}EXTI_InitTypeDef;
GPIO_EXTILineConfig()://将选择的GPIOx作为EXTIx
实验设计
1)PA0连接到EXT用于产生中断,PA0的电平变化通过按键控制
2)通过PA0中断控制LED
EXTI.h函数编写#ifndef __EXTI_H#define __EXIT_H#include "sys.h"void EXTIX_Init(void);//外部中断初始化#endifEXTI.c函数编写#include "exti.h"#include "led.h"#include "delay.h"//外部中断0服务程序void EXTIX_Init(void){EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟 AFIO时钟//初始化IO口RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//KEY0 PA0GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING; //设置成浮空输入//输入不用设置速度GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0//初始化EXTI 需要提前打开AFIO时钟//GPIOA0 中断线以及中断初始化配置 上升沿触发 //KEY1GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);EXTI_InitStructure.EXTI_Line=EXTI_Line0; //选择线0EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; //选择中断模式EXTI_InitStructure.EXTI_Trigger =EXTI_Trigger_Rising; //选择上升沿促发EXTI_InitStructure.EXTI_LineCmd =ENABLE; //使能线中断EXTI_Init(&EXTI_InitStructure); //根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器//初始化NVIC/* 配置NVIC为优先级组1 */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; //使能按键PA0所在的外部中断通道NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; //抢占优先级2,NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道NVIC_Init(&NVIC_InitStructure);}//外部中断0服务程序void EXTI0_IRQHandler(void){//确保是否产生了EXTI Line中断if(EXTI_GetITStatus(EXTI_Line0) != RESET){........................//清除中断标志位EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);}}
注:使用线0-线4时,NVIC_IRQChanne = EXTI0_IRQn | EXTI1_IRQn | EXTI2_IRQn | EXTI3_IRQn | EXTI4_IRQn
:使用线5-线9时, NVIC_IRQChannel = EXTI9_5_IRQn;
:使用线10-线15时,NVIC_IRQChannel = EXTI15_10_IRQn;
需记住,否则会出错
注:中断服务函数名称需要在startup_stm32f10x_hd.s中寻找264-323中.