STM32学习笔记(三)--EXTI外部中断详解

(1)配置步骤
1.配置RCC  打开外设时钟
2.配置GPIO 选择端口输入模式
3.配置AFIO 选择要用的一路GPIO 连接至EXTI
4.配置EXTI 选择边沿触发方式 上升沿 下降沿 双边沿

                   选择触发响应方式 中断响应 事件响应
5.配置NVIC 选择一个合适的优先级

其中涉及外设有RCC、GPIO、AFIO、EXTI、NVIC

(2)代码示例
案例1 (设置PB14为外部中断触发的方式)

//使能GPIOB对应的外设时钟以及AFIO对应的外设时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
//对于外部中断,要选择浮空、上拉、下拉输入的其一
这个根据STM32F10xxx参考手册(中文)8.1.11 外设的GPIO配置内含所有外设的模式选择
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
//配置AFIO为外部中断线14的输入引脚
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource14);
//配置外部中断线14,使能中断,中断触发方式为下降沿触发
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line = EXTI_Line14;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);
//配置NVIC中断优先级分组2,抢占式2位,响应式2位。
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
//配置NVIC外部中断通道EXTI15_10_IRQn,使能中断通道,设置抢占1位,响应1位。
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);

案例2(设置PB1  PB11为外部中断触发的方式)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin = 0x0802;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource11);
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line1|EXTI_Line11;
EXTI_InitStructure.EXTI_LineCmd=ENABLE;
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
EXTI_Init(&EXTI_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel=EXTI15_10_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=2;
NVIC_Init(&NVIC_InitStructure);

(3)函数分析

函数1:void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)
(stm32f10x_gpio.h)

该函数虽然是GPIO开头但是实则是操作AFIO的寄存器,选择外部中断线。

序号

名称

参数解释

示例

参数1

GPIO_PortSource

选择GPIO外设作为外部中断源A..G

GPIO_PortSourceGPIOB

参数2

GPIO_PinSource

指定参数的外部中断线0..15

GPIO_PinSource14

函数2:void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct)(stm32f10x_exti.h)

用结构体的参数来初始化EXTI外设。

序号

名称

参数解释

示例

参数1

EXTI_InitTypeDef* EXTI_InitStruct

选择GPIO外设作为外部中断源A..G

&EXTI_InitStructure

补充:对于EXTI_InitTypeDef结构体中的成员变量分别是
EXTI_InitStructure.EXTI_Line(中断线配置)
EXTI_InitStructure.EXTI_LineCmd (中断线的状态开启)
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt(中断、事件Event模式选择)
EXTI_InitStructure.EXTI_Trigger(指定触发信号的边沿 上升沿 下降沿 上升下降沿)

函数3:void NVIC_PriorityGroupConfig(uint32_t NVIC_PriorityGroup)(misc.h)

该函数用来配置NVIC分组先占优先级以及抢占优先级,防止中断冲突。

序号

名称

参数解释

示例

参数1

PriorityGroup

选择NVIC分组

NVIC_PriorityGroup_2

函数4:void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct)(misc.h)

函数NVIC_InitTypeDef的成员变量如下根据STM32F10xxx参考手册9.2.5外部中断/事件线路映像

序号

名称

参数解释

示例

参数1

NVIC_IRQChannel

指定中断通道开启或者关闭

EXTI0_IRQn                  

EXTI1_IRQn                  

EXTI2_IRQn                  

EXTI3_IRQn                  

EXTI4_IRQn

EXTI9_5_IRQn

EXTI15_10_IRQn

参数2

NVIC_IRQChannelCmd

指定中断使能或者失能

ENABLE or DISABLE

参数3

NVIC_IRQChannelPreemptionPriority

指定抢占优先级

1(根据分组表)

参数4

NVIC_IRQChannelSubPriority

指定响应优先级

1(根据分组表)

补充上述NVIC分组内容:NVIC的中断优先级由优先级寄存器的4位(0~15)决定,这4位可以进行切分,分为高n位的抢占优先级和低4-n位的响应优先级;

抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队

分组方式

抢占优先级

响应优先级

分组0

