0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32开发中的位运算以及位带操作

工程师邓生 来源:未知 作者:刘芹 2024-02-02 14:38 次阅读

STM32开发中的位运算以及位带操作

位运算是计算机中常用的一种操作方式,特别适用于对数据的单个或多个位进行操作。在STM32开发中,位运算常被用于对寄存器的位进行设置或清除,以及对数据的位进行操作。同时,STM32还提供了位带操作,使得对单个位进行操作更加方便。本文将详细介绍STM32开发中的位运算和位带操作。

1. 位运算

位运算是一种通过位的逻辑操作对二进制数据进行操作的方法,它包括与(&)、或(|)、异或(^)、取反(~)等操作。在STM32开发中,位运算常被用于对寄存器的位进行设置或清除,以控制硬件设备的工作状态。

以GPIO寄存器为例,每个GPIO口都有一个对应的寄存器,用于控制该GPIO口的输入、输出状态。设置或清除寄存器中某一位的方法如下:

- 设置寄存器中某一位为1:先将寄存器中对应的位设置为0,然后再将该位设置为1。
- 清除寄存器中某一位为0:先将寄存器中对应的位设置为1,然后再将该位设置为0。

以设置GPIOA的第5位为1为例,代码如下:

```c
GPIOA->CRL &= ~(0b11 << 20); // 先将第5位设置为0
GPIOA->CRL |= (0b01 << 20); // 再将第5位设置为1
```

在上述代码中,`GPIOA->CRL`表示GPIOA寄存器的低8位,通过与运算 `&` 和或运算 `|` 将对应的位设置为0或1。

2. 位带操作

位带操作是指将某一位映射到一个特定的内存地址上,以方便对该位进行直接的读写操作。STM32提供了位带操作的相关特性。

在STM32中,每个位的地址都可以通过位带区域的地址计算得到。位带操作通过STM32提供的特殊地址将位操作转换为对特定地址的读写操作,从而实现对单个位的直接读写。这种方式可以大大简化对单个位的操作,提高代码可读性和代码执行效率。

以位带操作设置GPIOA的第5位为1为例,代码如下:

```c
#define BITBAND_SRAM(address, bit) ((uint32_t*)((BITBAND_SRAM_BASE + ((address) - SRAM_BASE) * 32 + (bit) * 4)))
#define BITBAND_PERIPH(address, bit) ((uint32_t*)((BITBAND_PERIPH_BASE + ((address) - PERIPH_BASE) * 32 + (bit) * 4)))

volatile uint32_t* GPIOA_PIN5 = BITBAND_PERIPH(&GPIOA->ODR, 5);

// 设置GPIOA的第5位为1
*GPIOA_PIN5 = 1;
```

在上述代码中,`BITBAND_PERIPH` 定义了位带操作的宏,通过计算得到对应位的地址。`GPIOA_PIN5` 即为第5位的地址,通过给该地址赋值为1,即可将第5位设置为1。

3. 位运算与位带操作的比较

位运算和位带操作都可以用于对单个位进行操作,但是在一些情况下,位带操作比位运算更加高效:

- 可读性:位带操作使得代码更加直观和易读,能够清晰地看出对哪个位进行操作。
- 代码量:位带操作可以通过宏定义简化代码,减少了位运算的操作和代码量。
- 高效性:位带操作直接对位进行操作,避免了对整个寄存器的读取和写入,提高了代码执行效率。

然而,位带操作也存在一些限制:

- 只能对每个字节(byte)的某个位进行操作。
- 位带区域的内存资源有限,一般情况下只能直接对GPIO寄存器的每个位进行位带操作,对其他寄存器的位进行位带操作可能无效。

因此,在实际开发中,根据需要选择合适的方法进行位操作。

结论:

本文详细介绍了STM32开发中的位运算和位带操作。位运算通过与运算和或运算对寄存器的位进行设置和清除,用于控制硬件设备的工作状态。位带操作通过将位映射到特定的地址上,实现对单个位的直接读写操作,提高了代码的可读性和执行效率。在选择位操作方法时,需要考虑可读性、代码量和效率等因素。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5342

    浏览量

    120289
  • STM32
    +关注

    关注

    2270

    文章

    10897

    浏览量

    355841
  • 位运算
    +关注

    关注

    0

    文章

    17

    浏览量

    8422
