当前位置: 首页 > article >正文

STM32 EXTI中断配置

本次基于STM32F407做一个按键中断效果

EXTI简介:

        EXTI(Extern Interrupt)外部中断

        EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序

支持的触发方式:

上升沿(低电平变为高电平触发中断)/下降沿(高电平变为低电平触发中断)/双边沿(上升沿与下降沿都可以触发中断)/软件触发(程序里执行一段代码就可以触发中断)

支持的GPIO口:

所有GPIO口,但相同的Pin不能同时触发中断(例如PA0与PB0不能同时用)

通道数:

16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒

触发响应方式:

中断响应/事件响应

EXTI框图:

EXTI函数配置:

使用EXTI外部中断,需要在配置里勾选EXTI与SYSCFG

选完之后这里会出现两个文件库

双击打开exti.c,找到How to use this driver这行注释,这里是教我们如何配置EXTI,我们跟着这个说明书做就行。

首先是配置GPIO_Init,我们这次要进行按键中断,所以就是配置按键引脚的GPIO初始化。直接将按键初始化KEY_Init粘贴过来就行。

使用SYSCFG_EXTILineConfig()这个函数将GPIO引脚与中断线连接。

对函数跳转过去,可以看到函数参数该怎么写,第一个参数选择的是,GPIO口那一族的引脚(A B C D)第二个参数选择的是那一根中断线(0~11)。

每个引脚对应一根中断线。

对EXTI进行配置,使用EXTI_Init函数。

这里是用结构体变量来进行初始化配置,操作步骤和GPIO初始化类似

将结构体参数用.引出来

对着后面的参数F12跳转过去,后面注释是具体的等于值。

第一个参数,是要配置的中断线,这里选择的2、3、4、5中断线。

同理完成其他参数选择

接着是NVIC的配置。跟EXTI配置操作同理。需要注意的是通道需要一个一个配置。

开启SYSCFG使能时钟。

最后在主函数里面进行NVIC分组。

中断函数:

这里还是对应四个按键,写四个中断函数。我们设置了几个标志位,用来代表按键按下所需要执行的功能。这些标志位需要在头文件里用extern声明一下,这要所有文件就都可用这个标志位了。

这里要注意的是,这个函数不是自己起的,是需要到startup_stm32f40_41xxx.s找中断函数名

//设置标志位
 uint8_t key1_flag = 0;
 uint8_t key2_flag = 0;
 uint8_t key3_flag = 0;
 uint8_t key4_flag = 0;


//中断函数
//按键按下一次就产生一次中断
//中断函数名---------需要在startup_stm32f40_41xxx.s找中断函数名
void EXTI2_IRQHandler(void)
{
	
	//检查中断状态 如果中断 被触发
	if(EXTI_GetITStatus(EXTI_Line2) == SET)
		
	//把中断关闭
	EXTI_ClearITPendingBit(EXTI_Line2);
	
	//按下按键想做的事 可以写在这里面
	key1_flag = 1;
	
	
	
}


void EXTI3_IRQHandler(void)
{
	//检查中断状态,如果中断 被触发
  if(EXTI_GetITStatus( EXTI_Line3) == SET)
		
//把中断关闭
	EXTI_ClearITPendingBit( EXTI_Line3);
	
	
//按下按键想做的是 就可以写在这里面
	key2_flag = 1;
	
}



void EXTI4_IRQHandler(void)
{
	//检查中断状态,如果中断 被触发
  if(EXTI_GetITStatus( EXTI_Line4) == SET)
		
//把中断关闭
	EXTI_ClearITPendingBit( EXTI_Line4);
	
	
//按下按键想做的是 就可以写在这里面
	key3_flag = 1;
	
}



void EXTI9_5_IRQHandler(void)
{
	//检查中断状态,如果中断 被触发
  if(EXTI_GetITStatus( EXTI_Line5) == SET)
		
//把中断关闭
	EXTI_ClearITPendingBit( EXTI_Line5);
	
	
//按下按键想做的是 就可以写在这里面
	key4_flag = 1;
	
}

模式切换函数:

首先我们在LED.c文件里写一个模式切换的函数,我们将函数里面传参,当m = 1的时候进行流水灯,否则为跑马灯。

//模式切换  m = 1为流水灯  否则为跑马灯
void LED_Mode(uint16_t m,uint32_t i)
{
	
	if(m == 1)
	{
		LED_Waters(i);
	}
	
	else
	{
		LED_PM(i);
	}
	
}

主函数:

在主函数里来写实现的功能,我们想实现通过按键一来切换流水灯与跑马灯,不用中断的话,这里流水灯与跑马灯用的是死循环,跳不出去,只能用中断解决。

#include "EXTI.h"

int main(void){

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);   //设置NVIC分组,因为以后有很多地方都要用到NVIC所以在这里分组
	LED_Init();
	KEY_Init();
	EXTI_Config();
	uint8_t m = 1;
while(1)
{
	if(key1_flag == 1)
	{
		if(m == 1)
		{
			m = 2;
		}
		else
		{
			m = 1;
		}
		key1_flag = 0;
		delay_ms(100);
	}
	LED_Mode(m, 100);
}



}


http://www.kler.cn/a/522531.html

相关文章:

  • 基于ollama,langchain,springboot从零搭建知识库三【解析文档并存储到向量数据库】
  • TypeScript 学习 -类型 - 7
  • 移动光猫怎么自己改桥接模式?
  • 对游戏宣发的粗浅思考
  • Java进阶(二):Java设计模式
  • 群晖docker获取私有化镜像http: server gave HTTP response to HTTPS client].
  • Lite.Ai.ToolKit - 一个轻量级的 C++ 工具包
  • labelimg闪退的解决办法
  • leetcode 2105. 给植物浇水 II
  • 【QT】- QUdpSocket
  • 2018年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题-解析版
  • 二十三种设计模式-桥接模式
  • 国内flutter环境部署(记录篇)
  • 【数据结构】_以SLTPushBack(尾插)为例理解单链表的二级指针传参
  • 每日一道算法题
  • 第05章 06 VTK标量算法中的Contouring算法
  • 【Linux网络编程】数据链路层
  • 计算机组成原理(2)王道学习笔记
  • 基于Flask的全国奶茶饮品加盟及门店数据分析系统的设计与实现
  • QT中给界面设置qss样式
  • 浅谈Linux 权限、压缩、进程与服务
  • 锐捷EWEB /auth 远程命令执行漏洞复现(附脚本)
  • 01.双Android容器解决方案
  • 【135. 分发糖果 困难】
  • 关联传播和 Python 和 Scikit-learn 实现
  • LeetCode热题100(一)—— 1.两数之和