Arduino中引脚的数字与真实引脚的对应关系

我们使用arduino开发时,最长遇到的是对端口管脚的拉高拉低,代码如下


void setup() {pinMode(13,OUTPUT);
}void loop() {digitalWrite(13,HIGH);
}

上面还最简单io控制代码,其中引脚我们使用了数字13,但是这个13对应着哪个引脚呢?我们一般会有开发板的示意图

上面的Dx就对应着引脚数字。这个还好理解。

但是当我们使用STM32开发板时候怎么对应呢?我们知道STM32不是简单的GPIO+数字的方式,而是还有ABCDE等,这样我们就不能简单的认为1对应GPIO1了。

下面我们根据源码分析一下这个数字是如何转为引脚地址的。

ESP8266

esp8266的简单

在3.1.2\cores\esp8266\core_esp8266_wiring_digital.cpp文件中有定义

volatile uint32_t* const esp8266_gpioToFn[16] PROGMEM = { &GPF0, &GPF1, &GPF2, &GPF3, &GPF4, &GPF5, &GPF6, &GPF7, &GPF8, &GPF9, &GPF10, &GPF11, &GPF12, &GPF13, &GPF14, &GPF15 };

这里的GPFx就是真正的引脚地址,非常规律的从0到15,就好像特意为arduino设计的一样。

STM32

stm32就是我说的无法一一对应的问题了,我们先来跟踪代码,在pinMode函数中有一个转换的函数

