STM32 位域与联合体结合优化操作

发布者:科技狂人最新更新时间:2019-04-01 来源: eefocus关键字:STM32  位域  联合体结合  优化操作 手机看文章 扫描二维码
随时随地手机看文章

1、位域


详细介绍参考文章:位域


位域可以实现在信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。


例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。


为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。


所谓“位域”是把一个字节中的二进位划分为几 个不同的区域, 并说明每个区域的位数。


每个域有一个域名,允许在程序中按域名进行操作。 


这样就可以把几个不同的对象用一个字节的二进制位域来表示。


2、联合体


在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。


也就是使用覆盖技术,几个变量互相覆盖。


这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。


可以把联合体和位域结合起来定义数据类型。


3、示例


union 

{

    uint8_t  value;

    struct  

    {

        uint8_t  lowbit:2;

        uint8_t  middlebit:3;

        uint8_t  highbit:3;

    }byte;

}test_data;

说明:


可以看出value和byte共用一个字节的内存空间,改变value的值,那么byte的值也就改变了,同样改变byte中的位(lowbit占两位, middlebit占3位,highbit也占3位;)value的值也就改变了;


一般情况下,我们要得到value中的高三位的值,需要得到这样(暂定高三位的值为x)x=(value>>5)&0x03,但是使用了位域,就可以直接得到了,省去了这样的一个计算的过程,当然位域的好处不止这些,需要大家灵活运用。


示例说明:


1) 位域定义部分


union 

{

        uint8_t  value;

        struct  

        {

                uint8_t  lowbit:2;

                uint8_t  middlebit:3;

                uint8_t  highbit:3;

        }byte;

}test_data1,test_data2;

2) 赋值、打印说明


test_data1.value=15;

 

test_data2.byte.lowbit=3;

test_data2.byte.middlebit=3;

test_data2.byte.highbit=0;

 

printf("lowbit=%drn",test_data1.byte.lowbit);

printf("middlebit=%drn",test_data1.byte.middlebit);

printf("highbit=%drn",test_data1.byte.highbit);

 

printf("test_data2.value=%drn",test_data2.value);

说明:


test_data1中value直接赋值,打印看lowbit,middlebit,highbit各个位域的值;


test_data2中lowbit,middlebit,highbit给各个位域赋值,打印查看value的值。


关键字:STM32  位域  联合体结合  优化操作 引用地址:STM32 位域与联合体结合优化操作

上一篇:STM32Fxxx 上移植 Huawei LiteOS
下一篇:STM32 结构体位域操作 (int a:4)

推荐阅读最新更新时间:2024-03-16 16:26

