IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32-EXIT-外部中断配置说明 -> 正文阅读

[嵌入式]STM32-EXIT-外部中断配置说明

前言

本文教大家使用外部中断,通过连接按键到IO口,利用中断控制单片机内部程序。
使用器材:STM32F407

一、STM32F4 外部中断简介

STM32F4 的每个 IO 都可以作为外部中断的中断输入口,STM32设计GPIO 的管脚GPIOx.0~GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这样每个中断线对应了最多 9 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0,GPIOH.0,GPIOI.0。而中断线每次只能连接到 1 个 IO口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。
GPIO跟中断线的映射关系图:
在这里插入图片描述

二、编程要点

  1. 使能 IO 口时钟,初始化 IO 口为输入;
  2. 配置 NVIC;
  3. 配置按键 GPIO 为输入模式;
  4. 将按键 GPIO 连接到 EXTI 源输入;
  5. 配置按键 EXTI 中断/事件线;
  6. 编写 EXTI 中断服务函数。

相关宏定义如下

#define KEY1_INT_GPIO_PORT 				GPIOC
#define KEY1_INT_GPIO_CLK 				RCC_AHB1Periph_GPIOC
#define KEY1_INT_GPIO_PIN 				GPIO_Pin_9
#define KEY1_INT_EXTI_PORTSOURCE 		EXTI_PortSourceGPIOC
#define KEY1_INT_EXTI_PINSOURCE 		EXTI_PinSource9
#define KEY1_INT_EXTI_LINE 				EXTI_Line9

#define KEY_INT_EXTI_IRQ 				EXTI9_5_IRQn		//5~9的IO口共用
#define KEY_IRQHandler 					EXTI9_5_IRQHandler

1、使能 IO 口时钟,初始化 IO 口为输入

首先,我们要使用 IO 口作为中断输入,所以我们要使能相应的 IO 口时钟,以及初始化相
应的 IO 口为输入模式

	GPIO_InitTypeDef GPIO_InitStructure;

	RCC_AHB1PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);	//开启对应GPIO时钟
	GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;	//选择管脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;		//配置为输入模式
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;		//配置为上拉模式
	GPIO_Init(KEY1_INT_GPIO_PORT,&GPIO_InitStructure);	//初始化结构体

2.开启 SYSCFG 时钟,设置 IO 口与中断线的映射关系。

1、我们要配置 GPIO 与中断线的映射关系,那么我们首先需要打开 SYSCFG 时钟。这里大家一定要注意,只要我们使用到外部中断,就必须打开 SYSCFG 时钟。
2、我们配置 GPIO 与中断线的映射关系。在库函数中,配置 GPIO 与中断线的映射关系的函数 SYSCFG_EXTILineConfig ()来实现的:

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
	SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);

3、 初始化线上中断,设置触发条件等。

	/* 连接 EXTI 中断源 到key1引脚 */
  SYSCFG_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE,KEY1_INT_EXTI_PINSOURCE);

  /* 选择 EXTI 中断源 */
  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
  /* 中断模式 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  /* 下降沿触发 */
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  /* 使能中断/事件线 */
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

4、配置中断分组(NVIC),并使能中断。

static void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* 配置NVIC为优先级组1 */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* 配置中断源:按键1 */
  NVIC_InitStructure.NVIC_IRQChannel = KEY_INT_EXTI_IRQ;
  /* 配置抢占优先级:1 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 配置子优先级:1 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

5、编写中断服务函数。

我们配置完中断优先级之后,接着要做的就是编写中断服务函数。中断服务函数的名字是
在 MDK 中事先有定义的。这里需要说明一下,STM32F4 的 IO 口外部中断函数只有 7 个,分
别为:

EXPORT EXTI0_IRQHandler 
EXPORT EXTI1_IRQHandler 
EXPORT EXTI2_IRQHandler 
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler 
EXPORT EXTI9_5_IRQHandler 
EXPORT EXTI15_10_IRQHandler

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

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)

这个函数一般使用在中断服务函数的开头判断中断是否发生。另一个函数是清除某个中断线上
的中断标志位:

void EXTI_ClearITPendingBit(uint32_t EXTI_Line)

这个函数一般应用在中断服务函数结束之前,清除中断标志位。
常用的中断服务函数格式为

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

在这里需要说明一下,固件库还提供了两个函数用来判断外部中断状态以及清除外部状态:
标志位的函数 EXTI_GetFlagStatus 和 EXTI_ClearFlag,他们的作用和前面两个函数的作用类似。
只是在 EXTI_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而
EXTI_GetFlagStatus 直接用来判断状态标志位。

6、在main函数中初始化按键的配置

一定要记得在main函数中调用这些初始化函数,很多新手小白就是一老忘记这件事(我),烧录程序之后按键没反应,对着代码看了半天也想不明白哪里配置错了。

总结

1)使能 IO 口时钟,初始化 IO 口为输入。
2)使能 SYSCFG 时钟,设置 IO 口与中断线的映射关系。
3)初始化线上中断,设置触发条件等。
4)配置中断分组(NVIC),并使能中断。
5)编写中断服务函数。
6)在main函数中初始化按键的配置
通过以上几个步骤的设置,我们就可以正常使用外部中断了。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-12-24 18:38:44  更:2021-12-24 18:39:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:51:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码