void pinMode(uint32_t ulPin, uint32_t ulMode)
{PinName p = digitalPinToPinName(ulPin);

这一行就是引脚转换的函数,继续跟踪到2.7.1\cores\arduino\pins_arduino.h文件

#define digitalPinToPinName(p)      ((((uint32_t)(p) & PNUM_MASK) < NUM_DIGITAL_PINS) ? \(PinName)(digitalPin[(uint32_t)(p) & PNUM_MASK] | ((p) & ALTX_MASK)) : NC)

这里实际上是将引脚的数字p当做了digitalPin数组的角标,那么我们就需要知道数组的内容就知道引脚数字和引脚地址的对应关系了。

这个数组有很多个,因为stm32有很多系列,每个系列的不同封装可能包含的引脚都不一样,所以对于每个系列的每个封装都要进行各自的定义。我们以F103R系列为例,看一下数组的定义

在文件2.7.1\variants\STM32F1xx\F103R(C-D-E)T\variant_generic.cpp

// Digital PinName array
const PinName digitalPin[] = {PA_0,   // D0/A0PA_1,   // D1/A1PA_2,   // D2/A2PA_3,   // D3/A3PA_4,   // D4/A4PA_5,   // D5/A5PA_6,   // D6/A6PA_7,   // D7/A7PA_8,   // D8PA_9,   // D9PA_10,  // D10PA_11,  // D11PA_12,  // D12PA_13,  // D13PA_14,  // D14PA_15,  // D15PB_0,   // D16/A8PB_1,   // D17/A9PB_2,   // D18PB_3,   // D19PB_4,   // D20PB_5,   // D21PB_6,   // D22PB_7,   // D23PB_8,   // D24PB_9,   // D25PB_10,  // D26PB_11,  // D27PB_12,  // D28PB_13,  // D29PB_14,  // D30PB_15,  // D31PC_0,   // D32/A10PC_1,   // D33/A11PC_2,   // D34/A12PC_3,   // D35/A13PC_4,   // D36/A14PC_5,   // D37/A15PC_6,   // D38PC_7,   // D39PC_8,   // D40PC_9,   // D41PC_10,  // D42PC_11,  // D43PC_12,  // D44PC_13,  // D45PC_14,  // D46PC_15,  // D47PD_0,   // D48PD_1,   // D49PD_2    // D50
};

如此可以看出每个引脚数字对应的引脚是什么了,例如我们使用digitalWrite(0,HIGH);实际上就是将GPIOA0引脚拉高了。

ESP32

在esp32中我们使用和ESP8266相似的方式

这里的GPIOx就对应这引脚数字。

我们同样在代码中找到相似的转换的地方,我们发现这个单片机设置引脚的方式已经被封装在了ESP-IDF(Espressif IoT Development Framework)中。引脚数字 pinNumber,然后将其转换为 gpio_num_t 类型的 GPIO 矩阵索引 gpioPin。最后,使用 gpio_config 函数来配置该引脚的模式。也就是说我们需要找到gpio_num_t 类型的定义,就可以找到引脚的对应关系。

在2.0.11\tools\sdk\esp32c3\include\hal\include\hal\gpio_types.h文件中

#if CONFIG_IDF_TARGET_ESP32
typedef enum {GPIO_NUM_NC = -1,    /*!< Use to signal not connected to S/W */GPIO_NUM_0 = 0,     /*!< GPIO0, input and output */GPIO_NUM_1 = 1,     /*!< GPIO1, input and output */GPIO_NUM_2 = 2,     /*!< GPIO2, input and output */GPIO_NUM_3 = 3,     /*!< GPIO3, input and output */GPIO_NUM_4 = 4,     /*!< GPIO4, input and output */GPIO_NUM_5 = 5,     /*!< GPIO5, input and output */GPIO_NUM_6 = 6,     /*!< GPIO6, input and output */GPIO_NUM_7 = 7,     /*!< GPIO7, input and output */GPIO_NUM_8 = 8,     /*!< GPIO8, input and output */GPIO_NUM_9 = 9,     /*!< GPIO9, input and output */GPIO_NUM_10 = 10,   /*!< GPIO10, input and output */GPIO_NUM_11 = 11,   /*!< GPIO11, input and output */GPIO_NUM_12 = 12,   /*!< GPIO12, input and output */GPIO_NUM_13 = 13,   /*!< GPIO13, input and output */GPIO_NUM_14 = 14,   /*!< GPIO14, input and output */GPIO_NUM_15 = 15,   /*!< GPIO15, input and output */GPIO_NUM_16 = 16,   /*!< GPIO16, input and output */GPIO_NUM_17 = 17,   /*!< GPIO17, input and output */GPIO_NUM_18 = 18,   /*!< GPIO18, input and output */GPIO_NUM_19 = 19,   /*!< GPIO19, input and output */GPIO_NUM_20 = 20,   /*!< GPIO20, input and output */GPIO_NUM_21 = 21,   /*!< GPIO21, input and output */GPIO_NUM_22 = 22,   /*!< GPIO22, input and output */GPIO_NUM_23 = 23,   /*!< GPIO23, input and output */GPIO_NUM_25 = 25,   /*!< GPIO25, input and output */GPIO_NUM_26 = 26,   /*!< GPIO26, input and output */GPIO_NUM_27 = 27,   /*!< GPIO27, input and output */GPIO_NUM_28 = 28,   /*!< GPIO28, input and output */GPIO_NUM_29 = 29,   /*!< GPIO29, input and output */GPIO_NUM_30 = 30,   /*!< GPIO30, input and output */GPIO_NUM_31 = 31,   /*!< GPIO31, input and output */GPIO_NUM_32 = 32,   /*!< GPIO32, input and output */GPIO_NUM_33 = 33,   /*!< GPIO33, input and output */GPIO_NUM_34 = 34,   /*!< GPIO34, input mode only */GPIO_NUM_35 = 35,   /*!< GPIO35, input mode only */GPIO_NUM_36 = 36,   /*!< GPIO36, input mode only */GPIO_NUM_37 = 37,   /*!< GPIO37, input mode only */GPIO_NUM_38 = 38,   /*!< GPIO38, input mode only */GPIO_NUM_39 = 39,   /*!< GPIO39, input mode only */GPIO_NUM_MAX,
/** @endcond */
} gpio_num_t;

如此一看,esp32更像是为了arduino的使用方式设计的了。

只有STM32需要去找到每个的对应关系。

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

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

相关文章

老壁灯带你入门动态规划

1. 什么是动态规划 动态规划(dynamic programming)是运筹学的一个分支&#xff0c;是求解决策过程(decision process)最优化的数学方法。 从字面意义上来理解&#xff0c;就是走一步看一步&#xff0c;边解决问题&#xff0c;边对问题进行整体规划。 其实&#xff0c;动态规…

【Python】定时更换clashx工具

An empty street An empty house A hole inside my heart I’m all alone The rooms are getting smaller I wonder how I wonder why I wonder where they are The days we had The songs we sang together Oh yeah And oh, my love I’m holding on forever Reaching for a l…

RoCE v2中UDP的源端口和目的端口

0 前言 RoCE v2协议中RDMA的数据都是通过UDP来传输的,按照RoCE v2协议规范,UDP的目的端口是固定的(des port = 4791),但是UDP源端口的确定是由RDMA驱动使用hash来算出来的。不同的QP建链方式以及QP的类型采用具体的计算方法不同。其中源端口的范围是49152-65535 (十六进…

SqlServer(3)SqlServer经典总结大全-数据库同步-基础知识整理-能力提升

三、SQLServer同步复制技术实现步骤&#xff0c;配上详细步骤和代码语句和输出 SQL Server的同步复制是一种确保数据在发布服务器和订阅服务器之间实时同步的技术。以下是同步复制的详细步骤&#xff0c;包括代码语句和可能的输出。 1. 准备工作 确保两台服务器&#xff08;…

【C语言】 操作符的详细知识点

文章目录 12 操作符&#x1f352;算术操作符&#x1f352;关系操作符&#x1f352;逻辑操作符&#x1f352;位操作符&#x1f352;赋值操作符&#x1f352;强制类型转换符&#x1f352;成员访问操作符:fire:操作符优先级计算大小符sizeof条件操作符 ? :const char *按位取反sn…

Mac上的Gatekeeper系统跟运行时保护

文章目录 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件。如何解决&#xff1f; 参考资料门禁运行时保护 问题&#xff1a;无法打开“xxx.xxx”&#xff0c;因为无法验证开发者。macOS无法验证此App是否包含恶意软件…

Leetcode - 2580. 统计将重叠区间合并成组的方案数

文章目录 思路AC CODE总结 题目链接&#xff1a;2580. 统计将重叠区间合并成组的方案数 思路 一个区间合并的板子&#xff0c;计算出区间数目之后&#xff0c;每个区间都有放左和放右两种选法&#xff0c;所以最后的答案就是 2 k 2^k 2k。但是需要用c进行二维数组的排序&…

深入浅出(四)VTK库—3D可视化

VAT库 1. VTK简介1.1 下载 2. 编译和安装&#xff1a;3. C示例3.1 显示立方体3.2 VTK显示3D点云 1. VTK简介 VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的跨平台的软件系统&#xff0c;用于3D计算机图形学、图像处理和可视化。它提供了丰富的功能和工具&…

【正点原子FreeRTOS学习笔记】————(4)FreeRTOS中断管理

这里写目录标题 一、什么是中断&#xff1f;&#xff08;了解&#xff09;二、中断优先级分组设置&#xff08;熟悉&#xff09;三、中断相关寄存器&#xff08;熟悉&#xff09;四、FreeRTOS中断管理实验&#xff08;掌握&#xff09; 一、什么是中断&#xff1f;&#xff08;…

深入理解C语言宏定义

目录 一、前言 二、宏的相关语法 2.1 #define 2.2 #undef 2.3 #运算符 2.4 ##运算符 三、宏替换的规则 四、宏与函数 一、前言 我们都知道#define语句可以定义常量&#xff0c;在编译器预处理时会全部将名字替换为常量。与此同时&#xff0c;#define也允许把参数替换到…

【八股】2024春招八股复习笔记3(测试、运维、安全、游戏、客户端)

【2023秋招-2024春招】八股系列&#xff0c;共8篇 【八股】2023秋招八股复习笔记1&#xff08;CSBase部分WXG题&#xff09;【八股】2023秋招八股复习笔记2&#xff08;C基础 & 操作系统&#xff09;【八股】2023秋招八股复习笔记3&#xff08;智力题 & 非技术题50道&…

开放大学2024年春《数控技术 060253》综合大作业参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1数控系统的核心是&#xff08; &#xff09; …

【项目管理——时间管理】【自用笔记】

1 项目时间管理&#xff08;进度管理&#xff09;概述 过程&#xff1a;&#xff08;2—6&#xff09;为规划过程组&#xff0c;7为监控过程组 题目定义&#xff1a;项目时间管理又称为进度管理&#xff0c;是指确保项目按时完成所需的过程。目标&#xff1a;时间管理的主要目标…

SQLAlchemy修改postgres表的jsonb字段失效

今天遇到一灵异事件&#xff0c;ORM更新操作&#xff0c;一字段始终不生效&#xff0c;最后发现问题原因是postgres的jsonb导致的 表结构&#xff1a; CREATE TABLE XX(value jsonb default {},...)ORM: from flask_sqlalchemy import SQLAlchemy from sqlalchemy.dialects.…

Rust GUI学习 小部件系列(一):如何在iced窗口中使用颜色选择器colorpicker

注&#xff1a;此文适合于对rust有一些了解的朋友 iced是一个跨平台的GUI库&#xff0c;用于为rust语言程序构建UI界面。 前言&#xff1a; 本系列是iced的小部件应用介绍系列&#xff0c;主要介绍iced、iced_aw两个库中涉及的各种小部件的使用及实例演示。 本文所介绍的是co…

安捷伦Agilent E5071B网络分析仪

181/2461/8938产品概述&#xff1a; Agilent E5071B 网络分析仪可为射频组件提供快速、准确的测量。与同类网络分析仪相比&#xff0c;其宽动态范围和低迹线噪声可实现更高的测试质量和吞吐量。内置 2、3 和 4 个测试端口可同时测量具有最多四个端口的组件的所有信号路径。Agi…

中国土壤厚度空间分布数据

土壤层次分为覆盖层 林溶层 淀积层 母质层&#xff0c;其中在林溶层中的最上面那层就是我们通常说的土壤厚度在这一层中&#xff0c;这一层也被称为腐殖层&#xff0c;是肥力性质最好的一层&#xff0c;植物根系和微生物也集中在这一层。至于覆盖层在森林土壤中比较常见&#x…

2024年【G3锅炉水处理】考试题及G3锅炉水处理考试报名

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G3锅炉水处理考试题参考答案及G3锅炉水处理考试试题解析是安全生产模拟考试一点通题库老师及G3锅炉水处理操作证已考过的学员汇总&#xff0c;相对有效帮助G3锅炉水处理考试报名学员顺利通过考试。 1、【多选题】锅筒…

ClickHouse 最全面试题及参考答案全解析

1. 请简述 ClickHouse 的核心特性及其适用场景 ClickHouse 是一个开源的列式数据库管理系统(DBMS),专为在线分析处理(OLAP)场景设计。其核心特性包括: 列式存储:数据按列存储,优化了分析查询的性能,因为只需读取查询中涉及的列。数据压缩:列式存储天然适合压缩,大幅…

记录一次Vcenter跨VDS网络迁移

纯文字叙述&#xff1a; 1、客户的网络需要迁移vds.但物理网卡已经分配给了其他的VDS。 2、操作思路&#xff1a; 1.先创建好新的VDS以及对应的旧VDS的业务端口组以及Vmker。 2.将Esxi主机加入到新的VDS&#xff0c;不选择物理网卡&#xff0c;只是加入。 3.在Esxi主机侧选中新…