STM32F10x外部中断/事件控制器(EXTI)应用

news2024/11/18 16:48:38

往期文章:

STM32F1x固件库函数学习笔记(一)

文章目录

  • 一、EXTI简介
  • 二、EXTI初始化结构体详解
  • 三、外部中断(EXTI)编程要点及例程
  • 参考文献

一、EXTI简介

外部中断/事件控制器,简称:EXTI(External interrupt/event controller)。管理了20个中断/事件线,每个中断/事件线都对应有一个边沿检测而器,可实现输入信号的上升沿和下降沿的检测。EXTI可以实现每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

EXTI有20个中断/事件线,每个GPIO都可以被设置为输入线,占用EXTI0至EXTI15.还有另外七根用于特定的外设,如下表所示:
在这里插入图片描述
EXTI0至EXTI15用于GPIO,通过编程可以实现任意一个GPIO作为EXTI的输入源。EXTI0可以通过中断配置寄存器1(AFIO_EXTICR1)的EXTI0[3:0]位选择配置为PA0、PB0、PC0、PE0、PF0、PG0、PH0或者PI0,如下图所示:
在这里插入图片描述

二、EXTI初始化结构体详解

typedef struct
{
  uint8_t NVIC_IRQChannel;                    /*!< Specifies the IRQ channel to be enabled or disabled.
                                                   This parameter can be a value of @ref IRQn_Type 
                                                   (For the complete STM32 Devices IRQ Channels list, please
                                                    refer to stm32f10x.h file) */

  uint8_t NVIC_IRQChannelPreemptionPriority;  /*!< Specifies the pre-emption priority for the IRQ channel
                                                   specified in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref NVIC_Priority_Table */

  uint8_t NVIC_IRQChannelSubPriority;         /*!< Specifies the subpriority level for the IRQ channel specified
                                                   in NVIC_IRQChannel. This parameter can be a value
                                                   between 0 and 15 as described in the table @ref NVIC_Priority_Table */

  FunctionalState NVIC_IRQChannelCmd;         /*!< Specifies whether the IRQ channel defined in NVIC_IRQChannel
                                                   will be enabled or disabled. 
                                                   This parameter can be set either to ENABLE or DISABLE */   
} NVIC_InitTypeDef;

(1) EXTI_Line: EXTI 中断/事件线选择,可选 EXTI0 至 EXTI19,可参考表 EXTI 中断 _ 事件线
选择。
(2) EXTI_Mode: EXTI 模式选择,可选为产生中断 (EXTI_Mode_Interrupt) 或者产生事件(EXTI_Mode_Event)。
(3)EXTI_Trigger: EXTI 边沿触发事件,可选上升沿触发 (EXTI_Trigger_Rising)、下降沿触发 (EXTI_Trigger_Falling) 或者上升沿和下降沿都触发 ( EXTI_Trigger_Rising_Falling)。
(4)EXTI_LineCmd:控制是否使能 EXTI 线,可选使能 EXTI 线 (ENABLE) 或禁用 (DISABLE)。

三、外部中断(EXTI)编程要点及例程

(1)初始化GPIO
(2)初始化EXTI
(3)初始化NVIC
(4)编写中断服务函数

exti.h

#ifndef __EXTI_H
#define	__EXTI_H

#include "stm32f10x.h"

#define KEY1_INT_GPIO_PORT         GPIOA
#define KEY1_INT_GPIO_CLK          (RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO)
#define KEY1_INT_GPIO_PIN          GPIO_Pin_0
#define KEY1_INT_EXTI_PORTSOURCE   GPIO_PortSourceGPIOA
#define KEY1_INT_EXTI_PINSOURCE    GPIO_PinSource0
#define KEY1_INT_EXTI_LINE         EXTI_Line0
#define KEY1_INT_EXTI_IRQ          EXTI0_IRQn

#define KEY1_IRQHandler            EXTI0_IRQHandler

void EXTI_Key_Config(void);

#endif 

exyi.c

/**
  ******************************************************************************
  * @file    gpio.c
  * @author  小途
  * @version V1.0
  * @date    2023-7-14
  * @brief   I/O中断应用
  ******************************************************************************
  * @attention
  *
  *
  ******************************************************************************
  */
	
#include "exti.h"

 /**
  * @brief  配置嵌套向量中断控制器NVIC
  * @param  无
  * @retval 无
  */
static void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/* 配置NVIC为优先级组1 */
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
	/* 配置中断源:按键1 */
	NVIC_InitStructure.NVIC_IRQChannel = KEY1_INT_EXTI_IRQ;
	/* 配置抢占优先级 */
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  /* 配置子优先级 */
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  /* 使能中断通道 */
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

 /**
  * @brief  配置 IO为EXTI中断口,并设置中断优先级
  * @param  无
  * @retval 无
  */
