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

EXIT(1)

EXTI介绍

在这里插入图片描述
EXTI是片上外设 NVIC是cpu内的外设 回忆起之前的GPIO和AFIO 我们是如何检测按键按下的 我们是一直用while循环读取IDR寄存器的对应位置的值 一直检测判断按键是否被按下
那么是否有第二种方式检测按键是否被按下了呢?
通过EXTI 当EXTI检测到按键的电平发生变化 就会触发一个中断 送到NVIC进行相应的处理 就会触发相应的中断函数
在这里插入图片描述

EXTI的工作原理

EXTI的作用就是检测外部信号的变化由此产生中断
在这里插入图片描述
首先外部输入一个信号 信号有上升沿和下降沿 经过边路检测分为上升沿和下降沿还有双边沿三路信号 通过边沿的选择选择是哪路信号传入下一个的或门 (这里举例的是边沿选择选择的是上升沿)进入到或门后要看中断是否屏蔽如果没有屏蔽就接着往下传输 到脉冲位产生中断 看中断挂起 脉冲置为为1 无法自己清零 需要手动清零手动清零后电平型中断就为0 还有上升沿信号传入后还可以变为事件

事件

在这里插入图片描述
中断的模型就是片上外社产生一个中断传输到NVIC(CPU内)然后进行中断仲裁 然后通过后执行相应的中断函数 有CPU的参与
事件就是外部产生一个终端信号给与EXTI产生事件给部件将部件从睡眠模式中唤醒 不需要CPU的介入
在这里插入图片描述
检测多路信号 就是多个这样的结构同时检测多路信号的输入
EXTI的20路信号有什么用?
1.让所有IO具备触发中断的能力
在这里插入图片描述
EXTI具有19个通道 一个通道对应abcde…的第0个io口 依次类推所有的io口都连接到了EXTI上都具备了触发中断的能力 当每一个 如PA0口连接到EXTI0时其他都不能连接了
只用EXTI的16个通道作为IO引脚的触发 其他四个通道具有特殊的功能
在这里插入图片描述

EXTI的寄存器组

在这里插入图片描述
每一列对应的都是一个通道 TP0这一列对应的就是第1个通道

在这里插入图片描述
这里以EXTI0为列子 如果想上升沿TR0就写1 (上面) 下面的TR0就写0 如果想双沿触发就全部写1
在这里插入图片描述
中断屏蔽寄存器对应着开关 对应的通道的寄存器位写0就断开 写1就闭合事件屏蔽寄存器也是如此

EXTI的编程接口

在这里插入图片描述
第一个line参数是要哪一个EXTI的通道 第二个参数Mode是要什么模式 是中断模式 触发中断 传输到NVIC还是要事件模式 唤醒部件 第三个参数Trigger什么触发模式 上升还是下降还是双边 第四个参数linecmd是 是否要开启中断或者事件屏蔽如果选择的是事件模式就是控制下面的事件屏蔽开关 如果选择的是中断模式那么控制的就是上面的中断屏蔽开关
声明一个结构体变量 然后填表把相应的值填进去

在这里插入图片描述
第一个函数EXTI_Init是上面的函数 第二个函数Generate 返回值是空 传入的值是通道号(后面的也是如此) 通过调用这个函数(编程接口)可以产生软件中断就是在软件触发哪里可以产生一个脉冲信号触发一个中断在这里插入图片描述
第三个函数getflag 获取标志位的值 1位set 0为reset 会返回值1或者0在这里插入图片描述
第四个函数clearflag是清除标志位当信号传输到中断挂起位置时候产生的是一个电平型的信号 需要手动清零
在这里插入图片描述
第五个函数getstatus 是需要中断屏蔽和中断挂起为1才会为1(需要使能这个中断同时出触发这个中断)同样也会返回值 0或者1 reset或set
最后一个函数同样也是清除标志位 但是会经常用的就是这个函数 这个函数和第三个完全一样 但是由于名字会经常使用这个函数清除标志位

按钮编程实验

在这里插入图片描述
回忆一下之前按钮的编程时使用while语句一直检测previous(之前的电平)和current(当前的电平)的值然后判断两个值是否相等来判断按键是否按下或松开(按键按下或者松开previous和current的值都不会相同) 一直循环的去检测两个值 使用中断来实现按键编程
选择上升沿触发 因为我们要按键松开才该改变灯的电平就是从0电位到1电位 是一个上升沿 然后要使用PA0 PA1两个IO口所以EXTI要使用EXTI0和EXTI1两个通道
编程思路梳理
在这里插入图片描述
首先要使用按钮就要初始化两个io端口 然后要配置AFIO使得端口PA0和PA1连接到EXTI0 和EXTI1(也就是EXTI的IO映射)
在这里插入图片描述
然后EXTI0和EXTI1会分别产生两路中断传输到NVIC 接着配置NVIC
在这里插入图片描述
先配置中断屏蔽先把开关打开 然后配置中断优先级 配置几个位给抢占优先级和子优先级
(红色虚线的位置)

