STM32 GPIO 中断实现教程:步骤详解及代码示例
在 STM32 中实现 GPIO 中断的步骤如下:
- 配置 GPIO 的输入模式和中断触发方式。
首先需要选择 GPIO 的输入模式,可以选择浮空输入模式 (Floating Input),下拉输入模式 (Pull-down Input) 或者上拉输入模式 (Pull-up Input)。
然后需要选择中断触发方式,可以选择下降沿触发 (Falling Edge Triggered)、上升沿触发 (Rising Edge Triggered) 或者边沿触发 (Edge Triggered)。
例如,如果要使 PA0 引脚上升沿触发中断,可以使用以下代码:
GPIO_InitTypeDef GPIO_InitStruct;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
// 使能 GPIOA 时钟
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
// 配置 GPIO 为输入模式
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStruct);
// 配置 EXTI 中断线
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
// 使能中断
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
- 使能 GPIO 对应的中断线。
通过配置 EXTI_InitTypeDef 结构体中的 EXTI_Line 参数和 EXTI_LineCmd 参数来使能 GPIO 对应的中断线。
例如,如果要使 PA0 引脚上升沿触发中断,可以使用以下代码:
EXTI_InitStruct.EXTI_Line = EXTI_Line0;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
- 编写中断服务函数,以处理中断事件。
当 GPIO 触发中断时,会跳转到对应的中断服务函数中执行。
例如,如果要实现 PA0 引脚上升沿触发的中断服务函数,可以使用以下代码:
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0) != RESET) {
// 处理中断事件
// ...
// 清除中断标志位
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
在中断服务函数中,首先需要判断中断标志位是否被触发,如果是,则需要处理相应的中断事件。在处理完中断事件后,需要清除中断标志位,否则中断服务函数会一直被调用。
原文地址: https://www.cveoy.top/t/topic/npNl 著作权归作者所有。请勿转载和采集!