【【萌新的STM32的学习--非正点原子视频的中断设计思路】】

news2024/11/17 7:21:42

萌新的STM32学习–非正点原子视频的中断设计思路

在这里插入图片描述
我们分析而言

我们对于PA0 的设计就从此而来
对于边沿触发的选择我们已经有所了解了
我们下拉,但是当我们摁下开关的时候 从0到1 导通了 所以这个是下拉 上升沿触发

而对于KEY0 我们摁下是使得电路从原来悬空高阻态到地就是0 所以是下降沿触发
那么对于何种模式有很多人可能不理解
我们这么分析
在这里插入图片描述
这里在摁下前是什么我们不知道但是摁下了电流通过了从高到低 所以我们选择给PA0一个开始接入低 也就是下拉模式
在这里插入图片描述
而对于这个我们分析在摁下之后是不是要把1连接到低 那么对于原来的PE4 就是上拉模式 原来上拉到1 那么摁下就是从1到0 就是下降沿触发合情合理

关于代码部分我们的处理方式是这样的
因为我们用的是HAL库 所以怎么说呢
HAL库把很多功能集成封装起来了对我们设计都是颇有帮助的
我们在最先的使用中会先注意对外设进行初始化
因为很多都是建立在GPIO外设上的操作
ok第一步先对GPIO进行初始化
我们最先使用HAL_GPIO_Init
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init)
写是这么写的 一共分为了2部分
前面说的是GPIO_TypeDef *GPIOx
x就是表示我们可以在其中填入其他类型 比如说是GPIOA 等等 我们用到哪个就写入那个 不要管其他了 因为在HAL库的其他地方已经帮我们做完了基本的定义了 
第二个是GPIO_InitTypeDef GPIO_Init
这是一种关于GPIO_InitTypeDef 类型定义的
这个结构体包括了
typedef struct{
uint32_t Pin; /
引脚号 /
uint32_t Mode; /
模式设置 /
uint32_t Pull; /
上拉下拉设置 /
uint32_t Speed; /
速度设置 */} GPIO_InitTypeDef;
这是关于这个类型的叙述 我们就可以设置GPIO相应管脚的各项参数
这其实是基本的 他会把很多操作都封装起来 让你不直接接触寄存器而直接调用
其实我觉得正点原子在这方面既做的好又做的不好 课程之间并没有很爽快的那种完美连接 
就像是你之前介绍完寄存器 然后你实际用起来的时候还是把寄存器封装成一个个模块用的 那当然了我们直接用函数多方便 就是总感觉这其中差了点什么连接块 让人使用起来好不舒服 这是我的个人胡乱猜测

通过外部中断的方式让开发板上的三个独立按键控制 LED 灯:KEY_UP 控制 LED0 翻转,KEY1 控制 LED1 翻转,KEY0 控制 LED0 和 LED1 翻转。
在这里插入图片描述
在这里插入图片描述
分为红 蓝 黄 三根线
红色部分和 蓝色部分是我们 之前就已经实现过的
而对于黄色部分在此处是一种新的定义方式
目的是为了更好的连接EXTI为后续做准备
接下来展示的是exti.c
在这里插入图片描述
对于我们来说黄色的实现 是上面两次实验都有的
就是先把GPIO初始化再先设置
然后接下来的是新实现的两部分我们细致分析一下
HAL_NVIC_SetPriority(KEY0_INT_IRQn, 0, 2); /* 抢占 0,子优先级 2 /
HAL_NVIC_EnableIRQ(KEY0_INT_IRQn); /
使能中断线 4 /
HAL_NVIC_SetPriority(KEY1_INT_IRQn, 1, 2); /
抢占 1,子优先级 2 / HAL_NVIC_EnableIRQ(KEY1_INT_IRQn); / 使能中断线 3 / HAL_NVIC_SetPriority(WKUP_INT_IRQn, 3, 2); / 抢占 2,子优先级 2 / HAL_NVIC_EnableIRQ(WKUP_INT_IRQn); / 使能中断线 0 */
它可以分为2部分一部分是
HAL_NVIC_SetPriority
void HAL_NVIC_SetPriority(IRQn_Type IRQn, uint32_t PreemptPriority,uint32_t SubPriority);

这里可以分为三部分 第一部分是设置 中断号
第二部分是抢占优先级
第三部分是响应优先级
中断号是来自IRQn_Type 定义的枚举类型
我们之前在下面定义的IRQn 其实有这方面的考虑
还有一部分是
HAL_NVIC_EnableIRQ
中断使能函数
所以分析下来是这样的
在这里插入图片描述
在这里插入图片描述
void EXTI4_IRQHandler(); 这是中断服务函数
在这里插入图片描述
你会发现所有的各个部分写法都是这样,因为
所有的外部中断服务函数里都只调用了同样一个函数 HAL_GPIO_EXTI_IRQHandler,该函数是外部中断共用入口函数,函数内部会进行中断标志位清零,并且调用中断处理共用回调函数 HAL_GPIO_EXTI_Callback。
在他的内部会自动带上通用回调函数 所以我们不必去考虑到底何时何地才会写入这个回调函数
只要简单的记住 在中断服务函数内部只要写2个就可以了
另外再写的回调函数 会在我中断服务函数里面的第一条全世界公用的HAL_GPIO_EXTI_IRQHandler
内部会自行调用
我们在前面中断函数的处理过程中都调用了 HAL_GPIO_EXTI_IRQHandler()这个接口,它主要帮我们进行了寄存器操作,清除了中断事件,清除完中断源后,调用中断回调函数HAL_GPIO_EXTI_Callback,这个接口是一个__weak 的接口,我们通过重新实现这个函数来实现真正的外部中断控制逻辑。在该函数内部,通过判断 IO 引脚号来确定中断是来自哪个 IO 口,也就是哪个中断线,然后编写相应的控制逻辑。所以在该函数内部,我们通过 switch 语句判断IO 口来源,例如是来自 GPIO_PIN_0,那么一定是来自 PA0,因为中断线一次只能连接一个 IO口,而三个 IO 口中引脚号为 0 的 IO 口只有 PA0,所以中断线 0 一定是连接 PA0,也就是外部中断由 PA0 触发。其他的引脚号的逻辑类似。
还算可以接收的水平

所以通用步骤
其实学了很长时间的中断 甚至是寄存器的用法 哪一个都不如直接用HAL库来的实在
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

ZMTP协议

ZoreMQ Transport Protocol是一个传输层协议,用于ZMQ的连接的信息交互,本文档描述的是3.0协议,主要分析基于NULL Security Mechanism 协议语法 ZMTP由三部分组成,分别是 greeting、handshake、traffic 部分描述构成greeting描述…

如何将国标规范用EndNote插入到英文期刊中,自定义文献插入指南

