news 2025/12/25 16:52:11

C语言中union(共同体)的特电是什么?STM32中常用于处理什么数据?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言中union(共同体)的特电是什么?STM32中常用于处理什么数据?

C语言中union(共同体)的特点

1. 内存共享特性

union Data { int i; float f; char str[20]; }; // 所有成员共享同一块内存空间
  • 所有成员共享同一段内存

  • 大小为最大成员的大小

  • 同一时间只能存储一个成员的值

2. 典型特点

  • 内存覆盖:修改一个成员会影响其他成员

  • 节省内存:相比struct更节省空间

  • 类型转换:可实现不同类型数据的便捷转换

  • 大小端检测:可用于检测系统字节序

3. 示例演示

union Example { uint32_t word; uint8_t bytes[4]; struct { uint8_t b0, b1, b2, b3; }; }; // 使用示例 union Example data; data.word = 0x12345678; printf("Byte0: 0x%02X\n", data.bytes[0]); // 输出取决于字节序

STM32中union的典型应用

1. 寄存器位域操作

// GPIO寄存器位域访问 typedef union { struct { uint32_t MODER0 : 2; // 模式设置 uint32_t MODER1 : 2; uint32_t OTYPER0 : 1; // 输出类型 uint32_t OTYPER1 : 1; uint32_t OSPEEDR0 : 2; // 输出速度 // ... 其他位域 } bits; uint32_t reg; // 整个32位寄存器 } GPIO_TypeDef; // 使用示例 GPIO_TypeDef GPIOA; GPIOA.bits.MODER0 = 0x01; // 设置位域 uint32_t reg_val = GPIOA.reg; // 获取完整寄存器值

2. 数据包解析

// CAN报文数据结构 typedef union { struct { uint32_t id : 29; // 标准ID uint32_t rtr : 1; // 远程帧标志 uint32_t ide : 1; // IDE标志 uint32_t dlc : 4; // 数据长度 uint8_t data[8]; // 数据域 } frame; uint8_t raw[13]; // 原始字节数组 } CAN_Packet_t; // 网络协议解析 typedef union { struct { uint16_t source_port; uint16_t dest_port; uint16_t length; uint16_t checksum; } header; uint8_t bytes[8]; } UDP_Header_t;

3. 浮点数与字节数组转换

// 传感器数据处理 union FloatConverter { float value; uint8_t bytes[4]; }; // 使用示例 union FloatConverter sensor_data; // 从UART接收4字节数据 uart_receive(sensor_data.bytes, 4); float temperature = sensor_data.value; // 转换为浮点数

4. 多数据类型访问

// ADC数据访问 union ADC_Data { uint16_t raw_value; // 原始ADC值 struct { uint8_t low_byte; uint8_t high_byte; } bytes; float voltage; // 转换后的电压值 }; // 使用示例 union ADC_Data adc_result; adc_result.raw_value = ADC1->DR; // 读取ADC寄存器 uart_send(adc_result.bytes.low_byte); // 发送低字节 float vol = adc_result.raw_value * 3.3 / 4095; // 计算电压

5. 状态标志位管理

// 系统状态标志 union System_Status { struct { uint8_t sensor_ready : 1; uint8_t comm_ok : 1; uint8_t battery_low : 1; uint8_t fault_flag : 1; uint8_t reserved : 4; } flags; uint8_t status_byte; }; // 使用示例 union System_Status sys_status; sys_status.flags.sensor_ready = 1; if (sys_status.flags.fault_flag) { // 处理故障 }

6. 通信协议处理

// Modbus RTU协议 typedef union { struct { uint8_t address; uint8_t function_code; uint16_t register_addr; uint16_t data; uint16_t crc; } fields; uint8_t raw_frame[8]; } Modbus_Frame_t; // 使用示例 Modbus_Frame_t frame; uart_receive(frame.raw_frame, 8); if (frame.fields.address == 0x01) { // 处理地址为1的设备 }

使用注意事项

优点:

  1. 节省内存:特别适合内存受限的嵌入式系统

  2. 高效访问:可直接访问数据的各个部分

  3. 类型安全:提供结构化的数据访问方式

风险:

  1. 数据覆盖:不当使用会导致数据被意外覆盖

  2. 字节序问题:跨平台时需要注意大小端

  3. 可读性:过度使用可能降低代码可读性

最佳实践:

// 推荐做法:添加清晰的注释和类型定义 typedef union { struct { uint32_t mantissa : 23; uint32_t exponent : 8; uint32_t sign : 1; } ieee754; float fval; } IEEE754_Float __attribute__((packed)); // 确保紧凑存储

在STM32嵌入式开发中,union常用于:

  • 寄存器配置:位域操作

  • 通信协议:数据包解析

  • 数据转换:不同格式间的转换

  • 状态管理:标志位操作

  • 内存优化:节省有限的RAM资源

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/18 21:28:48

做自动化测试最容易犯的错误,一篇带你少走弯路...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、自动化一切 我…

作者头像 李华
网站建设 2025/12/18 21:28:43

文献理论期末测试复习指南

你是不是也这样:下载的PDF堆满文件夹,想找的时候死活记不住名字;读文献时灵感一闪,回头却找不到记在哪了;写论文时,调整一个引用格式就要折腾半小时…文献管理不是小事,它直接决定了你的研究效率…

作者头像 李华
网站建设 2025/12/18 21:28:40

小白转行AI攻略:从产品经理到算法工程师,5大岗位技能与薪资全解析_普通人如何杀入AI赛道?(附岗位薪资与避坑指南)

文章详细解析了AI行业5大核心岗位(产品经理、解决方案专家、应用工程师、算法工程师、AI运营)的职责、薪资范围及所需技能。指出当前是入局AI的最佳窗口期,转行需掌握AI原理理解、数据准备、Prompt工程、RAG等关键技术。文章分析了目标人群画…

作者头像 李华
网站建设 2025/12/18 21:28:24

随时随地更文!VanBlog + cpolar让博客管理超自由

文章目录前言1. Linux本地部署2. VanBlog简单使用3. 安装内网穿透4. 创建公网地址5. 创建固定公网地址VanBlog 与内网穿透的结合,让博客创作和管理突破了地域限制,为创作者带来了更自由的体验。前言 VanBlog 是一款专注于简化建站流程的博客系统&#x…

作者头像 李华
网站建设 2025/12/18 21:28:13

混合效率提升!南京弘创干燥 “双螺旋混合技术” 实测成效显著

针对传统 V 型混合机混合效率低、均匀度不稳定、物料团聚严重等行业痛点,南京弘创干燥设备有限公司历时 3 年研发 “双螺旋混合技术”,并应用于旗下 V 型混合机产品,经第三方机构与工业场景实测验证,混合效率与均匀度表现优异&…

作者头像 李华
网站建设 2025/12/18 21:25:31

决胜无形战场:数字孪生如何为国防航天打造全域智能指挥中枢

在国防航天领域,每一次决策都关乎重大战略利益,每一次行动都牵涉复杂系统协同。传统的指挥控制模式,往往依赖于二维地图、静态报表和分散的系统,决策者如同“盲人摸象”,难以在瞬息万变的态势中,获得全局、…

作者头像 李华