单片机编程之联合体(union)的妙用

by Derrick

      虽然现在st针对每一个型号的单片机都有官方的库,但是在平时咨询的客户中,还是见到不少是直接操作寄存器的。在这里我还是推荐大家使用官方的库或者32位的使用cubemx,因为不管是8位的还是32位的,只单单的看参考手册少则几百页多则将近两千页。那么多寄存器编写起来还要细细去研究每一个寄存器每个位的功能自然要大费周折增加项目周期。不过有很多工程师是从51单片机或者国产单片机转过来的,还是习惯于用寄存器来操作。其实今天讲的联合体的使用也是针对有用寄存器并且熟悉以前位操作的程序员同样可以在stm8或者stm32上实现。

      在单片机软件编程中,结构体和枚举类型都很常用到,联合体相对来用的就比较少。那么结构体和联合体的区别到底在哪里?我们先列举一个结构体如下:

我们再定义一个联合体,如下:

      假如在该变量都定义在stm8的单片机编程中,那么一个int变量占用4个字节,一个char变量占用一个字节。这样结构体a占用的就是4+5=9个字节。联合体b占用的是5个字节。这样就很清晰的看出来结构体和联合体的区别到底在哪里。结构体中每一个成员都要占用相应的空间,联合体总得空间就是看占用最大空间的那个成员。char teacher[5]  占用5个字节,office占用4个字节。所以最终b结构体就占用5个字节。当然联合体还有一个特性就是office和teacher[5]的空间是共享的,简单理解就是操作office就会改变teacher的前四个字节的值。

    好了,现在联合体的概念搞明白了。那么他在单片机软件里面到底有什么妙用?正如开头所述,使用联合体定义变量可以让你进行位操作。请看下面一段简单的代码:

           可以看到union c 里面有两个成员一个是char ODR,另一个是包含一个unsigned char型变量的结构体,这里面的unsigned char型变量被分成了8个1bit。这样这个结构体和ODR就是共用同一个空间。相对整个字节操作就直接操作ODR。例如:c.ODR=0xff;    如果相对某一位操作就可以c.bit0=1;所以假如ODR是个控制io口输出的寄存器,就可以简单的使用c.bitx=x(0或者1);这样来对每一位进行直接赋值。

         在有的ram资源少的单片机,能节省ram空间也是很重要的。那么union有时候同样可以发挥作用。在写代码的时候会经常遇到开关型变量(开关型变量也就是只有0或者1),一般在stm8里面就是这么定义的:

 这样每一个flag都会占用一个字节的ram空间。假如这样的flag变量很多我们就可以使用union来节省空间。代码如下:

   如此,每个flag占用1bit,8个才占用1字节。也节省了不少空间。这是两种union的妙用就简单介绍到这里。当然还会有其他很多作用,大家请自行百度。

   最后在给大家列一下联合体uinon的三种说明方式,实际上和struct结构体是一样的,只是关键字不同。

[v_error]

 专业st单片机代理,如需提供技术支持,需求st单片机,需要单片机方案开发,欢迎联系:Derrick(王振涛)

QQ:849664628         TEl:13128723507

[/v_error]

您可能还喜欢...

1 条回复

  1. 天涯说道:

    [赞]