0位、取位为0

4位、取位为0-15

分组1

1位、取位为0-1

3位、取位为0-7

分组2

2位、取位为0-3

2位、取位为0-3

分组3

3位、取位为0-7

1位、取位为0-1

分组4

4位、取位为0-15

0位、取位为0

函数5:ITStatus EXTI_GetITStatus(uint32_t EXTI_Line)(stm32f10x_exti.h)

该函数是获取指定中断标志位的状态,也就是是1还是0。

序号

名称

参数解释

示例

参数1

EXTI_Line

指定中断标志位

EXTI_Line14

主要配合void EXTI_ClearITPendingBit(uint32_t EXTI_Line)使用,该函数用来清除标志位,参数用法跟上述函数一致,每次进入中断都要手动清除;如下为示例

//位于启动文件中startup_stm32f10x_md.s 参数名根据中断标志位选择 否则无法进入
void EXTI15_10_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line14) == SET){/*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0){//中断触发事件}//清除指定中断标志位EXTI_ClearITPendingBit(EXTI_Line14);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

若依微服务Docker部署验证码出不来怎么办?

最近,有许多人反馈在使用 Docker 部署若依微服务项目时,遇到验证码无法显示的问题。本文将重点介绍解决该问题的注意事项以及整个项目的部署流程。之前我们也撰写过微服务部署教程,本文将在此基础上进行优化和补充。你也可以参考我之前写的部署教程:https://yang-roc.blog.…

宠物空气净化器避坑指南:希喂、霍尼韦尔、安德迈谁是性价比之王

作为一个拥有两只布偶的猫奴,家中猫浮毛无处不在,稍有松懈,出门衣物上便沾满猫毛,影响形象。不仅如此,空气中还飘浮着猫咪们的浮毛和异味。难以清理。经过我不懈的努力,我终于找到了解决这一问题的神器——…

自定义 LLM:LangChain与文心一言擦出火花

自定义 LLM 自定义 LLM 需要实现以下必要的函数: _call :它需要接受一个字符串、可选的停用词,并返回一个字符串。 它还可以实现第二个可选的函数: _identifying_params :用于帮助打印 LLM 信息。该函数应该返回一…

OpenStack入门体验及一键部署

OpenStack入门体验 技能目标: 了解云计算概念 了解OpenStack 了解OpenStack的构成 会OpenStack单机环境一键部署 从控制台认识OpenStack各项功能会 通过OpenStack控制台创建云主机 什么是云计算 云计算(cloudcomputing)是一种基于网络的超级计算模式&a…

Java老人护理上门服务类型系统小程序APP源码

🌸 老人上门护理服务系统:温暖与专业并存 🌸 一、🏠 走进老人上门护理服务系统 随着社会的快速发展,我们越来越关注老年人的生活质量。老人上门护理服务系统应运而生,它结合了现代科技与人性化服务&#…

redis序列化

文章目录 1、为什么要进行序列化操作?2、序列化方式2.1、自定义序列化2. 2、StringRedisTemplate(重点) 1、为什么要进行序列化操作? 不进行序列化向redis存入数据代码: SpringBootTest class RedisDemoApplicationT…

java反序列化---cc6链

目录 Transformer[]数组分析 链条代码跟进 ChainedTransformer.transform() LazyMap.get() TiedMapEntry.getValue() TiedMapEntry.hashCode() HashMap.hash() HashMap.put()的意外触发 LazyMap.get()中key的包含问题 cc6的payload如下 import org.apache.commons.co…

Vue40-vueComponent构造函数

一、组件的本质:VueComponent构造函数 组件的本质是:构造函数 二、每一次调用vue.extend,返回的事一个全新的 VueComponent VueComponent的源码如下: 三、组件中的this 组件中的this是VueComponent实例对象,结构和vm…

vite.config.js如何使用env的环境变量

了解下环境变量在vite中 官方文档走起 https://cn.vitejs.dev/guide/env-and-mode.html#env-variables-and-modes 你见到的.env,.env.production等就是放置环境变量的 官方文档说到.env.[mode] # 只在指定模式下加载,比如.env.development只在开发环境加载 至于为什么是deve…

前缀和算法:算法秘籍下的数据预言家

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一. 前缀和算法的介绍 二、前缀和例题 2.1 【模版】前缀和 2.2 【模板】二维前缀和 2.3 寻找数组的中间下标 2.4 除自身以外数组的乘积 2.5 和为k的子数组 2.6 和可被k整除的子数组 2.7 …

maven编译【-Dmaven.test.skip=true和-DskipTests=true的区别】

1、背景 我在执行maven编译时,遇到下面情况: 1、当执行命令为下面: mvn clean compile package install -Dmaven.wagon.http.ssl.insecuretrue -Dmaven.wagon.http.ssl.allowalltrue -Dmaven.wagon.http.ssl.ignore.validity.datestrue -Dra…

红队内网攻防渗透:内网渗透之Linux内网权限提升技术:udf提权Capability权限LD_PRELOAD环境变量

红队内网攻防渗透 1. 内网权限提升技术1.1 Linux系统提权-Web&用户-数据库udf提权1.1.1 信息收集1.1.2 Web权限获取1.1.3 MYSQL-UDF提权1.1.4 下载到目标上1.1.5 连接确认是否有条件进行导出调用1.1.6 开始进行写入导出调用1.2 Linux系统提权-Web&用户-Capability能力1…

Java语言+前端框架html+Thymeleaf +后端框架springboot开发的UWB智能定位系统源码 UWB三维可视化人员定位系统源码

Java语言前端框架htmlThymeleaf 后端框架springboot开发的UWB智能定位系统源码 UWB三维可视化人员定位系统源码 UWB定位系统基于B/S架构的软件和嵌入式硬件都具有很好的扩展性和兼容性,可以与其他系统接口(比如:围界、AB门、高压电网、报警、…

怎么图片转excel表格?推荐三个方法

怎么图片转excel表格?在信息化高速发展的今天,图片转Excel表格的需求日益凸显,尤其是在职场办公中,这一需求更是显得尤为迫切。为了满足广大用户的需求,市面上涌现出了众多图片转Excel的软件。今天,就为大家…

QT 使用资源文件的注意点

不要存放没有使用的资源文件 即使在代码中没有使用到的资源文件,也会编译到执行文件或者DLL里面去这样会增大它的体积。如下 在代码没有使用这个资源文件(10.4M的2k图片),但是编译出来的程序有 12M左右的大小

java写一个验证码

生成验证码 内容:可以是小写字母,也可以是大写字母,还可以是数字 规则 长度为5 内容中是四位字母,1位数字。 其中数字只有1位,但是可以出现在任意的位置。 package User;import java.util.ArrayList; import jav…

Android Studio Jellyfish版本修改project使用特定jdk版本的步骤

android studio总是把这些东西改来改去让人十分恼火,IDE本身改来改去就让人无法上手就立即工作,很多时间浪费在IDE和gradle的配置和奇奇怪怪现象的斗智斗勇上,搞Android是真的有点浪费生命。一入此坑深不见底 jellyfish版安卓studio已经无法通…

LeetCode | 434.字符串中的单词数

这道题直接使用语言内置的 split 函数可直接分离出字符串中的每个单词,但是要注意区分两种情况:1、空串;2、多个空格连续,分割后会出现空字符的情况,应该舍弃 class Solution(object):def countSegments(self, s):&qu…

接口测试之用Fiddler对手机app进行抓包

Fiddler是一款非常流行并且实用的http抓包工具,它的原理是在本机开启了一个http的代理服务器,然后它会转发所有的http请求和响应,因此,它比一般的firebug或者是chrome自带的抓包工具要好用的多。不仅如此,它还可以支持…

202478读书笔记|《人间小满》——小满,才是最好的人生状态,养身先养心,知世故而不世故,历圆滑而弥天真

202478读书笔记|《人间小满》——小满,才是最好的人生状态,养身先养心,知世故而不世故,历圆滑而弥天真 一、画出世俗的欢喜,过一种平淡自由的人生二、与时舒卷,抵岁月荒唐三、一半是海水,一半是…