STM32 GPIO外部中断总结

### STM32 GPIO 外部中断使用教程 #### 配置外部中断的基础设置 为了使STM32能够响应来自特定GPIO引脚的外部事件,需先初始化相应的外设并配置该引脚作为输入模式。这通常涉及到修改寄存器来设定引脚的工作方式以及连接到EXTI线。 对于具体的实现,在硬件方面,将开关的一端接地而另一端接到指定的GPIO引脚上(例如PA0),以便当按下按钮时产生低电平触发中断请求[^2]。 #### 初始化函数编写 下面是一个简单的C语言程序片段用于展示如何初始化GPIO和EXTI: ```c #include "stm32f1xx_hal.h" void MX_GPIO_Init(void){ __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; /* PA0 设置为下拉输入 */ GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; // 下降沿触发中断 GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); } ``` 这段代码展示了如何启用GPIOA上的时钟,并针对PA0进行了配置使其成为下降沿触发类型的外部中断源。 #### 中断服务例程定义 接下来要做的就是创建一个处理这些中断的服务例行程序ISR (Interrupt Service Routine),它会在每次检测到有效的边沿变化时被执行: ```c extern void EXTI0_IRQHandler(void){ HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_0){ // 当PA0发生中断时执行的操作 // 可在此处加入控制LED或其他逻辑操作 } } ``` 这里`EXTI0_IRQHandler()`是预留给PA0对应的外部中断向量表位置的标准命名空间;而在`HAL_GPIO_EXTI_Callback()`中则实现了实际想要完成的任务——即每当PA0被激活时所采取的动作。 #### LED 控制实例 假设已经按照上述说明完成了基本的按键与LED连线,则可以在回调函数内部添加如下所示的语句以达到点亮或熄灭LED的效果: ```c static uint8_t led_state = 0; void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){ if(GPIO_Pin == GPIO_PIN_0){ led_state ^= 1; // 切换状态 static const uint16_t leds[] = { GPIO_PIN_0, GPIO_PIN_1, GPIO_PIN_2, GPIO_PIN_3, GPIO_PIN_4, GPIO_PIN_5, GPIO_PIN_6, GPIO_PIN_7 }; for(int i=0;i<8;i++){ HAL_GPIO_WritePin(GPIOB, leds[i], ((led_state << i)&(1<<i))?GPIO_PIN_SET:GPIO_PIN_RESET); } } } ``` 此部分代码利用了一个静态变量`led_state`保存当前的状态位图,并通过异或运算改变其值从而交替开启关闭各个LED灯泡形成流水效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值