关于STM32 Systick 延时函数 变量全局引用的问题
有这样一段代关于systick.c,如下: #include SysTick.h volatile unsigned int TimingDelay ; // 精确延时在SysTick中断里用的计数变量 // 在全局变量里面一定要加上volatile关键字(易变的),否则在全局引用中容易造成编译器的传递错误 void SysTick_1ms_Configuration(void) { /* Setup SysTick Timer for 1 msec interrupts */ if (SysTick_Config(SystemFrequency / 1000)) { /* Capture error */ while (
[单片机]
STM32的串口采用DMA方式接收数据测试
环境: 主机:WINXP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明: 串口可以配置成用DMA的方式接收数据,不过DMA需要定长才能产生接收中断,如何接收可变长度的数据呢? 方法有以下3种: 1.将RX脚与一路时钟外部引脚相连,当串口一帧发完,即可利用此定时器产生超时中断.这个实时性较高,可以做到1个字节实时监测. 2.不改变硬件,开启一个定时器监控DMA接收,如果超时则产生中断.这个实时性不高,因为超时时间必须要大于需要接收帧的时间,精度不好控制. 3.STM32单片机有的串口可以监测总线是否处于空闲,如果空闲则产生中断.可以用它来监测DMA接收是否完毕.这种方式
[单片机]
<font color='red'>STM32</font>的串口采用DMA方式接收数据测试
STM32标准库和HAL库有什么不同 我们怎么用
摘要:通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的。一般大多数都会选用标准库和HAL库,而极少部分人会通过直接配置寄存器进行开发。 网上关于标准库、HAL库的描述相信是数不胜数。可是一个对于很多刚入门的朋友还是没法很直观的去真正了解这些不同开发发方式彼此之间的区别,所以笔者想以一种非常直白的方式,用自己的理解去将这些东西表述出来,如果有描述的不对的地方或者是不同意见的也可以大家提出。 一、配置寄存器不少先学了51的朋友可能会知道,会有一小部分人或是教程是通过汇编语言直接操作寄存器实现功能的,这种方法到了STM32就变得不太容易行得通了。 因为STM32的
[单片机]
<font color='red'>STM32</font>标准库和HAL库有什么不同 我们怎么用
STM32芯片的内部架构如何
STM32芯片主要由内核和片上外设组成,STM32F103采用的是Cortex-M3内核,内核由ARM公司设计。STM32的芯片生产厂商ST,负责在内核之外设计部件并生产整个芯片。这些内核之外的部件被称为核外外设或片上外设,如 GPIO、USART(串口)、I2C、SPI 等。 芯片内部架构示意图 芯片内核与外设之间通过各种总线连接,其中驱动单元有 4 个,被动单元也有 4 个,具体如上图所示。可以把驱动单元理解成是内核部分,被动单元都理解成外设。 ICode 总线 ICode总线是专门用来取指令的,其中的I表示Instruction(指令),指令的意思。写好的程序编译之后都是一条条指令,存放在 FLASH中,内核通过ICod
[单片机]
<font color='red'>STM32</font>芯片的内部架构如何
stm32--独立看门狗使用
1、基本介绍 包含有两个看门狗,独立看门狗:IWDG 窗口看门狗:WWDG 用来检测由于软件错误导致的故障。 看门狗由VDD电压与供电,在停止和待机模式下仍能工作 2、看门狗的原理 我们可以键看门狗理解为一个递减计数器,在看门狗已经激活的状态下,如果,计数器递减到0,那么系统就会产生复位。 如果,计数器在递减到零之前,重新刷新了数值(称为“喂狗”),此时,系统就不会产生复位。 3、结构框图 LSI:内部时钟30k-60k , 适合于精度低的情况 计数器的最大值:0xfff - 重载寄存器的数值:装着我们的递减的初值 40k/(4*2**pre),pre=0~6 都可以 4、独立看门
[单片机]
stm32--独立看门狗使用
STM32移植USB驱动总结
//=========================By xiaowei /* */ //========================= 1、硬件介绍 1、SGM7227,USB高速切换开关,OE是芯片使能,低电平才能使总线导通; S脚是切换控制; USB协议 https://segmentfault.com/a/1190000015995506 2、软件移植 移植文件分析 stm32自带USB接口,OTG-FS(全速)和OTG-HS(高速),因为stm32f4只带有高速PHY,想使用高速模式,就需要外扩高速PHY,在此为USB3300。 系统配置一个Device端口,一个Host端口; Device端
[单片机]
<font color='red'>STM32</font>移植USB驱动总结
STM32电机方波】记录1——GPIO基础配置
GPIO库函数: GPIO初始化: typedef struct { u16 GPIO_Pin; //选择待设置的GPIO管脚,使用操作符“|”可以一次选中多个管脚 GPIOSpeed_TypeDef GPIO_Speed; //10MHz 、2MHz、 50MHz GPIOMode_TypeDef GPIO_Mode; //输入输出的8种方式 } GPIO_InitTypeDef; GPIO的缺省初始化值: GPIO_Pin = GPIO_Pin_All ; GPIO_Speed = GPIO_Speed_2MHz; GPIO_Mode = GPIO_Mode_IN_FLOATING GPIO的输入输出模
[单片机]
【<font color='red'>STM32</font>电机方波】记录1——GPIO基础配置
STM32 OLED相关笔记(库函数)
参考资料:正点原子STM32不完全手册OLED章节 有机发光二极管(Organic Light-Emitting Diode, OLED) 0.OLED不需要背光源,对比度高,注意:电压为3.3v,支持SPI 8080 6800 和iic 1.基于SSD1302芯片,一般为128*8*8的规格,称为12864 对于SSD1302芯片的操作: 0X81:设置对比度,包含两个字节,第一个0X81为命令,然后发送一个值来设置对比度,设置的值越大,则屏幕越亮(0X00--0XFF) 0XAE,0XAF:为关闭显示和开启显示 0x8D:为电荷泵的命令值,后面包括一个设置值,第二个字节的A2位表示是否开启电荷泵(0为关闭,1为开启
[单片机]
<font color='red'>STM32</font> OLED相关笔记(库函数)
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved