本文介绍了STM32基于标准外设库的外部中断配置,以及基于参考手册如何更加寄存器配置外部中断 2 STM32的外部中断 下图来自《STM32参考手册》,从整个架构图可以知道,外部中断的功能可以配置六个寄存器; 中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR) 上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) EXTI支持配置20个中断和事件屏蔽位; GPIO端口以下图的方式连接到16个外部中断/事件线上;EXTI_Line0 — EXTI_Line15; EXTI_Line16 连接到PVD输出 ; EXTI_Line17连接到RTC闹钟事件; EXTI_Line18连接到USB唤醒事件; EXTI_Line19连接到以太网唤醒事件(只适用于互联型产品); - L6 U# O. t- v4 Q GPIO的映射关系图如下所示; 3 中断服务函数的映射关系 4 外部中断的配置 宏定义,抽象一下接口,方便后面修改; #define Z_GPIO_PIN GPIO_Pin_5 #define Z_GPIO_PORT GPIOE #define Z_PortSource GPIO_PortSourceGPIOE #define Z_PinSource GPIO_PinSource5 #define Z_Line EXTI_Line5 #define Z_IRQ EXTI9_5_IRQn 8 j @" s1 G1 Q; ?# C GPIO的配置;这里GPIO的输入模式可以配置为浮空输入(GPIO_Mode_IN_FLOATING),上拉输入(GPIO_Mode_IPU)或者下拉输入(GPIO_Mode_IPD),具体如下图所示; , G1 x& S1 U8 v9 w2 p5 J) _- DGPIO的配置代码如下; GPIO_InitTypeDef GPIO_InitStructure; GPIO_StructInit(&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = Z_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(Z_GPIO_PORT, &GPIO_InitStructure); 不要忘记外设总线时钟的配置; RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF | RCC_APB2Periph_GPIOG, ENABLE); EXTI的配置,EXTI_Trigger这里支持三种模式; EXTI_Trigger_Rising 上升沿触发; EXTI_Trigger_Falling 下降沿触发; EXTI_Trigger_Rising_Falling 上升沿和下降沿都可以触发; GPIO_EXTILineConfig(Z_PortSource, Z_PinSource); EXTI_InitStructure.EXTI_Line = Z_Line; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿 EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC的配置 NVIC_InitStructure.NVIC_IRQChannel = Z_IRQ; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); 9 ]# A- V4 d/ _1 N8 t 中断服务函数 void EXTI9_5_IRQHandler(void) { //中断服务函数 } 以上就完成了检测下降沿信号的GPIOE5的外部中断; 也参考官方DEMO, STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\EXTI\EXTI_Config。 6 Y' v5 _% x' O& y6 Y0 ^ 5 寄存器的操作 以下摘自**《STM32参考手册》** 产生产生中断的步骤,必须先配置好并使能中断线。根据需要的边沿检测设置2个触发寄存器,同时在**中断屏蔽寄存器(EXTI_IMR)的相应位写1允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置1。在挂起寄存器(EXTI_PR)的对应位写1,将清除该中断请求。 产生事件的步骤:必须先配置好并使能事件线。根据需要的边沿检测通过设置2个触发寄存器,同时在中断屏蔽寄存器(EXTI_IMR)**的相应位写1允许事件请求。当事件线上发生了需要的边沿时,将产生一个事件请求脉冲,对应的挂起位不被置1。通过在软件中断/事件寄存器写1,也可以通过软件产生中断/事件请求。 中断屏蔽寄存器(EXTI_IMR) 事件屏蔽寄存器(EXTI_EMR) 上升沿触发选择寄存器(EXTI_RTSR) 下降沿触发选择寄存器(EXTI_FTSR) 软件中断事件寄存器(EXTI_SWIER) 挂起寄存器(EXTI_PR) IMR如下图所示,其他几个类似; 5.1 硬件中断选择 通过下面的过程来配置20个线路做为中断源: 配置20个中断线的屏蔽位(EXTI_IMR) 配置所选中断线的触发选择位(EXTI_RTSR和EXTI_FTSR); 配置对应到外部中断控制器(EXTI)的NVIC中断通道的使能和屏蔽位,使得20个中断线中的请求可以被正确地响应。 5.2 硬件事件选择 通过下面的过程,可以配置20个线路为事件源 配置20个事件线的屏蔽位(EXTI_EMR) 配置事件线的触发选择位(EXTI_RTSR和EXTI_FTSR) 5.3 软件中断/事件的选择 20个线路可以被配置成软件中断/事件线。下面是产生软件中断的过程: 配置20个中断/事件线屏蔽位(EXTI_IMR, EXTI_EMR) 设置软件中断寄存器的请求位(EXTI_SWIER) 6 总结 本文参考stm32手册对于外部中断的概念以及配置进行了介绍,本人能力有限,难免存在错误和纰漏,请大佬不吝赐教。 转载自:硬件攻城狮 如有侵权请联系删除 |