实验任务3:STM32外部中断实验(Keil软件仿真,无需实物开发板)
一、实验任务
在前面实验基础上,使用STM32标准外设库配合寄存器方式配置GPIO外部中断。模拟按键产生下降沿信号触发外部中断,每次触发中断翻转LED的亮灭状态。本实验全程采用Keil MDK软件仿真,不需要实物开发板。
二、实验目的
- 掌握STM32 GPIO输入输出配置方法,理解AFIO复用功能的作用。
- 理解外部中断EXTI工作原理,掌握寄存器方式配置EXTI下降沿触发。
- 掌握NVIC嵌套向量中断控制器配置,学会编写中断服务函数,清除中断挂起标志位。
- 学会在Keil软件仿真环境中模拟外部信号,验证中断触发效果,脱离硬件完成实验验证。
三、实验环境
- 开发软件:Keil MDK-ARM μVision5
- 芯片型号:STM32F103C8T6
- 程序库:STM32F10x标准外设库
- 仿真方式:Use Simulator纯软件仿真,无需实物开发板
- 引脚分配:
PA0:外部中断输入引脚,模拟按键,下降沿触发中断
PC13:LED输出引脚,中断触发时翻转电平
四、实验原理
STM32的GPIO引脚可以通过AFIO复用功能映射到EXTI外部中断线。本实验将PA0映射到EXTI0中断线,配置为下降沿触发,当PA0电平由高变低时触发中断。
在中断服务函数内部,翻转PC13引脚电平,实现LED亮灭切换。中断触发后必须向EXTI挂起寄存器PR对应位写1,清除中断标志,否则会重复触发中断。
本实验使用Keil内置软件仿真,在电脑中模拟STM32芯片运行,不需要开发板、按键、LED硬件。
五、核心代码
#include"stm32f10x.h"voidDelay_ms(uint32_tms){uint32_ti,j;for(i=0;i<ms;i++)for(j=0;j<7200;j++);}voidLED_Init(void){GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOC,&GPIO_InitStruct);GPIO_ResetBits(GPIOC,GPIO_Pin_13);}voidEXTI0_Init(void){GPIO_InitTypeDef GPIO_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);AFIO->EXTICR[0]&=~(0x000F);EXTI->FTSR|=(1U<<0);EXTI->IMR|=(1U<<0);NVIC->ISER[0]|=(1U<<6);NVIC->IP[6]=(1U<<4);}voidEXTI0_IRQHandler(void){if((EXTI->PR&(1U<<0))!=0){GPIO_WriteBit(GPIOC,GPIO_Pin_13,!GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_13));EXTI->PR|=(1U<<0);}}intmain(void){LED_Init();EXTI0_Init();while(1){}}六、实验步骤
在任务2的Keil工程基础上,替换led_main.c为本次外部中断代码。
Rebuild重新编译工程,查看Build Output窗口,确认0 Errors。
打开魔术棒Options for Target,切换Debug选项卡,选择Use Simulator,勾选Run to main(),保存配置。
点击Debug按钮进入软件仿真模式,程序停在main函数入口。>
点击Run全速运行程序。在仿真界面手动修改PA0引脚电平,制造下降沿,触发EXTI0中断,观察PC13电平翻转。>
说明:新版Keil MDK逻辑分析仪存在bug,无法抓取GPIO波形,采用信号逻辑示意图描述中断触发过程。
七、实验结果
- 代码编译成功,无错误。
- Keil软件仿真正常运行,主循环循环等待中断事件。
- 当PA0引脚产生下降沿时,触发EXTI0外部中断,进入中断服务函数,PC13引脚电平翻转,LED亮灭切换。
- 本实验全程使用纯软件仿真,无需实物开发板,成功验证外部中断功能。
八、实验总结
本次实验使用标准库配置GPIO,配合寄存器方式完成EXTI外部中断配置。AFIO负责把GPIO引脚映射到中断线,EXTI寄存器配置中断触发方式,NVIC负责中断使能与优先级。中断服务函数中必须对PR寄存器写1清除中断挂起标志,否则会持续触发中断。软件仿真可以在没有硬件的条件下验证代码逻辑,但是仿真环境和真实硬件存在一定差异。