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)。