收藏 人收藏

    评论

    相关推荐

    4G模组Air780E的LuatOS开发运算(bit)示例

    本文我要说的是低功耗4G模组Air780E的LuatOS开发,关于运算(bit)示例,我将详细解析分享给大家。
    的头像 发表于 12-02 14:33 165次阅读
    4G模组Air780E的LuatOS<b class='flag-5'>开发</b>之<b class='flag-5'>位</b><b class='flag-5'>运算</b>(bit)示例

    Air780E模组LuatOS开发运算(bit)教程篇!

    本次我们要学习的是4G模组Air780E的LuatOS开发,关于运算(bit)教程分享给大家。
    的头像 发表于 11-26 11:58 145次阅读
    Air780E模组LuatOS<b class='flag-5'>开发</b>的<b class='flag-5'>位</b><b class='flag-5'>运算</b>(bit)教程篇!

    MCU前沿市场趋势:8单片机和32单片机

    工具和库方面所需的一切。 这些32单片机的许多都是基于非常成功的ARM内核。因此,开发人员对获得第二种源设备以及市场上可用的一套全面的开发
    发表于 09-24 17:47

    电容液测量阻抗多少正常

    在电容液测量,阻抗值的正常范围并不是一个固定的数值,而是与多种因素有关,包括液高度、电极间距、液体性质以及传感器的具体设计等。因此,无法给出一个统一的“正常”阻抗值范围。 然而,
    的头像 发表于 09-19 09:42 291次阅读

    plc的置和复位有什么区别

    在PLC(可编程逻辑控制器),置(Set)和复位(Reset)是两个极其重要的操作,它们对控制PLC的输出信号、执行特定逻辑操作以及管理
    的头像 发表于 08-16 18:21 8686次阅读

    STM32G4系列到底支不支持带操作

    印象不止一次有人询问STM32G4系列到底支不支持带操作
    的头像 发表于 07-29 09:45 1520次阅读
    <b class='flag-5'>STM32</b>G4系列到底支不支持<b class='flag-5'>位</b><b class='flag-5'>带操作</b>

    STM32H743系列支持带操作吗?

    //IO口操作宏定义 define BITBAND(addr, bitnum) ((addr0xF0000000)+0x2000000+((addr0xFFFFF)<<5
    发表于 07-23 08:13

    请问一下ESP8266有没有操作或者带的功能?

    请问一下ESP8266有没有操作或者带的功能,我们需要对一块连续内存区域(相当于显存)进行操作,如果不用
    发表于 07-22 06:42

    关于带操作的疑问求解

    大家都知道,带有对应的带别名区,操作带别名区就可以写带区的BIT,读取带BIT值到内部
    发表于 05-17 07:33

    请问stm8s IO操作如何实现?

    请教各位了,stm8s IO操作如何实现像stm32类似的带操作啊? #define LEDPAout(0), LED = 1; LED
    发表于 05-09 07:10

    STM32F103RGT6带操作不成功的原因?

    各位大神,我是一个入门级的超级菜鸟,遇到一个问题: 为啥子我同样的带操作STM32F103C8T6上操作成功,但是在STM32F103R
    发表于 04-19 06:32

    ICMAN多点液检测

    检测
    ICman
    发布于 :2024年04月02日 09:31:20

    stm32F4 64变量操作异常怎么解决?

    stm32F4 64变量使用报错解决
    发表于 04-02 07:16

    STM32G4XX不能够像STM32F1XX STM32F4XX那样对GPIO进行带操作呢?

    请教下,在STM32G4XX系列里面,GPIO挂载在AHB2总线上面,地址在0x4800 0000. 是不是也就意味着,STM32G4XX不能够在像STM32F1XX STM32F4X
    发表于 03-21 07:16

    plc的置和复位怎么理解

    和复位通常用于控制PLC的状态,例如控制电机的启停、开关的开关状态、指示灯的亮灭等。通过适当地使用置和复位操作,可以实现复杂的控制逻辑,确保设备运行或系统操作的正确性。
    的头像 发表于 01-16 17:20 1.3w次阅读