GPIO端口引脚(位域)打包技巧笔记

1. 结构体定义:位域打包

c

复制代码
typedef struct
{
    uint8_t num:4,   /*!< 引脚号 (0~15) */
            port:4;  /*!< 端口号 (0~15) */
} gpio_port_pin_t;
  • 使用位域将两个4位信息压缩到一个字节中。
  • 内存布局:低位4位存放 num,高位4位存放 port(取决于编译器,通常如此)。
  • 结构体大小 = 1字节。

2. 典型用法:从 uint8_t 解析出端口和引脚

c

复制代码
void gpio_ana_func1_init(uint8_t pin)
{
    // 将 pin 的地址强制转换为结构体指针
    gpio_port_pin_t *x = (gpio_port_pin_t *)&pin;

    // 使用 x->port 和 x->num 访问对应字段
    SYSC_AWO->IO[x->port].AE |= 1 << (16 + x->num);
}

关键点:

  • &pin 取得变量 pin 的地址(uint8_t*)。
  • 强制转换为 gpio_port_pin_t*,将同一个字节重新解释为结构体。
  • 之后通过 x->port 和 x->num 即可获得编码时存入的高4位和低4位。

3. 调用约定

通常调用者将端口和引脚编码为一个字节:

c

复制代码
// 假设端口=2, 引脚=5 → 编码为 (2<<4) | 5 = 0x25
gpio_ana_func1_init(0x25);

函数内部通过上述转换自然拆解出 port=2, num=5。

4. 注意事项

  • 必须使用 **&**取地址 :(gpio_port_pin_t *)pin 是错误的,它会将 pin 的数值当作内存地址,导致非法访问。
  • 内存布局一致性:位域的内存分布可能因编译器而异,但在大多数嵌入式环境中此用法稳定。
  • 对齐安全 :uint8_t 与结构体大小均为1字节,对齐无问题。
  • 此技巧适用于函数内临时解析,不应用于长期存储或跨模块传递。

5. 优点

  • 代码简洁,无需手动移位和掩码。
  • 提高可读性,直接使用 x->port、x->num 表达意图。
相关推荐
离凌寒16 分钟前
一、基于stm32+freertos下LD2410D和R60ADB1两款雷达的使用效果
stm32·单片机·嵌入式硬件
国科安芯33 分钟前
商业光学遥感载荷焦平面供电链的低噪声稳压器研究综述——以国科安芯ASP7A84AS型3A低压差线性稳压器为器件级参照
大数据·网络·嵌入式硬件·平面·卫星·商业航天·抗辐射
NamoAmitabha1283 小时前
嵌入式开发中的定时器---deepseek
单片机·嵌入式硬件
福建佰胜张工3 小时前
深度解析 Allen-Bradley 150-B135NBDA 智能电机控制器:选型、参数与工业应用
运维·数据库·单片机·嵌入式硬件·安全·自动化
secondyoung3 小时前
Cortex-R52与TriCore详细对比
arm开发·单片机·嵌入式硬件·mcu
送外卖的工程师3 小时前
STM32仓库环境监测系统
stm32·单片机·嵌入式硬件
2501_922639584 小时前
率能半导体 SS6840单通道H桥驱动芯片:42V/7A,覆盖打印机、办公自动化、机器人、工业缝纫机四大应用场景
stm32·单片机·嵌入式硬件·硬件工程
天空'之城4 小时前
002基于 STM32 的智能灯光窗帘控制系统
stm32·单片机·毕业设计·智能家居·pwm
电子科技圈4 小时前
芯科科技2026年Tech Talks技术系列讲座再增添全新主题共探无线SoC架构演进与安全合规
科技·嵌入式硬件·mcu·物联网·安全·架构·iot
NYFEA4 小时前
跨协议桥接与高精度传感:我们的接口芯片如何连接物理世界?
嵌入式硬件