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

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

3天内不再提示

STM32开发中的位带操作机制

STM32嵌入式开发 来源:STM32嵌入式开发 作者:STM32嵌入式开发 2021-04-09 14:07 次阅读

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

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

32c3e2ce-9869-11eb-8b86-12bb97331649.png

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

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

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

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

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

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

#define BITBAND(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,该怎么做呢?

# define ADDR 0x00000001*(int *)ADDR = 1;

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

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

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

文章出处:【微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

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

    关注

    6032

    文章

    44513

    浏览量

    632797
  • STM32
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354729

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

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    STM32 OLED多菜单操作

    stm32  oled多菜单操作
    发表于 10-09 11:01 2次下载

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

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

    异步总线传送操作的控制机制

    存在一定的延迟,因此需要一种有效的控制机制来保证数据传输的准确性和可靠性。 异步总线概述 1.1 异步总线的定义 异步总线是一种在计算机系统中用于数据传输的通信方式,其特点是在数据传输过程,发送方和接收方的时钟
    的头像 发表于 07-23 09:17 544次阅读

    STM32H743系列支持带操作吗?

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

    关于带操作的疑问求解

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

    请问stm8s IO操作如何实现?

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

    STM32几种流行的开发环境对比

    有很多初学者在问:学习STM32,该用哪款开发工具?我首先说一下我的观点:没有最好,只有适不适合,适合自己的才是最好的。开发工具很多,各有各的特点,有优点肯定也有缺点。本文就来说说当前STM3
    的头像 发表于 04-21 08:10 2411次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>中</b>几种流行的<b class='flag-5'>开发</b>环境对比

    STM32F103RGT6带操作不成功的原因?

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

    对于STM32G4系列的MCU,其GPIO的操作是否还支持带操作

    STM32G4的memory map。GPIO是挂在AHB2总线上的。 但是手册里面没有明确找到,其别名区的起始地址。
    发表于 03-21 07:34

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

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

    STM32开发运算以及带操作

    STM32开发运算以及带操作  运算是计算
    的头像 发表于 02-02 14:38 1486次阅读

    stm32带操作有什么用

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

    STM32 TrustZone 开发调试技巧

    电子发烧友网站提供《STM32 TrustZone 开发调试技巧.pdf》资料免费下载
    发表于 12-18 11:16 2次下载
    <b class='flag-5'>STM32</b> TrustZone <b class='flag-5'>开发</b>调试技巧

    STM32开发运算以及带操作

    为了像51单片机一样能够对某个管脚单独操作,引入了带操作这样的操作机制
    的头像 发表于 11-29 14:36 775次阅读
    <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><b class='flag-5'>带操作</b>

    单片机C语言操作的编程实现:置和清零

    前面介绍了C语言编程的6种操作,分别是按与“&”、按“或|”、按取反“~”、异或“^”、左移“”。按
    的头像 发表于 11-28 09:35 6080次阅读
    单片机C语言<b class='flag-5'>位</b><b class='flag-5'>操作</b>的编程实现:置<b class='flag-5'>位</b>和清零