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

萌新的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.rhkb.cn/news/121641.html

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

相关文章

MySQL之事务与引擎

目录 一、事物 1、事务的概念 2、事务的ACID特点 3、事务之间的相互影响 4、Mysql及事务隔离级别(四种) 1、查询会话事务隔离级别 2、查询会话事务隔离级别 3、设置全局事务隔离级别 4、设置会话事务隔离级别 5、事务控制语句 6、演示 1、测试提交事务 2、测试事务回滚 4…

Linux(基础IO)

Linux(基础IO) 前言C语言文件IO什么叫当前路径stdin/stdout/stderr 系统文件IOopenclosewriteread 文件描述符文件描述符的分配规则 重定向输出重定向原理追加重定向原理输入重定向原理dup2添加重定向功能到minishell 缓冲区模拟实现一个缓冲区 理解文件…

python webdriver 测试框架数据驱动json文件驱动的方式

简介: 数据驱动excel驱动方式,就是数据配置在excel里面,主程序调用的时候每次用从excel里取出的数据作为参数,进行操作, 需要掌握的地方是对excel的操作,要灵活的找到目标数据 测试数据.xlsx: 路径-D:\test\0627 E…

手写Mybatis:第15章-返回Insert操作自增索引值

文章目录 一、目标:Insert自增索引值二、设计:Insert自增索引值三、实现:Insert自增索引值3.1 工程结构3.2 Insert自增索引值类图3.3 修改执行器3.3.1 修改执行器接口3.3.2 抽象执行器基类 3.4 键值生成器3.4.1 键值生成器接口3.4.2 不用键值…

Milvus以及Web UI 安装

向量数据库懂的都懂 版本数据 [rootiZ7xv7q4im4c48qen2do2bZ project]# cat /etc/redhat-release CentOS Stream release 9 [rootiZ7xv7q4im4c48qen2do2bZ project]# docker version Client: Docker Engine - CommunityVersion: 24.0.5API version: 1.43Go v…

qt文件操作

对话框练习 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//字体按钮 void Widget::on_ztbtn_clicked() {//调用QFontDia…

《C++ Primer》第2章 变量(一)

参考资料: 《C Primer》第5版《C Primer 习题集》第5版 2.1 基本内置类型(P30) C 定义的基本类型包括算术类型(arithmetic type)和空类型(void),其中算术类型包括字符、整型、布尔…

python实现对excel表中的某列数据进行排序

如下需要对webCms中的B列数据进行升序排序,且不能影响到其他列、工作表中的数据和格式。 import pandas as pd import openpyxl from openpyxl.utils.dataframe import dataframe_to_rows# 读取 Excel 文件 file_path 1.xlsx sheet_name webCms# 读取 Excel 文件并…

Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法

不论搭建什么工程,运行什么文件,只要在Pycharm中出现ImportError: DLL load failed: 找不到指定的模块这样的问题,以下方法都适用!!! 一、问题描述 我在使用pycharm连接webots,用python控制机…

ToBeWritten之威胁狩猎

也许每个人出生的时候都以为这世界都是为他一个人而存在的,当他发现自己错的时候,他便开始长大 少走了弯路,也就错过了风景,无论如何,感谢经历 转移发布平台通知:将不再在CSDN博客发布新文章,敬…

机器人中的数值优化(十一)——高斯牛顿法、LMF方法、Dogleg方法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…

三相三线电表和三相四线电表有什么区别

三相三线电表和三相四线电表是两种常见的电能计量仪表,它们在结构、接线方式和使用范围上有所不同。本文将从以下几个方面详细介绍两者之间的区别。 一、结构上的区别 1.三相三线电表:三相三线电表主要由电压线圈、电流线圈、转子、铝盘和外壳等部分组成…

lv3 嵌入式开发-2 linux软件包管理

目录 1 软件包管理 1.1流行的软件包管理机制 1.2软件包的类型 1.3软件包的命名 2 在线软件包管理 2.1APT工作原理 2.2更新软件源 2.3APT相关命令 3 离线软件包管理 1 软件包管理 1.1流行的软件包管理机制 Debian Linux首先提出“软件包”的管理机制---Deb软件包 …

Linux设备驱动程序

一、设备驱动程序简介 图1.1 内核功能的划分 可装载模块 Linux有一个很好的特性:内核提供的特性可在运行时进行扩展。这意味着当系统启动 并运行时,我们可以向内核添加功能( 当然也可以移除功能)。 可在运行时添加到内核中的代码被称为“模块”。Linux内核支持好几…

Linux服务器部署JavaWeb后端项目

适用于:MVVM前后台分离开发、部署、域名配置 前端:Vue 后端:Spring Boot 这篇文章只讲后端部署,前端部署戳这里 目录 Step1:服务器上搭建后端所需环境1、更新服务器软件包2、安装JDK83、安装MySQL4、登录MySQL5、修…

基于FPGA的信号发生器(三角波、方波、正弦波)

目录 DDS实现原理 DDS整体设计框图​ Quartus II 仿真​ modelsim仿真 顶层代码 DDS实现原理 DDS(Direct Digital Frequency Synthesizer)直接数字频率合成器,也可叫DDFS。 DDS是从相位的概念直接合成所需波形的一种频率合成技术。 不仅可以产生不同频率的正弦波,而且可…

Java8实战-总结18

Java8实战-总结18 使用流筛选和切片用谓词筛选筛选各异的元素截短流跳过元素 使用流 流让你从外部迭代转向内部迭代。这样&#xff0c;就用不着写下面这样的代码来显式地管理数据集合的迭代(外部迭代)了&#xff1a; List<Dish> vegetarianDishes new ArrayList<>…

ArcGIS美化科研论文地图(利用在线底图)

1.加载在线底图服务 在ArcGIS Desktop中打开Catalog窗口&#xff0c;在GIS Servers中点击Add ArcGIS Server&#xff0c;之后选项全部默认&#xff0c;仅在URL中输入以下网址https://services.arcgisonline.com/arcgis 之后就可以看到底图了 我们在WorldElevation3D中选择Nat…

16-MyCat

一 Mycat概述 1 什么是Mycat 什么是Mycat Mycat是数据库中间件&#xff0c;所谓数据库中间件是连接Java应用程序和数据库中间的软件。 为什么要用Mycat 遇到问题&#xff1a; Java与数据库的紧耦合高访问量高并发对数据库的压力读写请求数据不一致 2 Mycat与其他中间件区别 目…

QT创建可移动点类

效果如图所示&#xff1a; 创建新类MovablePoint&#xff0c;继承自QWidget. MovablePoint头文件: #ifndef MOVABLEPOINT_H #define MOVABLEPOINT_H#include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QStyleOption> #includ…