尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

EXTI 外部中断控制流水灯启停实验

发布时间:2026/9/28 20:24:58

资讯中心
01
ARTICLE

EXTI 外部中断控制流水灯启停实验

EXTI 外部中断控制流水灯启停实验
一、实验名称EXTI 外部中断控制流水灯启停实验标准外设库按键中断控制 PA0/PA1/PA2、PC13 流水灯暂停 / 继续二、实验目的掌握 STM32 外部中断 EXTI 的配置原理理解 AFIO、EXTI、NVIC 中断控制器的工作流程。掌握 GPIO 输入模式配置理解 GPIO 输入相关底层寄存器。学会使用外部中断触发标志位控制主循环流水灯的暂停与继续。理解中断优先级、中断服务函数、中断标志位清除操作。对照底层寄存器看懂标准外设库 EXTI、GPIO、NVIC 库函数对应的硬件寄存器操作。三、实验硬件STM32F103C8T6 最小系统板LEDPA0、PA1、PA2 外接 LEDPC13 板载 LED低电平点亮按键PA0 引脚作为外部中断输入按键下降沿触发按键按下产生下降沿触发外部中断四、实验原理与程序设计思路整体设计思路LED 部分复用实验 2 的 GPIO 推挽输出配置PA0、PA1、PA2、PC13 配置为推挽输出默认全部熄灭主循环轮流点亮实现流水灯。按键外部中断部分开启 GPIOA、AFIO 复用功能时钟将 PA0 配置为上拉输入模式作为按键输入引脚AFIO 配置将 PA0 映射到 EXTI 外部中断线 0EXTI 配置EXTI 线 0下降沿触发开启中断NVIC 配置配置 EXTI0 中断通道设置抢占优先级与子优先级使能中断中断服务函数当按键按下触发 EXTI0 中断翻转全局标志变量run_flagrun_flag1流水灯正常运行run_flag0流水灯暂停主循环逻辑while (1) 循环内判断run_flag标志为 1 时执行流水灯点亮 延时标志为 0 时跳过流水灯代码保持灯状态不变实现暂停。底层寄存器说明GPIO、EXTI、AFIO、NVICSTM32F103APB2 总线1. GPIOA 寄存器PA0既可以做 LED 输出本实验 PA0 用作按键输入GPIOA 基地址0x40010800表格寄存器地址偏移物理地址功能与参数说明GPIOA_CRL0x000x40010800端口低配置寄存器控制 PA0~PA7。PA0 为 bit [3:0]上拉输入模式CNF10MODE00GPIOA_IDR0x080x40010808端口输入数据寄存器只读读取引脚当前电平按键输入时读取引脚状态GPIOA_ODR0x0C0x4001080C端口输出寄存器LED 输出时控制高低电平GPIOA_BSRR0x100x40010810置位复位寄存器快速设置输出引脚电平GPIOC 基地址0x40011000PC13 属于引脚 13由GPIOC_CRH(0x40011004)寄存器配置。2. AFIO 复用寄存器外部中断引脚映射AFIO 基地址0x40010000AFIO_EXTICR1偏移 0x08地址0x40010008作用选择 EXTI 线 0 对应的 GPIO 端口写入 0000 代表选择 GPIOA 的 PA0。3. EXTI 外部中断寄存器EXTI 基地址0x40010400表格寄存器偏移地址功能EXTI_IMR0x000x40010400中断屏蔽寄存器bit01开启 EXTI 线 0 中断EXTI_EMR0x040x40010404事件屏蔽寄存器本实验不用EXTI_FTSR0x0C0x4001040C下降沿触发选择寄存器bit01EXTI0 下降沿触发中断EXTI_RTSR0x080x40010408上升沿触发寄存器本实验关闭EXTI_PR0x140x40010414中断挂起寄存器中断触发后置 1必须软件写 1 清零否则重复触发中断4. NVIC 嵌套向量中断控制器内核寄存器Cortex-M3NVIC 用于管理中断优先级、使能中断通道。NVIC_ISER中断使能寄存器使能 EXTI0 中断通道NVIC_IPR中断优先级寄存器设置抢占优先级、子优先级。5. RCC APB2 时钟使能寄存器RCC 基地址0x40021000RCC_APB2ENR偏移 0x18地址0x40021018bit2GPIOA 时钟bit0AFIO 时钟bit4GPIOC 时钟。必须先开启时钟外设才可以工作。五、完整源代码#include stm32f10x.h #include Delay.h uint8_t run_flag 1; void LED_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE); GPIO_InitStruct.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; GPIO_InitStruct.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin GPIO_Pin_13; GPIO_Init(GPIOC, GPIO_InitStruct); GPIO_SetBits(GPIOA, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2); GPIO_SetBits(GPIOC, GPIO_Pin_13); } void KEY_EXTI_Init(void) { GPIO_InitTypeDef GPIO_InitStruct; EXTI_InitTypeDef EXTI_InitStruct; NVIC_InitTypeDef NVIC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); GPIO_InitStruct.GPIO_Pin GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode GPIO_Mode_IPU; GPIO_Init(GPIOA, GPIO_InitStruct); GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0); EXTI_InitStruct.EXTI_Line EXTI_Line0; EXTI_InitStruct.EXTI_Mode EXTI_Mode_Interrupt; EXTI_InitStruct.EXTI_Trigger EXTI_Trigger_Falling; EXTI_InitStruct.EXTI_LineCmd ENABLE; EXTI_Init(EXTI_InitStruct); NVIC_InitStruct.NVIC_IRQChannel EXTI0_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority 0; NVIC_InitStruct.NVIC_IRQChannelSubPriority 0; NVIC_InitStruct.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStruct); } void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0)!RESET) { run_flag !run_flag; EXTI_ClearITPendingBit(EXTI_Line0); } } int main(void) { LED_Init(); KEY_EXTI_Init(); while(1) { if(run_flag 1) { GPIO_ResetBits(GPIOA,GPIO_Pin_0); GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); GPIO_SetBits(GPIOC,GPIO_Pin_13); Delay_ms(1000); GPIO_SetBits(GPIOA,GPIO_Pin_0); GPIO_ResetBits(GPIOA,GPIO_Pin_1); GPIO_SetBits(GPIOA,GPIO_Pin_2); GPIO_SetBits(GPIOC,GPIO_Pin_13); Delay_ms(1000); GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1); GPIO_ResetBits(GPIOA,GPIO_Pin_2); GPIO_SetBits(GPIOC,GPIO_Pin_13); Delay_ms(1000); GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2); GPIO_ResetBits(GPIOC,GPIO_Pin_13); Delay_ms(1000); } } }六、实验步骤在 Keil MDK 中打开工程添加stm32f10x_gpio.c、stm32f10x_exti.c、stm32f10x_nvic.c、stm32f10x_rcc.c库文件。配置头文件路径宏定义STM32F10X_MD,USE_STDPERIPH_DRIVER。写入 main.c 代码编译工程无报错后进入 Debug 仿真。软件仿真打开逻辑分析仪添加PORTA.0、PORTA.1、PORTA.2、PORTC.13观察流水波形。仿真触发 PA0 按键下降沿触发 EXTI0 中断观察run_flag翻转流水灯暂停 / 继续。硬件下载将程序下载至 STM32 开发板按下 PA0 按键切换流水灯启停状态。七、实验现象与结果分析实验现象上电后流水灯默认开启PA0→PA1→PA2→PC13 依次点亮每个灯保持 1s循环往复。按下 PA0 按键触发外部中断run_flag翻转流水灯立刻暂停LED 保持当前状态。再次按下按键run_flag再次翻转流水灯恢复继续流动。9月22日时序与中断分析中断触发按键按下PA0 电平由高变低产生下降沿EXTI0 检测到下降沿置起中断挂起标志进入中断服务函数。中断服务函数只翻转全局标志run_flag必须清除 EXTI 中断挂起位否则会持续反复进入中断。主循环特点中断不会打断延时函数需要等待当前Delay_ms(1000)执行完毕才会判断 run_flag。八、实验总结外部中断配置流程开启时钟 (GPIOAFIO) → GPIO 输入配置 → AFIO 中断线映射 → EXTI 触发方式配置 → NVIC 中断优先级配置顺序不能颠倒。中断服务函数中必须手动清除 EXTI 的中断挂起标志位否则会重复触发中断程序异常。中断只做标志位翻转业务逻辑放在主循环是嵌入式标准开发规范。GPIO 输入模式使用 CRL 寄存器配置IDR 寄存器读取引脚电平EXTI、AFIO 配合实现引脚外部中断功能NVIC 负责内核中断管理。本实验使用全局变量run_flag实现中断与主循环之间的信息交互实现按键控制流水灯暂停、继续。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。