void EXTI_Key_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	EXTI_InitTypeDef EXTI_InitStructure;
	
	/*开启按键GPIO口的时钟*/
	RCC_APB2PeriphClockCmd(KEY1_INT_GPIO_CLK,ENABLE);
	
	/* 配置 NVIC 中断*/
	NVIC_Configuration();
	
/*--------------------------KEY1配置-----------------------------*/
	/* 选择按键用到的GPIO */	
  GPIO_InitStructure.GPIO_Pin = KEY1_INT_GPIO_PIN;
  /* 配置为浮空输入 */	
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(KEY1_INT_GPIO_PORT, &GPIO_InitStructure);
	
		/* 选择EXTI的信号源 */
  GPIO_EXTILineConfig(KEY1_INT_EXTI_PORTSOURCE, KEY1_INT_EXTI_PINSOURCE); 
  EXTI_InitStructure.EXTI_Line = KEY1_INT_EXTI_LINE;
	
	/* EXTI为中断模式 */
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
	/* 下升沿中断 */
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  /* 使能中断 */	
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
}

stm32f10x_it.h

/**
  * @brief  This function handles KEY1 interrupt request.
  * @param  None
  * @retval None
  */
void KEY1_IRQHandler(void)
{
	//确保是否产生了EXTI Line中断
	if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 
	{
		// LED1 取反		
		LED1_TOGGLE;
    //清除中断标志位
		EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     
	}  
}

main.c

void RCC_Configuration(void)
{   
  //Install system time  is 72MHZ
	SystemInit();
}

int main(void)
{
	RCC_Configuration();//系统时钟初始化   				
	Delay_Timer_Init();//延时函数定时器初始化

	gpio_OutputConfig(RCC_APB2Periph_GPIOB, GPIO_Pin_5, GPIOB);
	EXTI_Key_Config();//设置外部中断(PB6,下降沿触发)	
	while(1);
}

参考文献

【1】STM32F10x-参考手册中文版
【2】STM32F101xx和STM32F103xx固件函数库
【3】stm32f103数据手册中文版
【4】Cortex-M3权威指南Cn
【5】零死角玩转STM32—F103指南者
【6】STM32库开发实战指南——基于野火霸道开发板

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/756490.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jenkins打包、发布、部署

目录 前言 一、安装jdk 二、安装maven 三、安装git 四、安装jenkins 五、访问jenkins 六、创建用户 七、配置jenkins 八、执行 总结 前言 服务器&#xff1a;CentOS 7.9 64位 jdk&#xff1a;1.8 maven&#xff1a;3.9.1 git&#xff1a;git version 1.8.3.1 jenkins&a…

计算机中的数制与编码(二进制转换)

一、进制表示 1. 十进制表示 使用&#xff08;0&#xff0c;1&#xff0c;2&#xff0c;…&#xff0c;9&#xff09;十位数字表示&#xff0c;十进制运算时逢十进一。 2. 二进制表示 使用(0&#xff0c;1)两个数字表示&#xff0c;二进制运算时逢二进一。 3. 十六进制表示…

AIGC文生图:stable-diffusion-webui部署及使用

1 stable-diffusion-webui介绍 Stable Diffusion Web UI 是一个基于 Stable Diffusion 的基础应用&#xff0c;利用 gradio 模块搭建出交互程序&#xff0c;可以在低代码 GUI 中立即访问 Stable Diffusion Stable Diffusion 是一个画像生成 AI&#xff0c;能够模拟和重建几乎…

宝塔面板清理

查看磁盘使用情况时发现/dev/sda1满了&#xff0c;重启服务器也不行&#xff0c;瞎折腾了半天&#xff0c;才发现是宝塔的回收站占了较大的磁盘&#xff0c;于是按以下操作清理了下&#xff0c;就可以了 1、清除系统监控记录。打开宝塔面板后台&#xff0c;找到监控&#xff0c…

模拟面试2

1.说一说ArrayList的实现原理&#xff1f; ArrayList底层基于数组实现&#xff0c;内部封装了Object类型的数组&#xff0c;实现了list接口&#xff0c;通过默认构造器创建容器时&#xff0c;该数组被初始化为一个空数组&#xff0c;首次添加数据时再将其初始化为容量为10的数组…

变量生命符thread_local

thread_local是c11为线程安全引进的变量声明符。 thread_local是一个存储器指定符&#xff1a; 所谓存储器指定符&#xff0c;其作用类似命名空间&#xff0c;指定了变量名的存储期以及链接方式。同类型的关键字还有&#xff1a; static&#xff1a;静态或者线程存储期&…

2.我的第一个 JAVA 程序Helloword

对象&#xff1a;对象是类的一个实例&#xff0c;有状态和行为。例如&#xff0c;一条狗是一个对象&#xff0c;它的状态有&#xff1a;颜色、名字、品种&#xff1b;行为有&#xff1a;摇尾巴、叫、吃等。类&#xff1a;类是一个模板&#xff0c;它描述一类对象的行为和状态。…

前端videojs实现m3u8格式的直播

