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

发布者:camuspyc最新更新时间:2021-02-07 来源: 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
下一篇:STM32Cube 工具说明和安装浅析

推荐阅读最新更新时间:2024-11-08 08:44

从一无所知的开始 学习stm32
首先说下博主不是什么大牛,还是一名在校的大二学生,主要是想学习STM32,想通过学习STM32,然后通过博客来记些笔记,来提高自己的能力。 好了,来进入主题。哦,就是这个feel! 首先就是学习STM32,就是需要有自己的一块开发板,我用的就是实验室学长留下的一个野火板。自己感觉还是不错的。 首先我们需学习怎么建立一个STM32的工程。 首先在建立一个模板,以方便自己以后使用。我是在桌面上,建立一个文件夹,取名模板。然后在模板里面建立几个文件夹如下图所示: 然后就是找到stm32的库,然后开始往自己的模板里写入一些启动文件和官方文件。我用的就是3.5版本的,3.0版本与3.5版本还是有区别的。 下面就开始往每个文件里添加
[单片机]
从一无所知的开始 学习<font color='red'>stm32</font>
STM8学习笔记---union联合体的应用
平时用单片机编写程序经常会遇到将一个16位数拆封为两个8位数,或者将将两个8位数组成一个16位数。如: data = data_h * 256 + data_l; data_h = data / 256; data_l = data % 256; 对于8位单片来说计算乘法和除法比较耗时,也比较浪费单片机资源。除了将乘法和除法转换为 左移 或者 右移运算外,有没有其他好的方法来解决这个问题。无意间看到了联合体之后,发现用联合体来解决这个问题是再好不过的。 关于联合体的定义: 在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的
[单片机]
STM8学习笔记---union<font color='red'>联合体</font>的应用
STM32全球唯一ID读取方法
产品唯一的身份标识非常适合: ● 用来作为序列号(例如USB字符序列号或者其他的终端应用) ● 用来作为密码,在编写闪存时,将此唯一标识与软件加解密算法结合使用,提高代码在闪存存储器内的安全性。 ● 用来激活带安全机制的自举过程 96位的产品唯一身份标识所提供的参考号码对任意一个STM32微控制器,在任何情况下都是唯一的。用户在何种情况下,都不能修改这个身份标识。 这个96位的产品唯一身份标识,按照用户不同的用法,可以以字节(8位)为单位读取,也可以以半字(16位)或者全字(32位)读取。 基地址:0x1FFF F7E8 每个CPU 出厂的时候都 配置的一个ID,96 位的.这个唯一码可以利用作软件加密....... stat
[单片机]
STM32笔记(十)---DMA(直接存储器访问)
一、 DMA简介 DMA(Data Memory Access),直接存储器访问。主要功能是可以把数据从一个地方搬到另外一个地方,而且不占用CPU。通常为以下传输方式: M- M,存储器到存储器,一般指内部存储器(Flash)与外部存储器(SRAM)的传输。 P- M, 外设到存储器,一般指外设(Periph)与外部存储器的传输。 M- P, 存储器到外设,一般指外部存储器与外设(Periph)的传输。 STM32系列一般分为DMA1、DMA2,两者均可以实现 P- M, M- P,M- M 。 区别:DMA1有7个通道、DMA2有5个通道,同时DMA2在大容量、互联型的芯片上配备。 二、 DMA功能框图 功能框图
[单片机]
<font color='red'>STM32</font>笔记(十)---DMA(直接存储器访问)
Stm32-输入捕获
输入捕获模式可以用来测量脉冲宽度或者测量频率。STM32 的定时器,除了 TIM6 和 TIM7,其他定时器都有输入捕获功能。STM32 的输入捕获,简单地说就是通过检测 TIMx_CHx 上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)中。 1. 相关寄存器介绍 1) 捕获/比较模式寄存器 (TIMx_CCMRx) 当在输入捕获模式下使用的时候,对应上图的第二行描述,从图中可以看出,TIMx_CCMR1 明显是针对 2 个通道的配置,低八位 用于捕获/比较通道 1 的控制,而高八位 则用于捕获/比较通道 2 的控制
[单片机]
Stm32-输入捕获
STM32与Actility ThingPark的合作实现高效的无线固件更新
在物联网(IoT)领域,无线固件更新(FUOTA)技术的引入显著提高了设备管理的效率和灵活性。STM32与Actility ThingPark平台的结合,为开发者提供了一个强大的工具,使他们能够在极短的时间内设置和执行FUOTA活动。 FUOTA的重要性及其实施挑战 FUOTA技术的引入,使得开发者可以远程更新设备固件,而无需物理访问每个设备。这不仅大大降低了维护成本,还提高了设备的安全性和性能。然而,实施FUOTA并非易事。它需要开发者掌握多种通信协议和低级编码技术,以确保数据包的安全传输和设备的正确更新。 Actility ThingPark平台通过提供后端和客户端基础设施,简化了FUOTA的实施过程。该平台与S
[单片机]
stm32NVIC中断优先管理
这里简单介绍一下STM32的中断分组:STM32 将中断分为5个组,组为0~4,最多设置16个中断优先级。该分组的设置是由SCB- AIRCR寄存器的bit10~8,来定义的,具体分配关系表如下: 第0组 :所有4位用于指定响应优先级 第1组:最高1位用于指定抢占优先级,最低3位用于指定响应优先级 第2组:最高2位用于指定抢占优先级,最低两位用于指定响应优先级 第3组:最高3位用于指定抢占优先级,最低1位用于指定响应优先级 第4组:所有4位用于指定抢占优先级 通过这个表,我们就可以清楚的看到组0~4对应的配置关系,例如组设置3,那么此时所有的60个中断,每个中断的中断优先级寄存器的高4位中的最高3位 是
[单片机]
stm32NVIC中断优先管理
STM32之如何封装自己的lib库
似乎stm32刚开始出来的时候就是用的l.ib库,后来就开源了。 网上看了一些网友做的lib库,自己也弄了一下,其实也挺简单。 以下封装lib库都是基于stm32的3.0固件库 1、打开一个工程,将除固件库以外的其他文件删掉,如下: 2、在option下进行设置,如下: 来个特写: 3、将编译好的lib库拷贝到另外一个工程,添加进去,并将工程下库的c文件全部删除(h文件必须保留) 4、编译,如下: 注意,只需将stm32_lib_30.lib文件add进去就可以了,没必要在主文件里面include之类的。 否则编译的时候就会出错(重复包含),如下:
[单片机]
<font color='red'>STM32</font>之如何封装自己的lib库
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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