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搜索填入表中每一行对应的值如第一行

中断函数的名称要在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寄存器的对应位置的值 一直检测判断按键是否被按下 那么是否有第二种方式检测按键是否被按下了呢? 通过EXTI 当EXTI检测到按键的电平发生…...
Qt信号量用于对共享资源进行同步
定义信号量与缓冲区: const int BufferSize 8; int buffer1[BufferSize]; int buffer2[BufferSize]; int curBuf1; //当前正在写入的Bufferint bufNo0; //采集的缓冲区序号quint8 counter0;//数据生成器QSemaphore emptyBufs(2);//信号量:空的缓冲区…...

在报错中学python something
这里写目录标题 动手学深度学习pandas完整代码数据处理TypeError: can only concatenate str (not "int") to str(fillna填补缺失值) 创建文件夹学习这个数据分组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…...

洗地机哪个牌子最好用?洗地机品牌排行榜
近年来,洗地机相当热门,洗地机结合了扫地拖地吸地为一体的多功能清洁工具,让我们告别了传统方式打扫卫生,让我们清洁不再费劲,可是市面上的洗地机五花八门,怎么挑选到一个洗地机也是一个问题,下…...

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

浅谈二叉树
✏️✏️✏️今天给大家分享一下二叉树的基本概念以及性质、二叉树的自定义实现,二叉树的遍历等。 清风的CSDN博客 😛😛😛希望我的文章能对你有所帮助,有不足的地方还请各位看官多多指教,大家一起学习交流&…...
(二) 用QWebSocket 实现服务端和客户端(详细代码直接使用)
目录 前言 一、服务器的代码: 1、服务器的思路 2、具体服务器的代码示例 二、客户端的代码: 1、客户端的思路(和服务器类似) 2、具体客户端的代码示例 前言 要是想了解QWebSocket的详细知识,还得移步到上一篇文…...

关于我在配置zookeeper出现,启动成功,进程存在,但是查看状态却没有出现Mode:xxxxx的问题和我的解决方案
在我输入:zkServer.sh status 之后出现报错码. 报错码: 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?它的特点是什么? 2、解释一下虚拟DOM(Virtual DOM)的概念以及它的工作原理。 3、什么是组件(Component)?如何定义一个React组件? 4、什么是JSX?它与HTML的区别是什么?如何在React中…...
QT4到QT5移植出现的一些问题
转自:QT4到QT5移植出现的一些问题_西门子3gl qt5 许可证-CSDN博客 在上述作者基础上修改: 一、问题1:头文件的问题 1、QtGui/QApplication: No such file or directory 1.1错因 原因是Qt5源文件位置的改动 1.2解决 pro文件里࿰…...

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

No191.精选前端面试题,享受每天的挑战和学习
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…...
ROS基础—vscode创建工作空间
1、创建ROS工作空间 首先打开ubuntu的终端,接着依次输入如下的命令行; mkdir -p xxx_ws/src(必须得有 src) cd xxx_ws catkin_make当然我一般是新建一个叫做demo的工作空间,如 mkdir -p demo04_ws/src 2、启动vscode cd xxx_ws code . …...
机器学习复习(待更新)
01绪论 (1)机器学习基本分类: 监督学习(有标签)半监督学习(部分标签,找数据结构)无监督学习(无标签,找数据结构)强化学习(不断交互&…...

taro(踩坑) npm run dev:weapp 微信小程序开发者工具预览报错
控制台报错信息: 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 环境: node 版本&#x…...
3. 深度学习——损失函数
机器学习面试题汇总与解析——损失函数 本章讲解知识点 什么是损失函数?为什么要使用损失函数?详细讲解损失函数本专栏适合于Python已经入门的学生或人士,有一定的编程基础。 本专栏适合于算法工程师、机器学习、图像处理求职的学生或人士。 本专栏针对面试题答案进行了优化…...

交叉编译 openssl
要在 x86 平台上编译适用于 aarch64 架构的 OpenSSL 动态库,你需要使用交叉编译工具链。可以按照以下步骤进行: 安装 aarch64 交叉编译工具链: $ sudo apt-get install gcc-aarch64-linux-gnu g-aarch64-linux-gnu 这将安装 aarch64 交叉编…...
C++文件的读取和写入
1、C对txt文件的读,ios::in #include<iostream> #include<fstream> using namespace std;int main() {ifstream ifs;ifs.open("test.txt",ios::in);if(!ifs.is_open()){cout<<"打开文件失败!"<<endl;}char…...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...