首页 > 其他分享 >STM32系统开发--位、字节操作

STM32系统开发--位、字节操作

时间:2024-01-17 15:11:46浏览次数:34  
标签:字节 -- uint8 STM32 LOW bit 清零 define

  针对MCU的嵌入是开发中经常涉及到寄存器的操作,例如GPIO配置低寄存器GPIOx_CRL(共32个bit),有时需要改变其中的一位或者几位bit值,同时不能影响其它bit位的值。

 例如,需要设置第0位bit=1时,不能简单的设置为:GPIOx_CRL=0x01 ,这样的方法会使得低配置寄存器GPIOx_CRL的其它比特位都置为0。

对于二进制位操作来说:

不管该位原来的值是0还是1,它跟0进行&运算,得到的结果都是0,而跟1进行&运算,将保持原来的值不变;

不管该位原来的值是0还是1,它跟1进行|运算,得到的结果都是1,而跟0进行|运算,将保持原来的值不变。

因此,设置第几位需要置1就将0x01左移几位,如:

GPIOx_CRL  |=   (0x01 << 0);

位操作用法可分为4类:

1、寄存器数据的位、字节读取操作:1)提取某一个字节,2)提取某一位;

2、寄存器数据的位、字节清零操作:1)清零某一个字节,2)清零某一位;

3、寄存器数据的位、字节置1操作: 1)将某一个字节置1, 2)将某一位置1;

4、判断某一位或某几位连续的值:1)判断某一位的值,2)判断某几位连续位的值。

1. 位、字节读取操作

/*以提取int型变量中某个字节为例*/
#define    GET_LOW_BYTE0(x)    ((x >>  0) & 0x000000ff)    /* 获取第0个字节 */
#define    GET_LOW_BYTE1(x)    ((x >>  8) & 0x000000ff)    /* 获取第1个字节 */
#define    GET_LOW_BYTE2(x)    ((x >> 16) & 0x000000ff)    /* 获取第2个字节 */
#define    GET_LOW_BYTE3(x)    ((x >> 24) & 0x000000ff)    /* 获取第3个字节 */
/*提取一字节变量中的某一位*/
#define    GET_BIT(x, bit)    ((x & (1 << bit)) >> bit)    /* 获取第bit位 */

2. 位、字节清零操作

/*清零int型变量中某一个字节*/
#define    CLEAR_LOW_BYTE0(x)    (x &= 0xffffff00)    /* 清零第0个字节 */
#define    CLEAR_LOW_BYTE1(x)    (x &= 0xffff00ff)    /* 清零第1个字节 */
#define    CLEAR_LOW_BYTE2(x)    (x &= 0xff00ffff)    /* 清零第2个字节 */
#define    CLEAR_LOW_BYTE3(x)    (x &= 0x00ffffff)    /* 清零第3个字节 */
/*清零一字节变量中的某一位*/
#define    CLEAR_BIT(x, bit)    (x &= ~(1 << bit))    /* 清零第bit位 */

3. 位、字节置1操作

/*int型变量中的某个字节置1*/
#define    SET_LOW_BYTE0(x)  (x |= 0x000000ff)    /* 第0个字节置1 */
#define    SET_LOW_BYTE1(x)  (x |= 0x0000ff00)    /* 第1个字节置1 */
#define    SET_LOW_BYTE2(x)  (x |= 0x00ff0000)    /* 第2个字节置1 */
#define    SET_LOW_BYTE3(x)  (x |= 0xff000000)    /* 第3个字节置1 */
/*一字节变量中的某一位置1*/
#define    SET_BIT(x, bit)    (x |= (1 << bit))    /* 置位第bit位 */

 

实例:通过定义一个位结构体对其赋值,再按位(小端)读取,实现位读取与置位操作。

struct eightbitdata_t{
    uint8_t a:1 ;
    uint8_t b:1 ;
    uint8_t c:1 ;
    uint8_t d:1 ;
    uint8_t e:1 ;
    uint8_t f:1 ;
    uint8_t g:1 ;
    uint8_t h:1 ;
    
};
uint8_t get_8bitdata(void);

struct imu_status_t{
    uint8_t accx;
    uint8_t accy;
    uint8_t accz;
    uint8_t gyrox;
    uint8_t gyroy;
    uint8_t gyroz;
    uint8_t temperature;
    uint8_t rsv;
};
/************************************************
函数名称 :位结构体测试函数
功    能 :
参    数 :
返 回 值 :返回整合好的一字节数据
*************************************************/
uint8_t get_8bitdata(void)
{
    struct eightbitdata_t otto={1,0,1,0,1,0,1,0};
    struct imu_status_t imu_status={0,0,0,0,0,0,0,0};
    //移位操作实现
    uint8_t  status;
    status=otto.a|(otto.b<<1)|(otto.c<<2)|(otto.d<<3)|(otto.d<<4)|(otto.e<<5)|(otto.f<<6)|(otto.g<<7);    
    //接收到一字节八位状态量,解析
    imu_status.accx=GET_BIT(status, 6);
    return imu_status.accx;
}

 