一、安装 npm install --save-dev video.js 二、引入 import videojs from "video.js"; import "video.js/dist/video-js.css"; 三、template 由于此处客户需要全屏至指定框大小&#xff0c;而不是全屏整个屏幕所以没用插件自带的全屏控件 隐藏自带全屏…

Unity 2DJoint 物理关节功能与总结

本文将以动图方式展示每个2D物理关节的效果&#xff0c;并解析部分重要参数的作用以及常见调配方式。 1.Distance Joint 2D&#xff08;距离关节&#xff09; 顾名思义是距离关节&#xff0c;以下为启用EnableCollision前后 关节使得两物体保持一定的距离&#xff0c;如果旋…

Apache (二十一)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、概述 二、安装 1. yum安装 2. 编译安装 三、 目录结构 1. yum安装 2. 编译安装 四、虚拟主机头配置 1. 基本配置 2. 实现方式 五、配置文件语法检查 六、 …

MySQL [环境配置]

MySQL [环境配置] MySQL的下载sqlyog的下载 熟悉老陈的人, 都清楚我不喜欢写这些环境配置的博客 那为啥这次要写一下MySQL的环境配置呢? 因为我被这一个小小的环境配置困扰了很长时间, 淋过雨的人都想为别人撑一把伞, 我不希望我的铁汁们也被这个问题困扰 MySQL的下载 MySQL下…

3. 测试 - 软件测试生命周期 BUG 的级别和生命周期

目录 1. 软件测试的生命周期 2. 描述 BUG 2.1 为什么要进行描述 2.2 如何描述一个 BUG 练习描述 BUG&#xff1a;邮箱登录不上去 练习描述 BUG&#xff1a;ie下界面显示异常&#xff0c;界面文字有重叠 3. BUG 的级别 4. BUG 的生命周期 1. 软件测试的生命周期 软件的…

【kubernetes系列】Kubernetes之Ingress

概述 从前面的学习&#xff0c;我们可以了解到Kubernetes暴露服务的方式目前常见的只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff1b;而我们需要将集群内服务提供外界访问就会面临以下几个问题&#xff1a; Pod 漂移问题 Kubernetes 具有强大…

ubuntu 不能检测到显卡信息

开始时&#xff1a;lspci | grep -i nvidia 01:00.0 VGA compatible controller: NVIDIA Corporation Device 2489 (rev a1) 01:00.1 Audio device: NVIDIA Corporation Device 228b (rev a1) 运行sudo update-pciids 运行 lspci | grep -i nvidia 找到显卡了

Linux - 进阶 NFS服务器搭建 详解实验操作

建立 NFS 服务器&#xff0c;使用客户端成功访问 # 搭建环境 server 为服务端&#xff0c; node1 为客户端 &#xff08; 客户端是通过 服务端克隆出来的机子&#xff0c;并改了 IP 和 主机名&#xff09; IP 都显示出&#xff0c;并且双方能够 Ping 通 这样准备环…

顶尖公司是平均水平的100倍,惊讶吗?

行业顶尖公司人员平均能力水平&#xff0c;在行业平均水平的100倍之上&#xff01; 程序员的超级榜样&#xff1a;美国integram公司13个人&#xff0c;最后被facebook用10亿美金收购 《中庸》人能一之己百之&#xff0c;人能十之己千之 趣讲大白话&#xff1a;百倍努力&#xf…

项目管理软件挑选诀窍:6个必须知道的关键点!

项目管理软件对于任何希望简化其操作和提高效率的组织来说都是一个有价值的工具。然而&#xff0c;市场上有这么多的选择&#xff0c;选择合适的软件可能是一项艰巨的任务。在本文中&#xff0c;我们将讨论如何选择满足您业务需求的项目管理软件。 1、确定你的挑战和限制 选择项…

TL5000可调谐激光器控制软件系统

画了两周时间&#xff0c;利用下班时间&#xff0c;设计了一个ITLA可调谐激光器控制系统&#xff0c;从硬件到软件。 这是使用的界面&#xff0c;实现了下面的功能&#xff1a; 1、模块信息的读取&#xff0c;包括生产日期&#xff0c;生产厂家&#xff0c;型号&#xff0c;序…

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法

在WIN10系统中安装TIA博途V18,重启后提示安装介质不可用,请插入DVD 或检查网络连接的解决办法 原因:下载的安装包为ISO文件,若没有解压缩,直接点击打开安装,则会出现这样的错误提示。 解决办法: 把安装包解压缩之后再进行安装。 安装教程可参考以下步骤: 前提条件: T…

【iOS内存管理-编译链接的过程】

文章目录 前言计算机语言文件后缀名 编译和链接的过程编译链接预处理&#xff08;预编译&#xff09;-> 产生.i文件编译 -> 产生.s文件汇编 -> 产生.o文件链接 总结 前言 就我而言&#xff0c;iOS开发的过程中接触到的编译链接方面的知识很少&#xff0c;这部分知识还…