嵌入式系统中union的用法

时间:2022-10-25 22:29:21

在嵌入式实际应用中,大多数的协议结构定义中,都会使用union类型来定义。

使用联合来将较大的对象分解成组成这个对象的各个字节。

typedef union{

char bytes[4];

uint udata;

}data;

可以使用data.udata数组来访问data.bytes[4]字段的各个字节。

注意:

char            占 1 字节

short           占 2 字节,

int 、float    占 4 字节,

double          占8 字节



使用用法:在利用 flash中保存数据信息时


#include "stm32f0xx_flash.h"

#define FLASH_PAGE_SIZE         ((uint32_t)0x00000400)  
#define FLASH_USER_START_ADDR   ((uint32_t)0x0800FC00)  
#define FLASH_USER_END_ADDR     ((uint32_t)0x08010000)  


//定义需保存用户设置数据的结构

typedef struct //构造结构体 { unsigned char name[16]; float height; float weight; }Personal_Information_TypeDef;

//为了方便变量的使用和在Flash里面的存贮,定义一联合(union


typedef union
{
   uint32_t DataAll[6];                              //因为变量结构总共为24bytes,所以为6个32位变量
   Personal_Information_TypeDef,inforDataI;

} settings_Information;


//申明变量,注意一定要四字节对齐

volatile settings_Information user_seting;


void User_infor_read(void)
{
 int i;
 uint32_t address_t;

 address_t = FLASH_USER_START_ADDR;                       //flash数据存储起始地址

 for(i=0;i
 {
  user_seting.DataAll[i] = *(__IO uint32_t *)address_t;         //  读出所以数据

 //*(__IO uint32_t *)address_t = user_seting.DataAll[i];         //写入数据
  address_t += 4;
 }
}


由于 user_seting.DataAll[i] ,与 user_seting.inforDataI 共用一块内存,所以可以通过:

user_seting.inforDataI .name[];

user_seting.inforDataI .height;

user_seting. infor DataI .weight;

访问数据结构的数据