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

    文章

    5589

    浏览量

    129067
  • STM32
    +关注

    关注

    2305

    文章

    11121

    浏览量

    371169
  • 位运算
    +关注

    关注

    0

    文章

    17

    浏览量

    8641
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    arm单片机位带操作的原理

    单片机单片机的带操作(Bit-Banding)是一种特殊的内存映射技术,允许开发者以原子操作的方式对特定的内存进行读写,从而提高了对GP
    发表于 11-25 08:24

    操作的常见错误与应对策略

    的,可能会导致数据溢出或丢失。 (三)数据类型表示的理解要点 在嵌入式系统,不同的数据类型有着不同的表示方式,这一点在进行操作
    发表于 11-24 07:50

    使用操作精准配置单片机寄存器

    项目对效率要求高,推荐使用掩码操作;如果需要可读性和维护性,推荐结构体映射寄存器;如果使用Cortex-M架构,带操作是个不错的选择。 1、使用
    发表于 11-24 07:22

    单片机位数的思考(8、16、32

    8、16、32是指单片机的“字长”,也就是一次运算参与运算的数据长度,这个位是指二进制
    发表于 11-21 08:31

    C语言操作

    效果,而当两个位相同时,结果为 0。以 5 ^ 3 为例,0000 0101 ^ 0000 0011 = 0000 0110,结果是 6。按异或操作在数据加密、校验和数据交换等场景应用较多
    发表于 11-21 07:52

    映射的操作

    Bit-banding 简称带、段 支持带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写 对于硬件 I/O 密集型的底层程序最有用处 优点 使代码更简洁 在多任务
    发表于 11-18 07:03

    带操作的分析

    的值置1: 五、带操作编程实现 在C编译器并没有直接支持带操作,比如,C编译器并不知道同一块内存可以用不同的地址来访问,也不知
    发表于 11-18 07:01

    GPIO输出操作的几种方法分享

    权威指南》第五章,第5小节 带操作(87页~92页)。   为简化带操作,可以定义一些宏。比如,我们可以建立一个把“带地址+
    发表于 11-13 07:50

    定点数表示实数的方法以及定点数在硬件上的运算验证

    本篇主要介绍定点数表示实数的方法以及定点数在硬件上的运算验证 为什么选定点数 32单精度浮点数: 32的单精度浮点数为例,IEE754标准规定,一个flaot类型的
    发表于 10-28 08:13

    值得关注的电极液开关作用!

    开关
    jzyb
    发布于 :2025年10月22日 17:24:00

    值得学习的电极液开关作用!

    开关
    jzyb
    发布于 :2025年07月18日 15:31:42

    基于瑞萨64MPU RZ/G2L进行32应用软件开发

    本文主要介绍基于瑞萨64MPU RZ/G2L进行32应用软件开发的介绍,用于解决客户32软件移植相关问题,供客户参考。
    的头像 发表于 06-26 15:48 1601次阅读
    基于瑞萨64<b class='flag-5'>位</b>MPU RZ/G2L进行32<b class='flag-5'>位</b>应用软件<b class='flag-5'>开发</b>

    音叉液开关的作用!

    开关
    华泰天科
    发布于 :2025年04月29日 16:28:04

    仪表包括哪些?

    仪表
    jzyb
    发布于 :2025年03月18日 20:06:55

    电极液开关在污水处理的作用!

    开关
    华泰天科
    发布于 :2025年01月21日 18:09:45