EXTI的IO映射

在这里插入图片描述
EXTI通道初始化
在这里插入图片描述
如果自己填
在这里插入图片描述

去头文件中搜这个结构体 EXTI_InitTypeDef在头文件中找每一个要填表的值 搜索后面的ctrl+f搜索填入表中每一行对应的值如第一行在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/f1daeb5f597a4f7aa7ff35668528fd24.png)

在这里插入图片描述
中断函数的名称要在stm32中启动文件中寻找
在这里插入图片描述
这就是个弱方法 就是先占名然后用重名的函数覆盖掉
在这里插入图片描述
点灯就是写0就亮起 写1就熄灭

#include "stm32f10x.h"
#include "stm32f10x_pal.h"int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);PAL_Init();// 1. 初始化IO引脚// 将PA0和PA1分别设置为输入上拉模式// 开启GPIOA的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// PA0, PA1GPIO_InitTypeDef GPIOInitStruct;GPIOInitStruct.GPIO_Pin  = GPIO_Pin_0 | GPIO_Pin_1;GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOA, &GPIOInitStruct);// 2. 配置EXTI的引脚映射// 开启AFIO的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);// PA0 -> EXTI0GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);// PA1 -> EXTI1GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);// 3. 初始化EXTI// 3.1. 初始化EXTI0EXTI_InitTypeDef EXTIInitStruct;EXTIInitStruct.EXTI_Line = EXTI_Line0;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);// 3.2. 初始化EXTI1EXTIInitStruct.EXTI_Line = EXTI_Line1;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);// 4. 初始化NVICNVIC_InitTypeDef NVICInitStruct;// 4.1. EXTI0NVICInitStruct.NVIC_IRQChannel = EXTI0_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);// 4.2. EXTI1NVICInitStruct.NVIC_IRQChannel = EXTI1_IRQn;NVICInitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVICInitStruct.NVIC_IRQChannelSubPriority = 0;NVICInitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVICInitStruct);// 5. 初始化PC13RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);GPIOInitStruct.GPIO_Pin = GPIO_Pin_13;GPIOInitStruct.GPIO_Mode = GPIO_Mode_Out_OD; // Open-drainGPIOInitStruct.GPIO_Speed = GPIO_Speed_2MHz;GPIO_Init(GPIOC, &GPIOInitStruct);while(1){}
}void EXTI0_IRQHandler(void)
{// 清除中断EXTI_ClearITPendingBit(EXTI_Line0);// 点亮LED PC13 <- 0GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_RESET);
}void EXTI1_IRQHandler(void)
{// 清除中断EXTI_ClearITPendingBit(EXTI_Line1);GPIO_WriteBit(GPIOC, GPIO_Pin_13, Bit_SET);
}

相关文章:

EXIT(1)

EXTI介绍 EXTI是片上外设 NVIC是cpu内的外设 回忆起之前的GPIO和AFIO 我们是如何检测按键按下的 我们是一直用while循环读取IDR寄存器的对应位置的值 一直检测判断按键是否被按下 那么是否有第二种方式检测按键是否被按下了呢&#xff1f; 通过EXTI 当EXTI检测到按键的电平发生…...

Qt信号量用于对共享资源进行同步

定义信号量与缓冲区&#xff1a; const int BufferSize 8; int buffer1[BufferSize]; int buffer2[BufferSize]; int curBuf1; //当前正在写入的Bufferint bufNo0; //采集的缓冲区序号quint8 counter0;//数据生成器QSemaphore emptyBufs(2);//信号量&#xff1a;空的缓冲区…...

在报错中学python something

这里写目录标题 动手学深度学习pandas完整代码数据处理TypeError: can only concatenate str (not "int") to str&#xff08;fillna填补缺失值&#xff09; 创建文件夹学习这个数据分组get_dummies实现one hot encode 动手学深度学习pandas完整代码 import osimpor…...

如何调用 DBMS_DISKGROUP 对 ASM 文件进行随机读取

目录 一、概述 二、实现思路与注意点 三、Java Demo 1、直接调用 2、读写异步 一、概述 对于 Oracle Rac 环境下,数据文件大多默认存放在 ASM 共享存储上,当我们需要读取 ASM 上存储的数据文件时可以使用 Oracle 提供的一些方法,比如 ASMCMD CP。但是,对于一些备份场景…...

UART学习

uart.c #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h" // UART4_TX : PG11 AF6 // UART4_RX : PB2 AF8 void __uart_init() {// GPIOB2 设置为复用功能GPIOB->MODER & (~(0x3 << 4));GPIOB->MODER | (0x2 << 4);G…...

洗地机哪个牌子最好用?洗地机品牌排行榜

近年来&#xff0c;洗地机相当热门&#xff0c;洗地机结合了扫地拖地吸地为一体的多功能清洁工具&#xff0c;让我们告别了传统方式打扫卫生&#xff0c;让我们清洁不再费劲&#xff0c;可是市面上的洗地机五花八门&#xff0c;怎么挑选到一个洗地机也是一个问题&#xff0c;下…...