EndNote自定义文献 1.插入国标JTG 2034-2020这种新建一个Standard![](https://img-blog.csdnimg.cn/406cf11d1496431a9cf784f3ab71c6a1.png)Reference填入信息参考 插入英文期刊规范ASTM 1.插入国标JTG 2034-2020这种 首先找到大家要投稿的英文期刊,然后去找那些中…

Python:多变量赋值

相关文章 Python专栏https://blog.csdn.net/weixin_45791458/category_12403403.html?spm1001.2014.3001.5482 Python中的赋值语句可以同时对多个变量进行对象绑定(赋值),既可以是多变量链式赋值,也可以是多变量平行赋值&#x…

爱胜品YPS-1133DN系列打印机网络驱动安装的一点小经验

爱胜品YPS-1133DN打印机基本参数: 项目 详细参数 品牌 ICSP爱胜品 外观配色 上灰下白经典实用设计 打印速度 33ppm(A4)、35ppm(Letter)、58ppm(A5) 首页打印时间 ≤8秒 最大月打印量 …

基于aarch64分析kernel源码 四:printk 内核打印

一、参考 Message logging with printk — The Linux Kernel documentation 如何获得正确的printk格式占位符 — The Linux Kernel documentation 使用printk记录消息 — The Linux Kernel documentation printk 内核打印 – 人人都懂物联网 (getiot.tech) 内核printk原理…

对语言模型能否替代知识图谱的再思考

深度学习自然语言处理 原创作者:cola 进NLP群—>加入NLP交流群 知识图谱(KGs)包含了许多真实世界的知识,在许多领域都发挥着重要重用,但是大型的知识图谱构建过程需要大量的人工介入。随着语言模型(LMs&…

Vagrant + VirtualBox + CentOS7 + WindTerm 5分钟搭建本地linux开发环境

1、准备阶段 Vagrant 版本:vagrant_2.2.18_x86_64.msi 链接:https://developer.hashicorp.com/vagrant/downloads VirtualBox 版本:VirtualBox-6.1.46-158378-Win.exe 链接:https://www.virtualbox.org/wiki/Download_Old_Builds …

RHCE——十四、变量和引用

RHCE 一、深入认识变量1、什么是变量2、变量的名称3、变量的类型4、变量的定义5、自定义变量6、环境变量7、位置变量 二、变量赋值和作用域1、显示赋值:变量名变量值2、read 从键盘读入变量值3、变量和引号4、变量的作用域5、变量的运算 一、深入认识变量 1、什么是…

编程题四大算法思想(三)——贪心法:找零问题、背包问题、任务调度问题、活动选择问题、Prim算法

文章目录 贪心法找零问题(change-making problem)贪心算法要求基本思想适合求解问题的特征 背包问题0/1背包问题0/1背包问题——贪心法 分数背包问题 任务调度问题活动选择问题活动选择——贪心法最早结束时间优先——最优性证明 Prim算法 贪心法 我在当…

【Electron将HTML项目打包成桌面应用exe文件】

目标:前端将静态页面文件夹所有页面打包成一个exe文件(不包含其它文件)可运行。 步骤 1、初始化 npm init此时项目多出一个package.json文件。 {"name": "my-electron-app","version": "1.0.0",…

前端面试中Vue的有经典面试题二

7. Vue中给data中的对象属性添加一个新的属性时会发生什么,如何解决? 示例: 点击button会发现, obj.b 已经成功添加,但是视图并未刷新: 原因在于在Vue实例创建时, obj.b 并未声明,因…

【多线程案例】单例模式(懒汉模式和饿汉模式)

文章目录 1. 什么是单例模式?2. 立即加载/“饿汉模式”3. 延时加载/“懒汉模式”3.1 第一版3.2 第二版3.3 第三版3.4 第四版 1. 什么是单例模式? 提起单例模式,就必须介绍设计模式,而设计模式就是在软件设计中,针对特殊…

无涯教程-JavaScript - HYPGEOMDIST函数

HYPGEOMDIST函数替代Excel 2010中的HYPGEOM.DIST函数。 描述 该函数返回超几何分布。 HYPGEOMDIST返回给定样本数量,给定样本数量,总体成功率和总体数量的概率。 将HYPGEOMDIST用于具有有限总体的问题,其中每个观察输出都是成功或失败,并且给定大小的每个子集的选择可能性均…

《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存

《数字图像处理-OpenCV/Python》连载(4)图像的读取与保存 本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为了方…

小兔鲜商02

npm i vueuse/core -fvue插件使用: 许多公用的全局组件,,可以通过插件注册进去,就不用一个一个导入组件,, import XtxSkeleton from /components/library/xtx-skeletonexport default {install (app) {// …

ELK高级搜索(三)

文章目录 11.索引Index入门11.1 索引管理11.2 定制分词器11.3 type底层结构11.4 定制dynamic mapping11.5 零停机重建索引 12.中文分词器 IK分词器12.1 Ik分词器安装使用12.2 ik配置文件12.3 使用mysql热更新 13.java api 实现索引管理14&…

Spring源码解析-总览

1、前言 Spring源码一直贯穿我们Java的开发中,只要你是一个Java开发人员就一定知道Spring全家桶。Spring全家桶为我们一共一站式服务,IOC、AOP更是Spring显著特性。但是Spring到底怎么为我们提供容器,管理资源的呢?下来&#xff0…

1.4状态机模型

状态机简介: 1.大盗阿福 阿福是一名经验丰富的大盗。趁着月黑风高,阿福打算今晚洗劫一条街上的店铺。 这条街上一共有 N N N家店铺,每家店中都有一些现金。 阿福事先调查得知,只有当他同时洗劫了两家相邻的店铺时&#xff0…

js对中文进行base64编码和解码操作,解决中文乱码问题

我使用github api的接口获取文件内容,然后使用atob进行解码,但是发现:乱码.......糟心啊 所以就有了我封装的方法: export const encode64 (str) > {// 首先,我们使用 encodeURIComponent 来获得百分比编码的UTF…

m1芯片macOS系统卡顿问题解决方法

m1芯片的MacBook在使用过程中会出现“假死”的情况。主要表现为鼠标转圈圈,很多操作都不能实现,不能输入文本,系统ui也响应十分慢,而资源监视却看不到很高的占用。一般出现此类情况只能关机或重启。这其中的"罪魁祸首"便…