1 STM32开发中的位运算以及位带操作-德赢Vwin官网 网
0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

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

3天内不再提示

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

单片机与嵌入式 来源:单片机与嵌入式 2023-11-29 14:36 次阅读

为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。

如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。

f513ed6e-8e80-11ee-939d-92fbcf53809c.png

想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。

官方给出了如下相应的计算公式:

AliasAddr
=0x42000000+((A‐0x40000000)*8+n)*4
=0x42000000+(A‐0x40000000)*32+n*4

其中,AliasAddr是别名区的地址,A是GPIOA->ODR的地址,n是该端口的上的某一位。

0x42000000是位带别名区域的起始地址,A是输出数据寄存器GPIOA->ODR的地址,A的地址先减去位带区基地址,得到的是相对于位带区基地址的偏移地址,那么膨胀之后还是一个偏移地址,是相对于位带别名区基地址的偏移量,加上位带别名区域基地址,就得到了其对应的别名区地址。

多数情况下,大家见到的代码,应该是以下这个样子,一共分为三步:

#defineBITBAND(addr,bitnum)((addr&0xF0000000)+0x2000000+((addr&0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr)  *((volatile unsigned long  *(addr))                                                                       
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))

第一步,就是我们上面分析的,得到位带别名区域的32位地址。

第二步,就是将第一步得到的32位地址,给转换成一个指针变量,并且操作这个地址里的值,唯一的区别,就是由于安全的考虑,多加了一个volatile 这样的关键字。

举个例子

如下,想直接访问0x00000001这个地址,并且给这个地址写1,该怎么做呢?

#defineADDR0x00000001
*(int*)ADDR=1;

第三步,就是将前两部,结合在一起,根据传入的addr和bit计算得到32位的地址,然后强制类型转换,使得我们可以去操作这个地址里的值。

提示:bitnum<<2相当于bitnum2乘以4,实际上在计算机底层乘法也是基于位运算实现的。

审核编辑:汤梓红

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

    关注

    6035

    文章

    44554

    浏览量

    634588
  • 嵌入式
    +关注

    关注

    5082

    文章

    19104

    浏览量

    304779
  • STM32
    +关注

    关注

    2270

    文章

    10895

    浏览量

    355715
  • 位运算
    +关注

    关注

    0

    文章

    17

    浏览量

    8422

原文标题:STM32开发中的位运算以及位带操作

文章出处:【微信号:单片机与嵌入式,微信公众号:单片机与嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    详解STM32带操作

    STM32带操作是一种非常有用的技术,它可以让你直接访问一个单一的,而不必去读取或者写入整个寄存器。这种技术可以用于提高代码的执行
    发表于 06-07 15:33 1290次阅读

    带操作原理

    (四)带操作1.带操作原理STM32将每个比特膨胀成为32字,访问这些字就实现了访问
    发表于 11-30 08:20

    STM32带操作的方法

    前言这篇文章主要用来讲解STM32带操作,学习过51单片机的应改了解,在控制51单片机IO引脚时,只需要向某一个IO口赋值就可以实现,对应IO口的输出高或地。那么
    发表于 01-17 06:27

    快速理解STM32带操作原理

    Bit-banding简称带,有人也叫段。支持带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。很多朋友是从学习51单片机过来的,都知道P1.1这个引脚可以单独控制
    的头像 发表于 09-03 15:40 4722次阅读
    快速理解<b class='flag-5'>STM32</b><b class='flag-5'>位</b><b class='flag-5'>带操作</b>原理

    STM32开发带操作机制

    为了像51单片机一样能够对某个管脚单独操作,引入了带操作这样的操作机制。 如下图,带(Bit band)区就是就是你想单独
    的头像 发表于 04-09 14:07 1666次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>开发</b><b class='flag-5'>中</b>的<b class='flag-5'>位</b><b class='flag-5'>带操作</b>机制

    MCU_STM32带操作 -- bit banding

    带操作STM32芯片除了通用的寄存器访问,还有一个比较有意思的带操作。这个位带的意思,就是每个比特(bit)
    发表于 11-26 15:21 6次下载
    MCU_<b class='flag-5'>STM32</b>的<b class='flag-5'>位</b><b class='flag-5'>带操作</b> -- bit banding

    STM32带操作

    带操作:将一个重新定义一个字的带别名来操作带区一个
    发表于 11-26 18:06 12次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>位</b><b class='flag-5'>带操作</b>

    STM32单片机---带操作

    STM32单片机---带操作一、带操作二、寄存器地址与别名地址转换技巧三、
    发表于 11-29 14:51 2次下载
    <b class='flag-5'>STM32</b>单片机---<b class='flag-5'>位</b><b class='flag-5'>带操作</b>

    初识“带操作

    ”什么是“带操作”?CPU不能直接对位带区的单个数据寻址,只能通过对位带别名区的访问(或读/写)实现对位带区单个数据
    发表于 01-12 17:18 0次下载
    初识“<b class='flag-5'>位</b><b class='flag-5'>带操作</b>”

    STM32带操作

    1. 什么是带操作?学习 51 单片机的时候就使用过位操作,通过关键字 sbit 对单片机IO口进行定义。但STM32没有这样的关键字,
    发表于 01-13 14:01 5次下载
    <b class='flag-5'>STM32</b>的<b class='flag-5'>位</b><b class='flag-5'>带操作</b>

    STM32带操作-详解-计算过程

    前言这篇文章主要用来讲解STM32带操作,学习过51单片机的应改了解,在控制51单片机IO引脚时,只需要向某一个IO口赋值就可以实现,对应IO口的输出高或地。那么
    发表于 01-17 10:43 5次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>位</b><b class='flag-5'>带操作</b>-详解-计算过程

    八、STM32带操作

    一、带区与带别名区(一)带介绍1、带操作在学习51单片机时就已经使用过位操作,比如使用s
    发表于 01-18 11:12 8次下载
    八、<b class='flag-5'>STM32</b><b class='flag-5'>位</b><b class='flag-5'>带操作</b>

    STM32F407入门开发: 带操作

    STM32F407的带操作可以实现类似51单片机寄存器的操作方法,操作GPIO口代码简洁方便
    的头像 发表于 05-28 13:50 3655次阅读
    <b class='flag-5'>STM32</b>F407入门<b class='flag-5'>开发</b>: <b class='flag-5'>位</b><b class='flag-5'>带操作</b>

    stm32带操作有什么用

    STM32带操作是一种在ARM Cortex-M微控制器中使用的特殊技术,它允许同时处理多个位,并且可以提高代码效率和性能。在这篇文章,我将详细介绍
    的头像 发表于 12-22 16:02 1383次阅读

    STM32开发运算以及带操作

    STM32开发运算以及
    的头像 发表于 02-02 14:38 1615次阅读