stm32F407学习DAY.22 外部中断EXIT

本文详细介绍了STM32F4的外部中断机制,包括EXTI线的配置、IO口映射、中断服务函数、中断向量以及如何通过实例实现按键触发外部中断。
摘要由CSDN通过智能技术生成

一、外部中断概述

1、简介

stm32F4每一个IO口都可以作为外部中断的输入端

stm32F4的中断控制器支持22个外部中断/事件请求

   EXTI线0~15:对应外部IO口的输入中断!!!

每个外部中断线可独立的配置触发方式(上升沿/下降沿/双边沿触发)、触发or屏蔽、状态位

2、外部中断线与IO口的对应方式

stm32F407ZGT6供IO口使用的中断线有16个,但共有112个IO口,对应16*7

可以看出,一个中断线映射了7个IO口,但使用过程中只能同时用一个IO口

3、IO口外部中断的中断服务函数与中断向量

IO口外部中断在中断向量表中分配了7个中断向量,即只能用7个中断服务函数

二、外部中断EXTI库函数

1、设置IO口与中断线的映射关系

void SYSCFG_EXTILineConfig(uint8_t EXTI_PortSourceGPIOx, uint8_t EXTI_PinSourcex);

头文件位于

例如:将PE2映射到中断线2

2、初始化中断线

头文件位于

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

可以看出,此函数唯一一个入口参数是结构体变量名,结构体如下:

3、状态获取判断/清除函数

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);    //判断中断线中断状态

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);    //清除中断线上的中断标志位

4、SYSCFG时钟使能

由于调用了SYSCFG的中断线配置

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG时钟

三、外部中断配置步骤

四、实例 按键触发外部中断

在此处写GPIO_Init()可以直接调用封装好的按键初始化函数KEY_Init()

由于KEY0按下为低电平,日常为高,配置成下降沿有效

1、exit.c

#include "exti.h"
#include "delay.h" 
#include "led.h" 
#include "key.h"
#include "beep.h"

//外部中断0服务程序
void EXTIX_Init()
{
    EXTI_InitTypeDef EXTI_Initstruct;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE);
    
    KEY_Init();
    
    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource4);
//    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource3);
//    SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE,EXTI_PinSource2);
    
    EXTI_Initstruct.EXTI_Line=EXTI_Line4;
    EXTI_Initstruct.EXTI_LineCmd=ENABLE;
    EXTI_Initstruct.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_Initstruct.EXTI_Trigger=EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_Initstruct);    
    
    NVIC_InitStructure.NVIC_IRQChannel=EXTI4_IRQn; //定时器3中断
	  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
	  NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
	  NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
  }

//写中断服务函数
  
void EXTI4_IRQHandler(void)
{
  delay_ms(10);
  if(KEY0==0)
  {
    LED0=!LED0;
    LED1=!LED1;
  }
  
//清除中断线标志位
  EXTI_ClearITPendingBit(EXTI_Line4);
}

2、main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "exti.h" 

int main(void)
{ 
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
	delay_init(168);    //初始化延时函数
	uart_init(115200); 	//串口初始化 
	LED_Init();				  //初始化LED端口  
	BEEP_Init();        //初始化蜂鸣器端口
	EXTIX_Init();       //初始化外部中断输入 
	LED0=0;					    //先点亮红灯
	while(1)
	{
  	printf("OK\r\n");	//打印OK提示程序运行
		delay_ms(1000);	  //每隔1s打印一次
	}

}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要将按键接到STM32F407外部中断输入引脚上。假设按键连接到了GPIOE的第0位引脚。 接下来,需要进行如下配置: 1. 使能GPIOE时钟 ```c RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); ``` 2. 配置GPIOE.0为输入模式 ```c GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOE, &GPIO_InitStructure); ``` 3. 配置外部中断 EXTI0 ```c EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; GPIO_EXTILineConfig(GPIO_PortSourceGPIOE, GPIO_PinSource0); EXTI_InitStructure.EXTI_Line = EXTI_Line0; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` 4. 在EXTI0_IRQHandler中实现按键控制LED亮灭 ```c void EXTI0_IRQHandler(void) { if(EXTI_GetITStatus(EXTI_Line0) != RESET) { // 读取按键状态,如果按键按下,则点亮LED if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_0) == Bit_RESET) { GPIO_SetBits(GPIOA, GPIO_Pin_5); } // 否则熄灭LED else { GPIO_ResetBits(GPIOA, GPIO_Pin_5); } EXTI_ClearITPendingBit(EXTI_Line0); } } ``` 在上述代码中,我们假设将LED连接到了GPIOA的第5位引脚上。在按下按键时,点亮LED;松开按键时,熄灭LED。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值