点灯案例优化(三)宏定义特定位名称

news2024/9/20 23:04:07

前面利用位运算对代码进行二次优化以后,确实可读性更好,精确性更高了。但是吧,你乍一看这个代码

你可能一下都反应不过来这些的啥意思了,表达式右边上来就是一顿运算,可能刚开始大多数人都看不懂这写的什么,因此在这块我们还可以再次优化一下。如同一次优化那块,我们利用宏定义让寄存器地址的查找更加清楚,可读性更高了,那么寄存器中数据特定位是不是也有宏定义呢?

确实是有的,同样也在之前的那个stm32f10x.h头文件中。然后宏定义的就是我们这些要自己根据技术手册来确定的数值。大家可以自行在头文件中使用ctrl+F用查找功能去查看,操作方式与一次优化时我们探索宏定义文件方法类似。点击代码优化(一)宏定义寄存器名称可以直接进入。

下面我们直接利用代码联想功能直接试试看

那么我们继续输入我们这个寄存器名称,发现下面出现IOPAEN等,实际上这就是对应该寄存器控制的GPIO时钟的特定位了。

我们直接替换

 接着,我们继续替换其他表达式

 这里,因为GPIO端口配置寄存器中每一个端口的数据位都是类似的,所以在定义特定位的宏时直接用GPIO打头了

其次,这里CNF0表示了它里面的两个位,其中也可以利用CNF0_0 _1去单独修改这两位

这里,我们看一下手册,避免不记得了

由此就可以看见, CNFx和MODEx构成的(x=0,1,...,),其中x就表示了端口位PA0,1...,且一个包括两个特定位,我们修改的就是这两部分。

由于我们点亮第一个灯是让CNF0变成00,MODE0变成11,所以我们继续替换修改代码

然后就是设置端口高低电平的部分

同理去修改

 在这里,我们看见显示出了很多端口对应的特定位的宏定义,最后的数字0,1...就是代表PA0等,所以我们直接选择PA0,即ODR0

 修改完了,现在展示一下完整代码

 现在,我们测试一下,看有没有问题

很明显,没有错误

现在直接运行,然后下载程序,很明显,可以运行成功,灯亮了

利用宏定义,将我们进行位运算要用的值利用特定位对应的宏进行替换即可,其他运算符都不用做改变。

根据这个原理,我们也可以顺势将其他灯也点亮,代码也简洁了不少,可读性也提高了。这也是我们今后写代码最常用的格式,到目前为止,我们才算刚刚入门

最后,经过这三次代码的优化,我们逐渐掌握了stm32开发的代码编写风格,认识到了一些寄存器并进行了几次技术手册的翻阅,王后将继续深入学习GPIO相关知识。加油 

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

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

相关文章

用Python解决优化问题_模拟退火模板

一、模拟退火算法简介 模拟退火(Simulated Annealing)是一种启发式算法,用于在优化问题中找到一个好的解。启发式是指一种用于找到解决问题方法的原则或策略,它不保证找到最优解,但可以快速找到一个足够好的解。在许多…

资产全生命周期管理系统 固定资产全生命周期管理解决方案

什么是资产全生命周期管理系统 资产全生命周期管理系统是指对企业资产从采购、使用、维护、到报废的整个过程进行全方位管理的软件系统。通过这个系统,企业可以实现对资产的实时监控和管理,确保资产的利用率最大化。这个系统不仅能够跟踪资产的状态&…

C语言 数据存储

