EXTI (2)
增强版实验简介
EXTI5和EXTI9共享一个中断源 下面的类似 EXTI0到4各自拥有一个中断源
改变引脚 PA0和PA1改变为PA5 和PA6
EXTI的重映射
之前是把PA0映射到EXTI0 PA1映射到EXTI1上 现在是要把PA5和PA6分别映射到EXTI5和6上
EXTI进行初始化
NVIC初始化
编写中断函数
因为EXTI5和6都可以触发同一个中断源 所以要判断到底是哪一个触发的 就要去查中断挂起寄存器的值 如果是第一个为1就是EXTI5触发的 如果是第二个为1那就是EXTI6触发的
#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_5 | GPIO_Pin_6;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_PinSource5);// PA1 -> EXTI1GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource6);// 3. 初始化EXTI// 3.1. 初始化EXTI5EXTI_InitTypeDef EXTIInitStruct;EXTIInitStruct.EXTI_Line = EXTI_Line5;EXTIInitStruct.EXTI_Mode = EXTI_Mode_Interrupt;EXTIInitStruct.EXTI_Trigger = EXTI_Trigger_Rising;EXTIInitStruct.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTIInitStruct);// 3.2. 初始化EXTI6EXTIInitStruct.EXTI_Line = EXTI_Line6;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. EXTI0 EXTI5,EXTI6共用一个中断源 写一个就可以了NVICInitStruct.NVIC_IRQChannel = EXTI9_5_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 EXTI9_5_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line5)==SET) // EXTI5触发的中断{//清除中断源EXTI_ClearITPendingBit(EXTI_Line5);//点灯GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);}if(EXTI_GetITStatus(EXTI_Line6)==SET) //EXTI6触发的中断{//清除中断源EXTI_ClearITPendingBit(EXTI_Line6);//灭灯GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);}
}
EXTI的PAL库编程
标准库编程的不足
初始化IO引脚就要使能GPIOA和C的时钟调用GPIO_Init函数初始化GPIOA GPIOC的引脚 输入还是输出模式 输出的速度(输入就不用设置) 然后IO引脚的重映射 使能AFIO的时钟调用函数GPIO_EXTILineConfig把PA5和PA6分别映射到EXTI5 EXTI6上去 然后再初始化EXTI 调用EXTI INIT函数 EXTI的通道 EXTI的模式(事件还是中断模式)等等 然后还要初始化NVIC 还要查明中断来自于那个通道 (因为PA5和PA6是共用中断源 要是是PA1和PA0就各自用中断源 无需判断中断来自于那个通道)
PAL库编程接口简介
EXTI PAL库 编程分为三个部分
填写初始化参数初始化了一切就是没有关闭中断屏蔽
使能EXTI的通道就是闭合中断屏蔽
编写中断响应函数
在标准库中我们是使用弱方法 覆盖掉函数名 在中断函数中我们查询了中断挂起位的值(分辨到底是那个PA5还是PA6引起的触发中断)还清除了中断 在PAL库中只需要调用一个函数接口就可以完成这两件事
相关文章:

EXTI (2)
增强版实验简介 EXTI5和EXTI9共享一个中断源 下面的类似 EXTI0到4各自拥有一个中断源 改变引脚 PA0和PA1改变为PA5 和PA6 EXTI的重映射 之前是把PA0映射到EXTI0 PA1映射到EXTI1上 现在是要把PA5和PA6分别映射到EXTI5和6上 EXTI进行初始化 NVIC初始化 编写中断函数 因为EXTI…...

Django实战项目-学习任务系统-任务完成率统计
接着上期代码内容,继续完善优化系统功能。 本次增加任务完成率统计功能,为更好的了解哪些任务完成率高,哪些任务完成率低。 该功能完成后,学习任务系统1.0版本就基本完成了。 1,编辑urls配置文件: ./mysi…...

