stm32 gpio中断
时间: 2025-01-05 22:32:43 浏览: 10
### STM32 GPIO 中断使用教程
#### 配置GPIO中断的基础设置
为了使STM32能够响应来自特定GPIO引脚的事件触发,需先完成基本配置。这涉及到启用相应的外设时钟、初始化结构体并设定目标引脚的工作模式为输入状态,同时指定其内部上下拉电阻的状态。对于希望用于检测电平变化从而产生中断信号的引脚来说,在此阶段还需额外定义该引脚所关联的中断线及其优先级等级。
```c
#include "stm32f1xx_hal.h"
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟
GPIO_InitTypeDef GPIO_InitStruct = {0};
/*Configure GPIO pin : PA0 */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; // 设定PA0为上升沿触发中断
GPIO_InitStruct.Pull = GPIO_NOPULL; // 不使用内置上下拉电阻
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
```
上述代码展示了如何将`PA0`配置成一个不带内部上下拉功能且仅当检测到电压由低变高(即发生一次正跳变)时才会激活相应IRQ通道的端口[^1]。
#### 注册回调函数处理程序
一旦完成了硬件层面的准备工作之后,则需要告知系统每当有符合条件的变化发生在选定IO线上时应该执行哪些操作。这部分工作通常借助于注册一个专门用来应对这种情形下的ISR(Interrupt Service Routine),也就是常说的服务例程来进行实现:
```c
// 定义全局变量或静态局部变量保存当前按键状态或其他逻辑所需的数据...
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == GPIO_PIN_0){
// 当PA0引发电平时调用这段代码...
// 插入具体业务逻辑,比如计数器加一、切换LED灯亮灭等
// 可能还需要在此处加入去抖动措施以提高稳定性
}
}
```
这里展示了一个简单的回调机制例子,其中心思想是在每次接收到与预设条件相匹配的边沿转换通知后自动转向至预先编写好的一段子程序内继续运行下去。
#### 开启NVIC中的对应中断源
最后一步是要确保MCU本身允许接收此类类型的异常请求,并给予适当的关注度——这意味着要调整向量表里有关这一项条目的属性值使之处于开启状态;与此同时还可以根据实际情况灵活调配不同种类之间相互之间的相对重要性和紧迫程度关系:
```c
/* Enable and set EXTI Line0 Interrupt to the lowest priority */
HAL_NVIC_SetPriority(EXTI0_IRQn, 15, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
```
通过上面这几行语句就可以让处理器正式开始监听来自于外部世界的消息了,只要满足之前提到过的那些限定条款就会立即打断正常流程转而进入紧急事务处置环节当中去。
阅读全文