stm32F407学习DAY.22 外部中断EXIT

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

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

一、外部中断概述

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打印一次
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值