标签:字节,--,uint8,STM32,LOW,bit,清零,define
From: https://www.cnblogs.com/xujingxing/p/17969610

相关文章

  • 你有被if-else支配过吗?看完这篇文章,你就知道该怎么做
    在日常工作中,如果让你碰到一大堆if-else嵌套的代码,你会怎么做?背景最近在给之前负责的项目做CR的时候,在项目代码中发现有大量的if-else判断语句,阅读起来非常的折磨人而且也不利于后期的维护扩展,比较容易出问题。当时我直接气血上涌,差点昏过去。缓过几分钟之后,把写这段代码的......
  • 栈3302.表达式求值-AcWing题库这是一道中缀表达式;有括号提高了这题的难度(个人认为),模拟我感觉不是特别好做;#include<bits/stdc++.h>usingnamespacestd;stack<int>stk;stack<char>op;unordered_map<char,int>pr={{'+',1},{'-',1},{'*'......
  • 析合树
    析合树。对一个排列定义连续段为值域是连续的一段区间。本原连续段(本原段)定义为不与其它任何连续段《相交且不包含》的连续段。即本原段之间只有相离和包含关系。一个连续段可以由若干本原段拼接得到。将所有本原段按照包含关系建树就得到了析合树。儿子序列是按序列排序,每个点元......
  • 变电站电力设备数据采集联网对接API转发存储数据库服务器技术方案
    DL_FileData_CJDC文件上海致达智能科技windows/linux/arm解析本地txt和xls文件DL_ABB_API_OLE 网络 ABBDCS windows ABBDCSOLE采集,本地采集DL_KRS_TCP 网络 台山核电 windows/linux/arm 台山核电KRS系统数据采集DL_Xinhua_ASDPU_UDP 网络 新华ASDPU协议 windows/linux/arm ......
  • 2024年AI预测报告-医疗卫生
    AndreessenHorowitz公司的合伙人JorgeConde生物科技的重复使用火箭在哪里?传统的药物开发既耗时又充满风险且成本高昂,这种方式非常个性化,一个分子对下一个开发的分子没有影响——就像传统的火箭一样,只能一次性使用。但现在情况正在改变。SpaceX的火箭可重复使用,改变了太空旅行......
  • WSL2 挂载 U 盘等 USB 设备
    微软WSL文档:https://learn.microsoft.com/zh-cn/archive/blogs/wsl/file-system-improvements-to-the-windows-subsystem-for-linux插入U盘等USB设备,然后将WSL2打开,比如Ubuntu20.04。建立挂载USB设备文件的文件夹:sudomkdir/mnt/e#将e换成Windows里显......
  • xcelium的X传播测试
    一、简介xcelium的X传播有两种模式:FOX,CAT。专业人员建议项目在X传播测试时选择CAT模式,更能测试项目完备性。二、详情X回归命令调用有两种:1、xrun-xprop{F|C}source_files2、xrun-xfilemy.xfile source_files第一种调用方式可用于项目整体使用一种X传播模式。但是当项......
  • 找不到或无法加载主类、代码修改了运行还是旧代码
     找不到或无法加载主类、1、简单jdk配置有没有问题2、项目有没有编译成功或者重新编译试试 代码修改了运行还是旧代码将项目的.iml文件删除掉、mvnidea:module重新生成一下,重启一下编辑器模块有问题的话 就删了重新导入一下 无法运行的话记得......
  • Java HttpClient 实战 GET 与 POST 请求一网打尽
    使用JavaHttpClient进行HTTP请求在Java中,HttpClient是进行HTTP通信的一个强大工具。它提供了简单而灵活的API,可以轻松地发送HTTP请求并处理响应。在本篇博文中,我们将深入探讨如何使用HttpClient执行GET、POST等不同类型的HTTP请求。1.引入依赖首先,确保在项目的pom.xml文件中......
  • Jmeter教程-JMeter 环境安装及配置
    Jmeter教程JMeter环境安装及配置在使用JMeter之前,需要配置相应的环境,包括安装JDK和获取JMeterZIP包。安装JDK1.JDK下载示例环境为Windows11环境,读者应根据实际环境下载JDK的安装包。JDK下载地址:Java21下载建议下载exe文件,如图:2.安装JDK建议在D盘下......