【STM32】按键(外部中断)控制LED亮灭实验——EXTI外部中断控制器、NVIC中断分组

本文详细介绍了STM32外部中断实验,包括EXTI初始化配置、NVIC中断优先级设置以及中断服务函数的编写。实验目的是通过按键控制LED灯的状态,涉及EXTI_Line配置、中断模式选择、触发条件设定以及中断处理流程。实验中,KEY0、KEY1和WK_UP按键分别连接到PC5、PA15和PA0,按键的电平有效性和上下拉电阻配置也进行了说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

外部中断实验

通常来说,外部中断可以理解为是通过一个独立按钮,发送一个中断信号,后发生一系列活动。
外部中断实验就是在独立按键实验的基础上,添加外部中断模块而实现的。
在这里插入图片描述
在这里插入图片描述

EXTI

      EXTI_InitTypeDef    EXTI_InitStructure; 
      EXTI_InitStructure.EXTI_Line=EXTI_Line4; //中断线的标号,取值范围为EXTI_Line0~EXTI_Line15
      EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;  //中断模式,可选值为中断EXTI_Mode_Interrupt和事件 EXTI_Mode_Event
      EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //中断触发方式,下降沿触发 EXTI_Trigger_Falling,上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿)触发EXTI_Trigger_Rising_Falling
      EXTI_InitStructure.EXTI_LineCmd = ENABLE; //使能中断线
      EXTI_Init(&EXTI_InitStructure);       //根据 EXTI_InitStruct 中指定的 
//参数初始化外设 EXTI 寄存器 

从定义可以看出,有 4 个参数需要设置。
第一个参数是中断线的标号,取值范围为EXTI_Line0~EXTI_Line15。也就是说,这个函数配置的是某个中断线上的中断参数。
第二个参数是中断模式,可选值
中断 EXTI_Mode_Interrupt
和事件EXTI_Mode_Event。

第三个参数是触发方式,可以是
下降沿触发 EXTI_Trigger_Falling,
上升沿触发 EXTI_Trigger_Rising,
任意电平(上升沿和下降沿)触发EXTI_Trigger_Rising_Falling。

最后一个参数就是使能中断线了。

NVIC

NVIC_InitTypeDef NVIC_InitStructure; 
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//使能按键外部中断通道线2 
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,   
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子优先级 2 
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //外部中断通道使能
NVIC_Init(&NVIC_InitStructure);//根据上面指定的参数初始化NVIC寄存器 中断优先级分组初始化 

中断优先级设置的步骤:

  1. 系统运行开始的时候设置中断分组。确定组号,也就是确定抢占优先级子优先级分配位数。调用函数为 NVIC_PriorityGroupConfig();
  2. 设置所用到的中断的中断优先级别。对每个中断调用函数为 NVIC_Init();

中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中
断线 10-15 共用中断函数 EXTI15_10_IRQHandler。在编写中断服务函数的时候会经常使用到两
个函数,第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):

一共16条中断线,对应6个中断函数

外部中断的对应关系

GPIOA_0~GPIOG_0————中断线 0对应一个中断函数EXTI0_IRQHandler
GPIOA_1~GPIOG_1————中断线 1对应一个中断函数EXTI1_IRQHandler
GPIOA_2~GPIOG_2————中断线 2对应一个中断函数EXTI2_IRQHandler
GPIOA_3~GPIOG_3————中断线 3对应一个中断函数EXTI3_IRQHandler
GPIOA_4~GPIOG_4————中断线 4对应一个中断函数EXTI4_IRQHandler

GPIOA_5~GPIOG_5————中断线5
GPIOA_6~GPIOG_6————中断线6
GPIOA_7~GPIOG_7————中断线7————中断线5-9 共用中断函数 EXTI9_5_IRQHandler
GPIOA_8~GPIOG_8————中断线8
GPIOA_9~GPIOG_9————中断线9