整形在内存中的存储(之前的操作符讲过些许但不是很全,现在详细记录) 对于一个整型变量来说,在内存中需要怎样存储? 之前了解到内存中存放的是补码(正数的原反补都相同。回忆一下负数原码,反码…

IPD开发流程:项目风险画像

目录 1、内容简介 2、IPD 工具:项目风险画像 首先是独特性。 第二个是不确定性。 第三个是临时性。 第四个是跨职能性。 最后一个是变革性。 作者简介 1、内容简介 在 IPD 开发流程中, 经常会提到开发是一项投资行为、 产品/项目的商业价值等…

精细化管理和智慧化运营的智慧油站开源了

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用…

【数据分享】2018-2023年全国范围10米分辨率的耕地利用强度数据(免费获取)

耕地利用强度数据是评估农业生产力、规划土地使用、监测粮食安全与环境可持续性的关键,对政策制定和资源管理具有重要指导意义。然而,目前国家范围的耕地利用数据集在时空连续性、分辨率和精度方面存在局限性。 本次我们分享的是2018年至2023年分辨率为…

Rocky 8.10安装流程步骤详细教程

Rocky 8.10安装流程步骤详细教程 1. Rocky 8.10 安装2. 登录3. 配置修改3.1 打开命令行窗口3.2 网卡配置3.3 修改网卡名3.4 配置镜像源3.5 删除网卡多余内容3.5.1 删除virbr03.5.2 删除altname enp3s03.5.3 删除ipv63.5.4 修改ip地址(这步没有需要可以忽略) 3.6 升级openssh3.7…

【文献阅读】Lorentzian Linear Graph Convolutional Networks For Node Classification

Abstract 大多数现有的线性GCN模型在欧几里得空间中执行神经网络操作,并未明确捕捉到真实世界数据集中以图形式建模的树状层次结构。本文尝试将双曲空间引入线性GCN,并提出了一种新的洛伦兹线性GCN框架。 具体而言,将图节点的学习特征映射到…

函数作为返回值

复习闭包时注意到的 function lazy_sum(arr) {let sum function () {return arr.reduce(function (x, y) {return x y;});}return sum; }当我们调用lazy_sum()时,返回的并不是求和结果,而是求和函数: let f lazy_sum([1, 2, 3, 4, 5]); …

uniapp在线视频监控开发

我这里是uniapp开发的H5项目 视频流是flv模式 用到的插件是flv.js Flv.js Flv.js 是 HTML5 Flash 视频(FLV)播放器,纯原生 JavaScript 开发,没有用到 Flash。。由 bilibili 网站开源。 常见直播协议 RTMP: 底层基于TCP&…

【WebSocket】websocket学习【一】

1.消息推送常见方式 轮询长轮询SSEwebsocket 1.1. 轮询方式 轮询:浏览器以指定的时间间隔向服务器发出HTTP请求,服务器实时返回数据给浏览器长轮询:浏览器发出HTTP请求,服务器端接收到请求后,会阻塞请求直到有数据或…

[003].第4节:RabbitMQ环境搭建

我的后端学习大纲 RabbitMQ学习大纲 1.rpm包方式搭建: 1.1.搭建RabbitMQ单体架构: 1.MQ下载地址2.这里是提前下载好后上传安装包到服务器得opt目录下: 3.安装MQ需要先有Erlang语言环境,安装文件的Linux命令(分别按照以下顺序安装…

RabbitMQ发布订阅模式Publish/Subscribe详解

订阅模式Publish/Subscribe 基于API的方式1.使用AmqpAdmin定制消息发送组件2.消息发送者发送消息3.消息消费者接收消息 基于配置类的方式基于注解的方式总结 SpringBoot整合RabbitMQ中间件实现消息服务,主要围绕3个部分的工作进行展开:定制中间件、消息发…

网络硬盘录像机NVR程序源码NVR全套运用方案

在当今社会,随着科技的飞速发展和人们对安全需求的日益增长,安防监控系统已成为保障公共安全、维护社会稳定的重要手段。其中,网络视频录像机(NVR)作为安防监控系统的核心设备,其智能化升级运用方案对于提高…

OpenLayers3, 加载鹰眼控件

文章目录 一、前言二、代码实现三、总结 一、前言 鹰眼图即地图显示范围的缩略图,可显示当前地图窗口在整幅地图中的位置。通过拖动鹰眼图对话框中的矩形框可改变当前地图的显示区域范围,是地图浏览中常用的功能之一。 本案例使用OpenLayers3框架&…

数字虚拟人原理

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…

振兴杯全国青年职业技能大赛信息通信网络线务员解决方案

一、引言 随着数字化时代的到来,信息技术的飞速发展正深刻改变着人们的生活与工作方式。智能楼宇作为这一时代的产物,以其提升生活和工作效率、改善居住和办公环境的特点,受到了广泛关注。智能安防作为智能楼宇的重要组成部分,其…

解决flutter运行项目后报错 java.util.zip.ZipException: zip END header not found

全新项目运行后直接报错 java.util.zip.ZipException: zip END header not found网上找了其他案例试了没有效果 根据官网说法,针对不同机型处理 我的是windows,然后按照图片说明的目录删除了文件夹之后重新运行项目了 注意.gradle文件夹是隐藏的&…

分析 Runtime.getRuntime() 执行阻塞原因

1、起因 线上系统通过 git 命令执行的方式获取远程仓库分支,一直运行正常的接口,突然出现超时,接口无法响应,分析验证发现只有个别仓库获取分支会出现这种情况,其他都还是可以正常获取到分支结果信息。 2、分析异常原…

音频分割怎么弄?手把手教会你实用的音频分割技巧

在巴黎的浪漫街头,打卡地标的方式已经达到了next level!而今,想让这份记忆更加生动,不再只有照片与视频,更有音频的加入~ 想象一下,倘若用音频分割免费版工具来为这份旅行日志添上独一无二的音符&#xff…