STM8外部引脚中断EXTI配置后,系统不断进入中断的问题

本文介绍了一种STM8单片机在使用外部引脚中断时遇到的问题及解决方案。原先的代码会导致系统频繁进入中断服务函数,即使已清除中断标志。通过在配置引脚中断前关闭总中断,解决了此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一项目中使用STM8单片机,需要使用到外部的引脚中断功能,并且是上升沿触发,之前的代码是:

  GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_In_FL_IT);
  EXTI_SetPinSensitivity(EXTI_Pin_0, EXTI_Trigger_Rising);

但程序运行过程中经常出问题,即在配置后,系统立刻开始不断地进入中断服务函数(注:中断函数中有清除中断标志的代码,但系统仍然不断地进入中断服务函数),经查看,在以上代码运行前,系统的总中断通过enableInterrupts()已经打开。在未找到明确原因的情况下,修改了代码,在初始化引脚中断前先关掉总的中断开关(即调用:disableInterrupts()),修改后的代码如下:

  disableInterrupts();
  GPIO_Init(GPIOB, GPIO_Pin_0, GPIO_Mode_In_FL_IT);
  EXTI_SetPinSensitivity(EXTI_Pin_0, EXTI_Trigger_Rising);
  enableInterrupt();

经过测试,不再出现本文之前提到的情况了。



### STM32 EXTI外部中断配置教程 在STM32微控制器中,外部中断EXTI(External Interrupt/Event controller)是一个重要的功能模块,用于响应来自GPIO引脚或其他外设的事件或中断信号。以下是关于如何在STM32F103系列微控制器上配置并使用外部中断的具体方法。 #### 配置流程说明 为了实现外部中断功能,需要完成以下几个方面的设置: 1. **使能时钟** 在初始化阶段,需确保相关外设的时钟已被启用。这通常涉及RCC(Reset and Clock Control)寄存器的操作[^1]。 2. **配置GPIO引脚模式** 将目标GPIO引脚配置为输入模式(可以是浮空输入、下拉输入或上拉输入)。这是为了让该引脚能够检测到外部信号的变化。 3. **映射GPIO至EXTI线** 每个GPIO端口都有对应的EXTI线路编号(例如PA0对应EXTI Line 0, PB1对应EXTI Line 1等)。因此,在软件层面要指定哪个GPIO被连接到了哪条EXTI线上。 4. **初始化EXTI参数** 设置触发条件(上升沿、下降沿或者双边沿)、优先级以及回调函数地址等内容。这些可以通过HAL库中的API轻松完成[^2]。 5. **编写中断处理程序** 定义好ISR (Interrupt Service Routine),即当中断发生时执行的一段特定逻辑代码。 下面给出一段基于STM32CubeMX工具生成项目框架下的C语言示例代码片段展示上述过程: ```c // 初始化 GPIO 和 EXTI 中断 void MX_GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用 PA 端口时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* 配置 PA0 为输入 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 上升沿触发 GPIO_InitStruct.Pull = GPIO_NOPULL; // 浮空输入 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); /* 配置 NVIC 对应的中断通道 */ HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); // 设置抢占优先级和子优先级均为最低 HAL_NVIC_EnableIRQ(EXTI0_IRQn); // 开启中断向量表项 } /* 用户定义的中断服务例程 */ void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } /* 响应在 HAL 层面调用的实际 ISR 函数 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == GPIO_PIN_0){ // 当 PA0 发生中断时执行的动作 printf("PA0 External Interrupt Detected!\n"); } } ``` 以上代码展示了如何利用标准外设驱动库来激活一个简单的按键开关产生的外部硬件中断机制,并打印消息通知用户已捕捉到相应事件。 #### 注意事项 - 如果采用的是HAL库,则大部分复杂操作已经被封装好了,只需按照官方文档指引填写必要参数即可快速搭建原型系统。 - 实际应用过程中还需考虑去抖动电路设计等问题以免误触引发不必要的动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Veiko

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值