【【萌新的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.hqwc.cn/news/99166.html

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

相关文章

自学Python01-创建文件写入内容

此处省去安装和前言,需要两个东西 一个去下载安装python官方库 Welcome to Python.org 一个是编译器pycharm PyCharm 安装教程(Windows) | 菜鸟教程 PyCharm: the Python IDE for Professional Developers by JetBrains 第一节 练习print…

海域可视化监管:浅析海域动态远程视频智能监管平台的构建方案

一、方案背景 随着科技的不断进步,智慧海域管理平台已经成为海洋领域监管的一种重要工具。相比传统的视频监控方式,智慧海域管理平台通过建设近岸海域视频监控网、海洋环境监测网和海上目标探测网络等,可实现海洋管理的数字化转型。 传统的…

《人生苦短——我学Python》条件判断->双向选择(if--else)

今天我们来学习双向选择判断。顾名思义,双向就是两种选择选其一,即if----else。如果If的条件不成立,则执行else下的语句,否则执行if下面的语句。显然,它们是互斥的!下面就让我们来详细看看吧! 文…

springboot自定义表格(动态合并单元格)

一、需求展示&#xff08;一个订单多个商品&#xff0c;商品数量不限订单行合并&#xff09; 二、技术选型&#xff08;jxls自定义模板&#xff09; <!-- 版本具体看官网Release&#xff0c;这里我们使用 2.13.0 --><dependency><groupId>org.jxls</group…

【数学建模竞赛】数据预处理知识总结1——数据清洗

数据预处理是什么 在数学建模赛题中&#xff0c;官方给所有参赛选手的数据可能受到主观或客观条件的影响有一定的问题&#xff0c;如果不进行数据的处理而直接使用的话可能对最终的结果造成一定的影响&#xff0c;因此为了保证数据的真实性和建模结果的可靠性&#xff0c;需要…

day 47 | ● 392.判断子序列 ● 115.不同的子序列

392.判断子序列 如果用dp判断true or false无法满足&#xff0c;所以dp用来表示以下标i-1为结尾的字符串s&#xff0c;和以下标j-1为结尾的字符串t&#xff0c;相同子序列的长度 func isSubsequence(s string, t string) bool {dp : make([][]int, len(s) 1)for i : 0; i &…

Redis基本了解

Redis 基于内存进⾏存储&#xff0c;⽀持 key-value 的存储形式&#xff0c;底层是⽤ C 语⾔编写的。 基于 key-value 形式的数据字典&#xff0c;结构⾮常简单&#xff0c;没有数据表的概念&#xff0c;直接⽤键值对的形式完成数据的管理&#xff0c;Redis ⽀持 5 种数据类型…

8月《中国数据库行业分析报告》已发布,聚焦数据仓库、首发【全球数据仓库产业图谱】

为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况&#xff0c;从2022年4月起&#xff0c;墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》&#xff0c;持续传播数据技术知识、努力促进技术创新与行业生…

Ceph BlueStore 和双写问题

论开源分布式存储&#xff0c;Ceph大名鼎鼎。用同一个存储池融合提供块存储、对象存储、集群文件系统。在国内有近年使用量迅速攀升。 大型公司内部研发云虚拟化平台&#xff0c;常使用开源方案Openstack或者Kubernetes&#xff0c;配套的为虚机或容器提供块存储的开源方案&am…

Linux centos7 bash编程(循环与条件判断)

在编程训练中&#xff0c;循环结构与条件判断十分重要。 根据条件为真为假确定是否执行循环。 有时&#xff0c;根据条件的真假结果&#xff0c;决定执行哪些语句&#xff0c;这就是分支语句。 为了训练分支语句与循环语句&#xff0c;我们设计一个案例&#xff1a; 求一组…

编译OpenWrt内核驱动

编译OpenWrt内核驱动可以参考OpenWrt内部其它驱动的编写例程&#xff0c;来修改成自己需要的驱动 一、OpenWrt源代码获取与编译 1.1、搭建环境 下载OpenWrt的官方源码&#xff1a; git clone https://github.com/openwrt/openwrt.git1.2、安装编译依赖项 sudo apt update -…

计算机视觉主要任务

计算机视觉&#xff1a;使用计算机及相关设备对生物视觉的一种模拟。 主要包含6大任务&#xff0c;图像分类&#xff0c;目标检测&#xff0c;目标跟踪&#xff0c;语义分割&#xff0c;实例分割&#xff0c;影像重构。 图像分类&#xff1a;根据图像信息中所反映的不同特征&am…