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;动态规…

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进行二维数组的排序&…

【正点原子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年春《数控技术 060253》综合大作业参考答案

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

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

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

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、【多选题】锅筒…

vivado 在远程主机上启动作业、ISE命令图、实施类别,战略描述和指令映射

在远程主机上启动作业 一旦配置了远程主机&#xff0c;使用它们启动Vivado作业就很容易了。下图显示了启动运行对话框。启动跑步时&#xff0c;选择“在远程上启动跑步”hosts或Launch在群集上运行&#xff0c;然后选择特定的群集。这些作业将使用您的要执行的预配置设置。 作业…

Leetcode70. 爬楼梯(动态规划)

Leetcode原题 Leetcode70. 爬楼梯 标签 记忆化搜索 | 数学 | 动态规划 题目描述 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f;示例 1&#xff1a;输入&#xff1a;n 2 输出&#xff1a;2 解…

阿里云服务器安装MySQL(宝塔面板)

只写关键步骤 1. 创建一个云服务器实例 2 修改密码&#xff0c;登录服务器 3. 安装宝塔面板 进入https://www.bt.cn/new/index.html 进入宝塔面板地址 4. 安装Mysql 5. 创建数据库&#xff08;可导入数据库&#xff09; 6. 测试连接数据库 打开Navicat&#xff08;或其他数据…

centos安装jdk的坑

文章目录 一、安装jdk二、查找jdk的目录三、配置JAVA_HOME 一、安装jdk 我们一般用yum search java | grep jdk查询可以安装的jdk 但是一定要注意如下图&#xff0c;必须知道jdk和jre的区别 yum install java-1.8.0-openjdk-devel.x86_64二、查找jdk的目录 用如下命令 sudo…

chrome 浏览器报错 This page will not function without javascript enabled

This page will not function without javascript enabled. Please enable javascript on your browser. 在访问公司spark history 页面时&#xff0c;发现页面加载不全&#xff0c;并提示如上报错&#xff0c;因此按照如下步骤&#xff0c;已解决问题。 在浏览器中启用 JavaS…

OpenLayers6实战,OpenLayers绘制五角星,OpenLayers绘制特殊图形,地图上画五角星

专栏目录: OpenLayers实战进阶专栏目录 前言 本章讲解如何使用OpenLayers6在地图上绘制五角星这种特殊图形的功能。 本章上一章基础上修改而成:OpenLayers6实战,OpenLayers绘制特殊图形,OpenLayers绘制四角形(菱形),OpenLayers绘制菱形 二、依赖和使用 "ol&q…

【APP_TYC】数据采集案例天眼APP查_抓包分析_②

追寻啊 你身影千年 恳请宿命怜 无尽日夜 只为见你一面 我愿化作 窗外的桑花 朝朝暮暮 都有我牵挂 无论冬雪秋沙 海角天涯 缱绻不尽 念你啊 倘若化作 林间的桑花 借一暖风 赠你梦如画 纵使悲忧如雪 一笑融化 &#x1f3b5; Joysaaaa《朝朝如念》 抓包分析 …

.NET开源免费、功能强大的 Windows 截图录屏神器

前言 今天大姚给大家分享一款.NET开源免费&#xff08;基于GPL3.0开源协议&#xff09;、功能强大、简洁灵活的 Windows 截图、录屏、Gif动图制作神器&#xff1a;ShareX。 功能特性 ShareX 是一个开源的屏幕捕捉工具&#xff0c;具有丰富的功能特性&#xff0c;包括但不限于…