stm32F407外部中断例程
时间: 2024-12-26 21:22:36 浏览: 6
### STM32F407 外部中断示例代码
对于STM32F407微控制器而言,外部中断可以通过配置特定的引脚作为输入并连接到外部中断线路上来实现。当检测到指定类型的信号变化(上升沿、下降沿或双边沿),会触发相应的中断请求IRQ[^2]。
下面是一个简单的例子,该实例展示了如何利用按键触发外部中断从而控制LED灯的状态切换:
#### 初始化设置
首先,在初始化阶段要完成如下操作:
- 配置用于指示状态改变的LED所连结的GPIO端口;
- 设置按键所在的GPIO引脚为下拉输入模式;
- 启用EXTI线路对应于按键所在位置,并设定触发条件;
```c
#include "stm32f4xx_hal.h"
// 定义使用的硬件资源
#define LED_PIN GPIO_PIN_13
#define BUTTON_PIN GPIO_PIN_0
#define BUTTON_PORT GPIOA
#define LED_PORT GPIOD
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void){
HAL_Init();
SystemClock_Config(); // 系统时钟配置
/* 初始化所有外设 */
MX_GPIO_Init();
while (1){
__HAL_RCC_PWR_CLK_ENABLE();
HAL_Delay(10); // 主循环中加入延时减少功耗
}
}
/* EXTI line detection callbacks */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == BUTTON_PIN){
static uint8_t state = 0;
// 切换LED状态
if(state++ & 1U){
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_SET);
}else{
HAL_GPIO_WritePin(LED_PORT, LED_PIN, GPIO_PIN_RESET);
}
// 延迟去抖动
HAL_Delay(50);
}
}
```
#### GPIO与EXTI初始化函数
此部分负责具体地配置GPIO以及关联的EXTI线路参数:
```c
static void MX_GPIO_Init(void){
GPIO_InitTypeDef GPIO_InitStruct;
// 开启相应模块的时钟
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
// 按键配置成输入模式
GPIO_InitStruct.Pin = BUTTON_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(BUTTON_PORT,&GPIO_InitStruct);
// LED配置成推挽输出模式
GPIO_InitStruct.Pin = LED_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
// 清除可能存在的挂起位
__HAL_GPIO_EXTI_CLEAR_FLAG(BUTTON_PIN);
// 注册回调函数给全局指针变量
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
```
上述代码实现了基本的功能需求——每当按下按钮时就会引起一次外部中断,进而调用`HAL_GPIO_EXTI_Callback()`函数内部逻辑处理流程,最终达到点亮/熄灭LED的效果。
阅读全文