使用外部中断(External Interrupt, EXTI)的基本步骤如下:
初始化IO口为输入
将需要用作外部中断的GPIO口配置为输入模式,并设置合适的上下拉电阻(如果需要)。
开启AFIO时钟
使能GPIO和外部中断控制器的时钟。STM32的外部中断控制器的时钟通常挂载在APB2时钟组下。
设置IO口与中断线的映射关系
通过配置AFIO(模拟功能输入输出)的寄存器,将GPIO口与外部中断线连接起来。STM32的GPIO端口号与外部中断号之间存在对应关系,如所有GPIO组的0管脚对应外部中断0。
配置中断NVIC
配置NVIC(Nested Vectored Interrupt Controller)以使能外部中断,并设置中断优先级。每个中断源都有默认的优先级别,也可以通过对应的寄存器修改优先级。
编写中断服务程序(ISR)
在中断向量表中定义中断服务程序的入口点。在中断服务程序中编写中断被触发后需要执行的操作。
启用外部中断
在setup()函数中使用attachInterrupt()函数对中断引脚进行初始化配置,以开启外部中断功能。
```c
include "stm32f10x.h"
// 定义中断服务函数
void EXTI0_IRQHandler(void) {
// 点亮LED灯
GPIO_SetBits(GPIOD, GPIO_Pin_6);
// 清空中断标志位,防止持续进入中断
EXTI_ClearITPendingBit(EXTI_Line0);
}
int main(void) {
// 初始化系统时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
// 初始化GPIO
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; // PA11
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// 配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_Init(&EXTI_InitStructure);
// 配置NVIC
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
// 启用外部中断
attachInterrupt(EXTI_Line0, EXTI0_IRQHandler, RISING);
// 主循环
while (1) {
// 其他任务
}
}
```
在这个示例中,我们配置了PA11引脚为输入模式,并连接到EXTI0中断线。然后,我们初始化了GPIOA和AFIO时钟,配置了EXTI和NVIC,并定义了EXTI0的中断服务函数。最后,我们在主循环中启用了EXTI0中断。当PA11引脚检测到上升沿时,EXTI0_IRQHandler函数将被调用,点亮LED灯。