当前位置: 首页 > news >正文

rt_thread hc32f460引脚编号

代码中经常看到配置引脚时,用的是一个数字,比如BSP_I2C1_SCL_PIN = 4、BSP_I2C1_SDA_PIN = 5,我们来探讨一下,这个数字是什么意思,代表着硬件上哪个接口,以及如何实现的通过数字来表示硬件引脚。

#define __HC_PORT(port)                 Port##port
#define GET_PIN(PORT, PIN)              (((rt_uint16_t)__HC_PORT(PORT) * 16) + PIN)

这两个宏定义是 RT-Thread 在 HC32 系列单片机上用于标准化引脚编号的核心逻辑,目的是将 “端口 + 引脚号” 的物理引脚标识转换为唯一的数字编号(方便代码中统一管理引脚)。

1. __HC_PORT(port) 宏:拼接端口枚举名

作用:将输入的port参数与字符串Port拼接,生成 HC32 单片机引脚端口的枚举变量名。
原理:利用 C 语言的 “宏字符串拼接”(##为连接符),将传入的端口代号(如A、B)转换为芯片定义的端口枚举名。

// 当传入 port = A 时
__HC_PORT(A) → PortA  // 等价于HC32芯片中定义的端口A枚举(如 PortA、PortB)

HC32 系列单片机的端口通常以PortA、PortB、PortC… 定义(硬件寄存器对应的枚举),这个宏的作用是自动生成对应端口的枚举名,避免手动输入拼写错误。
/**

2.PortA----PortH代表的数字

 ********************************************************************************* \brief GPIO Port Index enumeration******************************************************************************/
typedef enum en_port
{PortA = 0,                          ///< port group APortB = 1,                          ///< port group BPortC = 2,                          ///< port group CPortD = 3,                          ///< port group DPortE = 4,                          ///< port group EPortH = 5,                          ///< port group H
}en_port_t;

3.GET_PIN(PORT, PIN) 宏:生成唯一引脚编号

作用:将 “端口(PORT)” 和 “引脚号(PIN)” 转换为一个唯一的整数编号,用于在 RT-Thread 中统一标识引脚。
计算逻辑:(端口枚举值 × 16) + 引脚号
因为 HC32 系列单片机的每个端口(如 PortA)最多包含 16 个引脚(编号 0~15),所以用 “端口 ×16” 作为基础偏移,再加上引脚号,即可确保每个引脚的编号唯一。

结合使用:从物理引脚到数字编号

在实际使用中,这两个宏通常配合使用,通过 “端口 + 引脚号” 生成唯一编号。例如:

场景:若 I2C1 的 SCL 引脚接在PortA的4号引脚(物理引脚 PA4),SDA 接在PortA的5号引脚(PA5),则:


// 定义引脚(PORT=A,PIN=4 和 5)
#define BSP_I2C1_SCL_PIN  GET_PIN(A, 4)  // 计算:PortA × 16 + 4
#define BSP_I2C1_SDA_PIN  GET_PIN(A, 5)  // 计算:PortA × 16 + 5

背后的数值转换:
HC32 芯片中定义PortA=0、PortB=1(枚举值),则:

GET_PIN(A, 4)(0 × 16) + 4 = 4
GET_PIN(A, 5)(0 × 16) + 5 = 5

为什么需要这种转换?

**统一管理:**RT-Thread 的设备驱动(如 I2C、GPIO)需要用一个整数标识引脚,避免直接操作硬件枚举(硬件相关),提高代码可移植性。
**唯一性:**每个引脚(如 PA4、PB5)通过 “端口 ×16 + 引脚号” 计算后,得到的编号绝对唯一,不会冲突。
**简化代码:**通过宏自动计算,避免手动写死引脚编号,后续若修改引脚(如从 PA4 改为 PB4),只需修改GET_PIN的参数即可。

总结

__HC_PORT(port):将端口代号(如 A)转换为芯片端口枚举(如 PortA)。
GET_PIN(PORT, PIN):通过 “端口 ×16 + 引脚号” 生成唯一引脚编号,用于 RT-Thread 中标识引脚。

例如:BSP_I2C1_SCL_PIN = 4、BSP_I2C1_SDA_PIN = 5,本质是通过GET_PIN(A, 4)和GET_PIN(A, 5)计算得到的结果,对应硬件上的PortA的4号引脚(PA4)和PortA的5号引脚(PA5)。

http://www.dtcms.com/a/285388.html

相关文章:

  • 利用steps()分步实现奔跑的小熊案例
  • 『 C++ 入门到放弃 』- set 和 map 容器
  • 【机器学习深度学习】什么是 GGUF?
  • 【QT】调用外部dll
  • QT窗口(4)-浮动窗口
  • Qt窗口(2)-工具栏
  • 【嵌入式硬件实例】-555定时器实现LED追逐效果
  • Python的界面美化库 qt-material
  • 【机器学习】安装Jupyter及基本操作
  • Android如何使用Linux Quota管控app对userdata分区的磁盘空间使用
  • QT聊天项目DAY15
  • 数据结构入门:像整理收纳一样简单!
  • 【git仓库搭建笔记】
  • 二、Dify 版本升级教程(LInux-openeuler)
  • react/vue vite ts项目中,自动引入路由文件、 import.meta.glob动态引入路由 无需手动引入
  • cartorgapher的编译与运行
  • 需要保存至服务器的:常见编辑、发布文章页面基础技巧
  • Machine Learning HW2 report:语音辨识(Hongyi Lee)
  • 如何防止GitHub上的敏感信息被泄漏?
  • Jenkins+Docker+Git实现自动化CI/CD
  • 大带宽服务器都有哪些应用场景?
  • 群晖中相册管理 immich大模型的使用
  • Honeywell霍尼韦尔DV-10 变速器放大器 输入 15-28 VDC,输出 +/- 10VDC 060-6881-02
  • 【HCI log】Google Pixel 手机抓取hci log
  • HTTP 性能优化:五条建议
  • 构建智能客服Agent:从需求分析到生产部署
  • UGUI 性能优化系列:第二篇——Canvas 与 UI 元素管理
  • 如何选择旅游科技行业云ERP?Oracle NetSuite助力汇智国际数智化升级
  • Oracle 19C 后台主要进程的功能解析
  • (LeetCode 面试经典 150 题 ) 242. 有效的字母异位词 (哈希表)