GPIOA_10~GPIOG_10————中断线10
GPIOA_11~GPIOG_11————中断线11
GPIOA_12~GPIOG_12————中断线12
GPIOA_13~GPIOG_13————中断线13————中断线10-15 共用中断函数 EXTI15_10_IRQHandler
GPIOA_14~GPIOG_14————中断线14
GPIOA_15~GPIOG_15————中断线15

常用的中断服务函数格式为:

void EXTI2_IRQHandler(void) 
{ 
if(EXTI_GetITStatus(EXTI_Line2)!=RESET)//判断某个线上的中断是否发生       
  { 
    中断逻辑… 
    EXTI_ClearITPendingBit(EXTI_Line2);//清除 LINE 上的中断标志位     
  }       
} 

使用 IO 口外部中断的一般步骤:
1)初始化 IO 口为输入。
2)开启 IO 口复用时钟,设置 IO 口与中断线的映射关系。
3)初始化线上中断,设置触发条件等。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。

实验目的

PC5按键KEY0 控制 DS0,按一次亮,再按一次,就灭。
PA15按键KEY1 控制 DS1,按一次亮,再按一次,就灭。。
PA0按键WK_UP 按键则同时控制 DS0 和 DS1,按一次,他们的状态就翻转一次。

实验过程

硬件部分

本实验用到的硬件资源有:
1) 指示灯 DS0、DS1
2) 3 个按键:KEY0、KEY1 和 KEY_UP。
DS0、DS1 和 STM32 的连接在上一章已经介绍了,在 MiniSTM32 开发板上的按键 KEY0连接在 PC5 上、KEY1 连接在 PA15 上、WK_UP 连接在 PA0 上。
在这里插入图片描述
这里需要注意的是:KEY0 和 KEY1 是低电平有效的,而 WK_UP 是高电平有效的,除了
KEY1 有上拉电阻(与 JTDI 共用),其他两个都没有上下拉电阻,所以,需要在 STM32 内部设
置上下拉。

软件部分

### STM32F4外部中断实验 LED闪烁 示例代码 对于STM32F4系列微控制器,在利用外部中断来实现LED闪烁的过程中,需要理解几个关键部分:硬件连接、软件配置以及编程逻辑。 #### 硬件准备 确保电路板上的按钮与指定的GPIO引脚相连,并且该引脚已设置为触发外部中断。同样地,确认用于指示灯状态变化的LED也正确接到了另一个GPIO端口上[^1]。 #### 软件环境搭建 通过STM32CubeMX工具完成基本项目创建之后,需特别注意对外部中断功能的支持进行适当配置: - **基础配置**:选择合适的时钟源和其他必要的外围设备初始化参数。 - **本章配置**:激活所需的EXTI线路及其关联的GPIO通道;设定触发条件(上升沿/下降沿或者双边沿)。这些操作可以在STM32CubeMX图形界面中直观地完成[^2]。 #### 编写程序代码 以下是具体的C语言代码片段,展示了如何定义一个弱类型的回调函数`HAL_GPIO_EXTI_Callback()`,当检测到按键动作时会调用此方法并执行相应的处理——即切换LED的状态: ```c /* USER CODE BEGIN 4 */ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { HAL_GPIO_TogglePin(led_GPIO_Port, led_Pin); // 按键被按下,切换LED状态 } /* USER CODE END 4 */ ``` 这段代码应当放置于由STM32CubeMX生成的应用框架中的合适位置处,通常是在`main.c`文件内的特定区域标记之间[^4]。 #### 完整流程说明 为了使上述方案生效,还需要经历编译链接阶段以构建最终可执行映像文件,并将其下载至目标开发板运行测试效果。在整个过程中保持耐心非常重要,因为可能会遇到各种各样的挑战,比如硬件连线错误或是软件层面的小问题。面对困难时查阅官方手册和技术论坛往往能提供有效的帮助。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值