EXTI 简介
EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。
EXTI 功能框图
EXTI的功能框图包含了 EXTI最核心内容,EXTI可分为两大部分功能,一个是产生中断,另一个是产生事件。EXTI功能框图如下:
中断/事件线
EXTI有23个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0至EXTI15,还有另外七根用于特定的外设事件。
EXTI0至EXTI15用于GPIO,通过编程控制可以实现任意一个GPIO作为 EXTI的输入源。由上图可知,EXTI0可以通过AFIO的外部中断配置寄存器 1(AFIO_EXTICR1)的EXTI0[3:0]位选择配置为PA0、PB0、PC0、PD0、PE0、PF0、PG0、PH0 或者PI0,其他EXTI线(EXTI中断/事件线)使用配置都是类似的。
外设事件连接模式:
EXTI line 16 连接PVD输出
EXTI line 17 连接RTC闹钟事件
EXTI line 18 连接USB OTG FS唤醒事件
EXTI line 19 连接以太网唤醒事件
EXTI line 20 连接USB OTG HS唤醒事件
EXTI line 21 连接RTC 篡改和时标事件
EXTI line 22 RTC唤醒事件
EXTI 初始化结构体
标准库函数对每个外设都建立了一个初始化结构体,比如 EXTI_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如 EXTI_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。
初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。初始化结构体定义在 cks32f4xx_exti.h 文件中,初始化库函数定义在 cks32f4xx_exti.c 文件中,编程时我们可以结合这两个文件内注释使用。
EXTI操作流程
a)首先配置GPIO引脚模式:
RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* 配置GPIOA.0 */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; /* 配置为输入模式 */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; /* 配置速率为高速模式 */ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; /* 使能下拉模式 */ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; /* 调用初始化函数 */ GPIO_Init(GPIOA, &GPIO_InitStructure);typedefstruct
b)配置EXTI line0中断线连接GPIOA.0:
typedefstrucSYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, GPIO_PinSource0); t
c)配置中断线为中断模式,上升沿触发模式并使能:
EXTI_InitTypeDef EXTI_Structure; EXTI_StructInit(&EXTI_Structure); /* 配置中断线0 */ EXTI_Structure.EXTI_Line = EXTI_Line0; /* 使用中断模式 */ EXTI_Structure.EXTI_Mode = EXTI_Mode_Interrupt; /* 电压低于阀值时产生中断 */ EXTI_Structure.EXTI_Trigger = EXTI_Trigger_Raising; /* 使能中断线 */ EXTI_Structure.EXTI_LineCmd = ENABLE; /* 初始化中断 */ EXTI_Init(&EXTI_Structure);
d)配置中断管理器NVIC,设置EXTI0_IRQn中断源优先级并初始化:
Svoid NVIC_Configuration(void) { NVIC_InitTypeDef NVIC_InitStructure; /* 嵌套向量中断控制器组选择 */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); /* 配置EXTI0_IRQn中断源 */ NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; /* 抢断优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; /* 子优先级为1 */ NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; /* 使能中断 */ NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /* 初始化配置NVIC */ NVIC_Init(&NVIC_InitStructure); } NVIC_PriorityGroupConfig(NVYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, GPIO_PinSource0);
e)当产生 EXTI0中断,在中断程序中进行相应的处理:
typvoid EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { EXTI_ClearITPendingBit(EXTI_Line0); /* 添加用户处理代码 */ } } edefstruct
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !