关于STM32外部中断EXTI10-15,EXTI5-9共用一个中断向量处理方法

利用   ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)   函数判断具体的中断源 再进一步处理

注意:因为调用了 delay_ms() 函数  因此主函数的开头 必须初始化 延时函数 delay_init()   ps 因为这个原因调了一天了 多么痛的领悟!!

具体如下:

<think>嗯,用户想要了解STM32外部中断线59中断服务函数的信息和实现方法。首先,我需要回忆一下STM32中断系统结构。STM32EXTI外部中断/事件控制器)管理着多个外部中断线,其中EXTI5EXTI9是共享同一个中断向量的,也就是说,当中断发生时,需要在同一个服务函数里处理这些线路的中断请求。 根据参考的文献,比如引用[1]提到,NVIC管理所有中断,而每个中断都有自己的ISR,但用户需要自行编写代码。引用[2]和[4]也提到了EXTI外部中断的具体配置,包括NVIC初始化和中断优先级的设置。用户可能需要具体的步骤来配置这些中断线,并编写相应的中断服务函数。 首先,应该确认外部中断线的配置步骤,包括GPIO初始化、EXTI配置以及NVIC的设置。然后,在中断服务函数中,需要检查对应的中断标志位,以确定是哪个线路触发了中断,并进行相应的处理同时,清除中断标志位也是关键,否则会反复进入中断。 用户可能还需要示例代码来理解如何实现这些步骤。例如,配置GPIO为输入模式,并连接到EXTI线路。然后配置EXTI的触发方式,如上升沿、下降沿或双边沿触发。接着,在NVIC中启用对应的中断,并设置优先级。最后,在中断服务函数EXTI9_5_IRQHandler中,通过检查EXTI_GetITStatus函数来确定具体的中断源,并处理相应的逻辑。 还需要注意,在配置过程中可能会有常见的错误,比如未正确清除中断标志,导致中断不断触发。此外,多个中断线共享同一个服务函数时,必须逐一检查每个可能的中断源,确保所有情况都被处理。 用户可能还会关心如何验证中断是否正常工作,比如通过LED状态变化或串口输出调试信息。同时,参考手册中的相关章节,如STM32中文参考手册的表55,可能提供了中断向量和优先级的详细信息,这也是配置时的重要依据。 总之,回答需要结构清晰,分步骤讲解配置过程,提供示例代码,并指出常见问题和解决方法同时,确保引用相关的参考资料,如用户提供的引用[1]、[2]、[4],以增强答案的可信度。</think>### STM32外部中断线5-9中断服务函数实现方法 根据STM32中断系统设计,外部中断线59共用一个中断服务函数$EXTI9\_5\_IRQHandler$。以下是实现步骤和要点: #### 一、硬件配置与初始化 1. **GPIO配置** ```c GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6; //例如配置GPIO5和GPIO6 GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; //上升沿触发中断 GPIO_InitStruct.Pull = GPIO_PULLDOWN; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //假设使用GPIOB ``` 需确保GPIO模式设置为$GPIO\_MODE\_IT\_*$(中断触发模式)[^2][^4]。 2. **EXTI中断线绑定** 通过SYSCFG将GPIO引脚映射到对应的EXTI线: ```c __HAL_RCC_SYSCFG_CLK_ENABLE(); //启用SYSCFG时钟 HAL_SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI5_PinSource5); HAL_SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI6_PinSource6); ``` #### 二、NVIC配置 ```c NVIC_InitTypeDef NVIC_InitStruct; NVIC_InitStruct.NVIC_IRQChannel = EXTI9_5_IRQn; //EXTI5-9共用该通道 NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x0F; //抢占优先级 NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x0F; //子优先级 NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; HAL_NVIC_Init(&NVIC_InitStruct); ``` 需注意优先级设置范围(STM32F103有16级优先级)[^1]。 #### 三、中断服务函数实现 ```c void EXTI9_5_IRQHandler(void) { //检测具体中断线 if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_5) != RESET) { //处理EXTI5中断 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5); } if(__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_6) != RESET) { //处理EXTI6中断 HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_6); } //其他线路同理... } ``` **必须清除中断标志位**,否则会重复进入中断[^2]。 #### 四、回调函数处理 通过HAL库的弱函数重写: ```c void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { switch(GPIO_Pin) { case GPIO_PIN_5: //EXTI5具体逻辑 break; case GPIO_PIN_6: //EXTI6具体逻辑 break; //其他引脚处理... } } ``` #### 五、参考手册关键内容 1. **中断向量表** 在STM32F103参考手册表55中,EXTI9_5对应中断号23(IRQn=23)。 2. **中断触发方式** 支持三种模式:上升沿、下降沿、双边沿触发,通过EXTI_RTSR和EXTI_FTSR寄存器配置。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值