国际阿里云:Windows实例中数据恢复教程!!!

在处理磁盘相关问题时&#xff0c;您可能会碰到操作系统中数据盘分区丢失的情况。本文介绍了Windows系统下常见的数据盘分区丢失的问题以及对应的处理方法&#xff0c;同时提供了使用云盘的常见误区以及最佳实践&#xff0c;避免可能的数据丢失风险。 前提条件 已注册阿里云账…...

浅谈二叉树

✏️✏️✏️今天给大家分享一下二叉树的基本概念以及性质、二叉树的自定义实现&#xff0c;二叉树的遍历等。 清风的CSDN博客 &#x1f61b;&#x1f61b;&#x1f61b;希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&…...

(二) 用QWebSocket 实现服务端和客户端(详细代码直接使用)

目录 前言 一、服务器的代码&#xff1a; 1、服务器的思路 2、具体服务器的代码示例 二、客户端的代码&#xff1a; 1、客户端的思路&#xff08;和服务器类似&#xff09; 2、具体客户端的代码示例 前言 要是想了解QWebSocket的详细知识&#xff0c;还得移步到上一篇文…...

关于我在配置zookeeper出现,启动成功,进程存在,但是查看状态却没有出现Mode:xxxxx的问题和我的解决方案

在我输入:zkServer.sh status 之后出现报错码. 报错码&#xff1a; ZooKeeper JMX enabled by default Using config: /opt/software/zookeeper/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Error contacting service. It is probably not runni…...

react及相关面试问题汇总

目录 1、什么是React&#xff1f;它的特点是什么&#xff1f; 2、解释一下虚拟DOM(Virtual DOM)的概念以及它的工作原理。 3、什么是组件(Component)&#xff1f;如何定义一个React组件&#xff1f; 4、什么是JSX&#xff1f;它与HTML的区别是什么&#xff1f;如何在React中…...

QT4到QT5移植出现的一些问题

转自&#xff1a;QT4到QT5移植出现的一些问题_西门子3gl qt5 许可证-CSDN博客 在上述作者基础上修改&#xff1a; 一、问题1&#xff1a;头文件的问题 1、QtGui/QApplication: No such file or directory 1.1错因 原因是Qt5源文件位置的改动 1.2解决 pro文件里&#xff0…...

【可解释AI】Alibi explain: 解释机器学习模型的算法

Alibi explain: 解释机器学习模型的算法 可解释人工智能简介Alibi特点算法Library设计展望参考资料 今天介绍Alibi Explain&#xff0c;一个开源Python库&#xff0c;用于解释机器学习模型的预测(https://github.com/SeldonIO/alibi)。该库具有最先进的分类和回归模型可解释性算…...

No191.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...

ROS基础—vscode创建工作空间

1、创建ROS工作空间 首先打开ubuntu的终端&#xff0c;接着依次输入如下的命令行&#xff1b; mkdir -p xxx_ws/src(必须得有 src) cd xxx_ws catkin_make当然我一般是新建一个叫做demo的工作空间&#xff0c;如 mkdir -p demo04_ws/src 2、启动vscode cd xxx_ws code . …...

机器学习复习(待更新)

01绪论 &#xff08;1&#xff09;机器学习基本分类&#xff1a; 监督学习&#xff08;有标签&#xff09;半监督学习&#xff08;部分标签&#xff0c;找数据结构&#xff09;无监督学习&#xff08;无标签&#xff0c;找数据结构&#xff09;强化学习&#xff08;不断交互&…...

taro(踩坑) npm run dev:weapp 微信小程序开发者工具预览报错

控制台报错信息&#xff1a; VM72:9 app.js错误: Error: module vendors-node_modules_taro_weapp_prebundle_chunk-JUEIR267_js.js is not defined, require args is ./vendors-node_modules_taro_weapp_prebundle_chunk-JUEIR267_js.js 环境&#xff1a; node 版本&#x…...

3. 深度学习——损失函数

机器学习面试题汇总与解析——损失函数 本章讲解知识点 什么是损失函数?为什么要使用损失函数?详细讲解损失函数本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。 本专栏针对面试题答案进行了优化…...

交叉编译 openssl

要在 x86 平台上编译适用于 aarch64 架构的 OpenSSL 动态库&#xff0c;你需要使用交叉编译工具链。可以按照以下步骤进行&#xff1a; 安装 aarch64 交叉编译工具链&#xff1a; $ sudo apt-get install gcc-aarch64-linux-gnu g-aarch64-linux-gnu 这将安装 aarch64 交叉编…...

C++文件的读取和写入

1、C对txt文件的读&#xff0c;ios::in #include<iostream> #include<fstream> using namespace std;int main() {ifstream ifs;ifs.open("test.txt",ios::in);if(!ifs.is_open()){cout<<"打开文件失败&#xff01;"<<endl;}char…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

FFmpeg avformat_open_input函数分析

函数内部的总体流程如下&#xff1a; avformat_open_input 精简后的代码如下&#xff1a; int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...