安卓调用手机邮箱应用发送邮件
先来看看实现效果: 也不过多介绍了,直接上代码: private void openMail() {Uri uri Uri.parse("mailto:" "");List<ApplicationInfo> applicationInfoList getPackageManager().getInstalledApplications(Packa…...

Vue-Pinia
目录 Pinia状态管理库 使用步骤 1、安装Pinia 2、在vue应用实例中使用pinia 3、在src/stores/token.js中定义stores 4、在组件中使用store axios请求拦截器 代码实现 Pinia状态管理库 Pinia是Vue的专属状态管理库,它允许你跨组件或页面共享状态 一般在登录时…...
C语言,编写程序输出半径为1到15的圆的面积,若面积在30到100之间则予以输出,否则,不予输出
以下是一个使用C语言编写的程序,用于输出半径为1到15的圆的面积,并且如果面积在30到100之间,则输出该圆的半径和面积。 #include <stdio.h> #define PI 3.14159265358979323846int main() {int radius;double area;for (radius 1; ra…...

Ansys Electronics Desktop仿真——HFSS线圈寄生电阻,电感
利用ANSYS Electronics Desktop,可在综合全面、易于使用的设计平台中集成严格的电磁场分析和系统电路仿真。按需求解器技术让您能集成电磁场仿真器和电路及系统级仿真,以探索完整的系统性能。 HFSS(High Frequency Structure Simulator&#…...
对数据库密码使用MD5加密算法加密,并进行登录验证
实现步骤: 修改数据库中明文密码,改为MD5加密后的密文 打开employee表,修改密码 修改Java代码,前端提交的密码进行MD5加密后再跟数据库中密码比对 打开EmployeeServiceImpl.java,修改比对密码 /*** 员工登录** param …...

关于Chrome中F12调试Console输入多行
在chrome 浏览器中使用console调试的时,如果想在console中输入多行代码,需要进行换行。 这时我们可以使用 [ Shift Enter ] 。也叫: 软回车。...
C# 集合用法介绍
在C#中,集合是一种特殊的数据类型,允许我们将多个元素组织在一起。这些元素可以是相同的类型或者可以是不同的类型。C#集合主要包括以下几种类型: List:它是一个有序的元素列表,用户可以添加、删除或查找元素。Dictio…...

linux三次握手、四次挥手
TCP协议是一个安全的、面向连接的、流式传输协议,所谓的面向连接就是三次握手,对于程序猿来说只需要在客户端调用connect()函数,三次握手就自动进行了。先通过下图看一下TCP协议的格式,然后再介绍三次握手的具体流程。 1.tcp协议…...
C# 泛型介绍
C# 中的泛型(Generics)是一种强类型参数化的特性,它允许你编写不具体指定数据类型的代码,而在实际使用时再指定具体的类型。泛型的引入使得代码更加灵活、可重用,并提高了类型安全性。 C#泛型基本用法 以下是一个简单…...

Windows如何正确设置PHP环境变量以在Git Bash中运行命令
1、随便找一个目录,鼠标右键打开git bash here 2、cd的根目录 3、找到php安装目录 4、 在根目录下打开 vim .bash_profile ,添加环境变量,php地址根据自己的本地地址而定 PATH$PATH:/d/phpstudy_pro/Extensions/php/php7.3.4nts 添加后保存…...

[代码实战和详解]VGG16
VGG16 详解 我的github代码实现:vgg16 我们在vgg16神经网络上训练了SIGNS数据集,这是一个分类的数据集,在我的github上有介绍怎么下载数据集以及如何训练。 VGG16是一个卷积神经网络(CNN)架构,它在2014年…...

x3daudio1_7.dll错误:解决方法和丢失原因及作用
x3daudio1_7.dll是Windows操作系统中的一个动态链接库(DLL)文件,主要作用是为DirectX音频提供支持。DirectX是微软推出的一套多媒体应用程序开发接口,广泛应用于游戏、多媒体制作等领域。x3daudio1_7.dll文件包含了许多与三维音频…...

pipeline + node +jenkins+kubernetes部署yarn前端项目
1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …...
计算机网络中的面向连接与无连接
目录 面向连接和无连接在计算机网络中是如何理解的面向连接和无连接的通信在路由选择上有哪些区别 面向连接和无连接在计算机网络中是如何理解的 在计算机网络中,面向连接和无连接是两种核心的网络通信方式,它们决定了数据包如何传输和接收。 面向连接&…...
EventEmitter3在vue中的使用
前提 vue中的组件传递方式有很多,包括父子组件之间的传值(props,emit)、事件总线($ bus)、状态管理模式(vuex,pinia),现在推荐一种可以替代$bus的一种传值方…...

双剑合璧:基于Elasticsearch的两路召回语义检索系统,实现关键字与语义的高效精准匹配
搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…...

LeetCode34-34. 在排序数组中查找元素的第一个和最后一个位置
🔗:代码随想录:二分查找的算法讲解:有关left<right和left<right的区别 class Solution {public int[] searchRange(int[] nums, int target) {int nnums.length;int l0,hn-1;if(numsnull){return null; }if(n0){return new int[]{-1,-1}; }if(target&l…...
ddrnet 分割学习笔记
目录 修改后可以加载预训练: 训练自己的数据代码: 默认分割后特征下采样8倍,最后用上采样恢复到原图; 修改后可以加载预训练: import math import torch import numpy as np import torch.nn as nn import torch.nn.functional as F from torch.nn import init from …...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...