精华内容
下载资源
问答
  • stm32 位带操作

    2021-01-06 08:21:44
    STM32 位带操作什么是位操作51单片机STM32位带别名区BitBand膨胀关系形象举例:位带操作的头文件编写 什么是位操作 51单片机 对于我么熟悉的51单片机,有了==sbit(特殊功能寄存器位)==关键字后,我们可以直接读写...
  • stm32位带操作

    2018-06-17 16:19:37
    stm32位带操作,各种库各种有!!!!!!!!!!!!!!!!!!!!
  • STM32F4(位带操作

    2020-12-24 16:57:17
    STM32F4 的 位带操作 主体是库函数的 只是一个小demo 还有一部分笔记
  • 本文档结合权威指南并查阅相关资料,自己整理而成,里面代码均已验证。
  • STM32F4xx位带操作

    2020-07-25 17:28:15
    本文给大家分享了STM32F4xx位带操作
  • 使用位带操作实现STM32开发板上LED灯闪烁实验。
  • 快速理解STM32位带操作原理和用途

    千次阅读 2020-08-17 21:10:00
    关注、星标公众号,不错过精彩内容作者:strongerHuang微信公众号:strongerHuang说到位带操作,可能很多人比较陌生,但说到控制IO,你肯定不会陌生。有的项目为了最大效...

    关注、星标公众,不错过精彩内容

    作者:strongerHuang

    微信公众号:strongerHuang

    说到位带操作,可能很多人比较陌生,但说到控制IO,你肯定不会陌生。有的项目为了最大效率控制IO,使用位带操作。下面就来简单说说未带操作的内容。

    一、初识位带操作

    Bit-banding简称位带,有人也叫位段。支持位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。

    很多朋友是从学习51单片机过来的,都知道P1.1这个引脚可以单独控制,我们操作的这个引脚就是一个Bit位。

    我们都知道在STM32中不能直接操作寄存器的某一个Bit位,比如单独控制PA端口输出数据寄存器中的ODR1,如下图:

    STM32F1内核Cortex-M3早就考虑到了这个问题,为了能达到直接操作ODR1这类Bit位,就在内核中开辟了一块地址区域(位带别名):可以将ODR1这类Bit位(位带区)映射到位带别名区域对应的地址,只需要操作映射后的地址,就可以实现操作这个ODR1位了。

    简单来说就是映射操作,只是这个映射操作有许多约定要遵循。

    二、位带操作中的映射关系

    在Cortex-M3中有两个区实现了位带操作,其中一个是 SRAM区的最低 1MB 范围,第二个则是片内外设区的最低 1MB 范围。

    这两个区域如下图红色标注的区域:

    这两个1MB将分别映射到另外两个地址区域:

    1.SRAM区的最低1MB(0x2000 0000 --- 0x200F FFFF) 映射到(0x2200 0000 --- 0x23FF FFFF)。

    2.片内外设区的最低1MB(0x4000 0000 --- 0x400F FFFF)映射到(0x4200 0000 --- 0x43FF FFFF)。

    其实就是映射到偏移(距离自身)0x0200 0000外的32MB空间(位带别名区),如下图SRAM区映射关系:

    提示:看图中的有颜色的8Bit,它是映射到偏移0x0200 0000外的32Bit(4Byte)空间上。我们读写0x2200 0000这个地址,其实就是操作0x2000 0000中的Bit0位。

    这就是所谓的“比特的膨胀对应关系”,1Bit膨胀到32Bit(4字节)。4字节对应的就是那1Bit位的地址,而这个地址中的数据只有最低一位才有效(LSB)。

    解释上面多处出现的关键词

    位带区:支持位带操作的地址区;

    位带别名:对别名地址的访问最终作用到位带区的访问上;

    三、位带区->别名区计算公式

    位带操作的主要目的:通过Bit位地址(A)计算得到别名区地址(AliasAddr)。

    1.SARM区计算公式

    AliasAddr = 0x22000000 + ((A‐0x20000000)*8+n)*4 = 0x22000000+(A-0x20000000)*32 + n*4

    2.片上外设区计算公式

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

    由于映射关系一样,所以公式原理也一样,只是地址不一样。计算公式需要结合上图比特的膨胀对应关系来理解。

    *8:1个字4个字节;

    *4:1个字节8Bit;

    四、代码实现

    利用上面计算公式,代码实现的过程就很简单,我们的目的就是对“AliasAddr”这个地址进行读写操作。

    1.RAM位带操作宏定义

    #define BITBAND_RAM(RAM, BIT) (*((uint32_t volatile*)(0x22000000u + (((uint32_t)&(RAM) - (uint32_t)0x20000000u)<<5) + (((uint32_t)(BIT))<<2))))

    2.外设寄存器位带宏定义

    #define BITBAND_REG(REG, BIT) (*((uint32_t volatile*)(0x42000000u + (((uint32_t)&(REG) - (uint32_t)0x40000000u)<<5) + (((uint32_t)(BIT))<<2))))

    方便大家对比,给一个截图:

    A.RAM地址0x20001000Bit1位写0

    BITBAND_RAM(*(uint32_t *)0x20001000, 1) = 0;

    B.读取RAM地址0x20001000Bit1

    uint8_t Val;

    Val=BITBAND_RAM(*(uint32_t *)0x20001000, 1);

    C.对PA1数据输出寄存器输出1

    BITBAND_REG(GPIOA->ODR, 1) = 1;

    D.读取PA1数据输出寄存器

    uint8_t Val;

    Val=BITBAND_REG(GPIOA->ODR, 1);

    这里就是操作某一个地址,类似于操作指针一样;

    五、位带操作优缺点

    1.优点

    相比直接操作寄存器代码更简洁,运行效率更高。避免在多任务,或中断时出现紊乱等。

    2.缺点

    操作不当(传入地址参数不对),容易出现总线Fault。

    六、说明

    关于Cortex-M3的位带操作,详情可以参看Cortex-M3技术参考手册(权威指南)。

    我了解Cortex-M处理器中,Cortex-M3、Cortex-M4都具有位带操作,Cortex-M0,Cortex-M+好像不支持。具体可以下载相关的技术参考手册查看。

    推荐阅读:

    基于STM32的Keil、IAR仿真打印输出

    CMSIS RTOS API,内核通用API接口

    Linux 内核的 100% 自由版本 GNU Linux-libre 5.8 发布

    关注微信公众号『strongerHuang』,后台回复“1024”查看更多内容,回复“加群”按规则加入技术交流群。

    长按前往图中包含的公众号关注

    展开全文
  • 电子-stm32位带操作全攻略.doc,单片机/嵌入式STM32-F3/F4/F7/H7
  • STM32位带操作总结---浅显易懂

    千次阅读 多人点赞 2019-07-15 09:06:34
    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能儿”来说,你不把它...

    正在准备做毕业设计,配置LED_Config()的时候,又看到了位带操作的宏定义,我又嘀咕了,什么是位带操作,一年前在使用位带操作的时候,就查阅过好多资料,Core-M3也看过,但是对于博主这种“低能儿”来说,你不把它说的白一点,就是感觉理解的不够透彻,于是今天又一次,查阅了各种手册,也算是基本弄懂了,鉴于博主的个人特点,所以本人的介绍也会十分浅显易懂,希望能帮到各位!

    首先,抛砖引玉,来两个问题:

      1)为什么STM32里面会有位带操作?

      2)STM32里面的位带操作是什么意思?

    我也不想去弄什么官方定义了,来两个例子,相信各位心里即使不能给出一个确切的定义,也不会再去纠结这个问题,

    答:

      1)51单片机相信各位都用过,假设P1.1的IO口上挂了一个LED,那么你单独对LED的操作就是P1.1 = 0或P1.1 = 1,注意,是你可以单独的对P1端的第一个IO口进行操作,然而STM32是不允许这样做的,那么为了像51单片机一样能够单独的对某个端的某一个IO单独操作,就引入了位带操作这样的概念,简而言之,言而总之,就是为了去单独操作32里面PA端的第1个IO口,所以才有了位带这样的操作机制。

      2)打个形象的比方,以某个村,就张村把,该村有3户人家分别为A,B,C,我想给张村的A送礼,但是明文规定,不能给具体的个人送礼,但是可以给村委会送礼,那我该怎么办呢,OK,即日起,A不叫A了,改名叫做村委会1,B和C分别改叫做村委会2和村委会3,哦了,可以给A送礼了,虽然我送礼的对象是村委会1,听起来好像比个人级别高一点,但是最终收到礼物的还是个人A。同理,STM32不允许对某个端的某一个IO口进行操作,也就是PA.1 = 0或者PA.1 = 1这样的操作是非法的,好了,那我就给PA.1起个别名,将原来PA.1的地址扩展成一个32位的字地址,对32位的地址进行操作,这个是STM32允许的,必需可以的,STM32对所有的寄存器配置,都是对某个32位地址的操作,因此说白了,就是某个IO端口进行操作,这就是位带操作。

      大白话说完,还是得回归官方介绍,不过这时候你在看,应该会好很多了。我们一步一步来,首先你应该知道的

       位带区,和位带别名区,位带区,就是就是你想单独操作的IO的区域,也就是PA,PB……等这一堆IO口的内存所在区,而位带别名区,就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。

     

      OK,现在我们应该能够知道,你想进行位带操作去操作某个IO口的某一位,那么在STM32的环境下,你应该去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了,接下来,我们要去找位所对应的地址了。

      官方给出了相应的计算公式,我们以外设部分为例,毕竟用的多的还是外设部分的端口,具体到PA.1把

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

      AliasAddr是别名区的地址,A是GPIOA->ODR的地址,n是该端口的上的某一位,这里就是1,通过这个公式你可以找到对应的别名区的地址,接下来就是对这个地址进行操作了,你给他写1,该位输出1,写0,就输出0。

      在这里我想解释以下,为什么这个公式是这个样子的,因为我也思考了很久!借助于下面这个图:

      

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

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

      这部分是膨胀公式,乘8是先把单元内的每一位上升到字节的高度上,这样,你想设置第二位,就直接在原来的基地址上+2就可以了,确定完是第几位,再乘4,就是把位再上升到字的高度上,也就是每一位对应一个32位的字,这样最终的地址转换就完成,关键还是要注意两点,一是,两部分地址的互相转换,主要是每一部分的基地址。二就是位上升的32位地址这样的一个方法概念。

      说到这里,基本已经介绍了80% 了,多数情况下,大家见到的代码,应该是以下这个样子,一共分为三步,

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

       第一步,就是我们上面分析的,得到位带别名区域的32位地址,至于第二步嘛,其实就是一个转换,给各位举个例子,如下,我想直接访问0x00000001这个地址,并且给这个地址写1,该怎么做呢,

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

      第二步的操作就是将第一步得到的32位地址,给转换成一个指针变量,并且操作这个地址里的值,唯一的区别,就是由于安全的考虑,多加了一个volatile 这样的关键字,但是他不会对我们产生其他的影响,而第三步,就是将前两部,结合在一起,根据传入的addr和bit计算得到32位的地址,然后强制类型转换,使得我们可以去操作这个地址里的值,OK,大功告成,整个的思路基本就是这样,应该不是很难把,至此相信各位已经能够理解什么是位带,以及该怎么去操作位带。

      接下来,再写一种常用的位带操作的用法。由于上面的传入的addr是整个区域的基地址,因此,当你想去使用不同GPIO口的时候,采用上面的写法,你将麻烦需要多写好几个步骤,我自己常用的一种写法是下面这个样子的。

     # define BITBAND_REG(Reg,Bit) (*((uint32_t volatile*)(0x42000000u + (((uint32_t)&(Reg) - (uint32_t)0x40000000u)<<5) + (((uint32_t)(Bit))<<2))))

      # define LED0 BITBAND_REG(GPIOF->ODR,9)
      # define LED1 BITBAND_REG(GPIOF->ODR,10)

      短短的三行代码,就已经解决了所有问题,输出控制小灯泡,即使再换用其他的端口,改动括号内的内容即可。Reg是操作部分的基地址,Bit就是第几位了。

      原理就是,我已经知道,GPIO部分的基地址是0x42000000u ,那么我每次传入具体的GPIOx->ODR寄存器,在定义中,对其取地址,这样可以灵活访问各个不用IO输出,相当于把我们的操作给具体化了,<<5,<<2这两个就是乘32,乘4这样的概念,只不过位操作,会更快一点。

    https://www.cnblogs.com/szhb-5251/p/6662417.html

    展开全文
  • stm32位带操作详细说明 PDF文档
  • 本文档详细讲解了STM32位带操作,希望能帮助广大学习爱好者
  • stm32位带操作

    千次阅读 2017-10-12 09:40:34
    stm32相对于8位微控制CPU来说实在强大的不得了,依稀记得51控制I/O空的时候是:sbit LED1 = P0^0;然而我们在32却没有想“sbit”类似的关键字进行I/O的某位进行操作。于是引入了“位带操作的概念”,什么事位带操作?...
    stm32相对于8位微控制CPU来说实在强大的不得了,依稀记得51控制I/O空的时候是:sbit LED1 = P0^0;然而我们在32却没有想“sbit”类似的关键字进行I/O的某位进行操作。于是引入了“位带操作的概念”,什么事位带操作???标准的定义是:通过访问位带别名区来实现,即通过将每个比特位膨胀成一个32位字,当访问这些字的时候就达到了访问“位”的目的,这就是位带操作!!!是不是很抽象?首先我们先看看寄存器的图:


    红色箭头位置表示:stm32支持位带操作的区域是 SRAM 区的最低 1MB 范围(APB1/2 ,AHB外设)和片内外设区的最低 1MB范围。

    我们以点亮一盏灯LED为例,则查到寄存器,得知是GPIOC,该地址C口的输出寄存器地址是0x4001100c,属于片内外区的范围(0x40000000~0x400ffffff),一个GPIO端口32为,如下图所示:


    上述所知,LED的输出控制寄存器的地址是0x4001100c ,假设我们要访问第2个LED,则是GPIOC^1引脚,也就是GPIOC bit[1],

    stm32访问的最小单元是地址,所以无发访问到GPIOC bit[1],这个时候,我们要通过位带访问别名区来控制GPIOC bit[1],,也就是起始地为

    0x42000000 大小为32Mb的单元。这时我们在想想概念,通过访问位带别名区来实现,即通过将每个比特位膨胀成一个32位字,当访问这

       些字的时候就达到了访问“位”的目的。所以我们理解为把地址为0x4001100c的8个bit映射到地址0x42000000 大小为32Mb的单元。并且每个bit扩展为32位,如图所示:



    总结:

    1.为什没不可以直接访问位?

    答:访问的最小单元是“字节”,而不是位,其中也没有“sbit”类似的关键字,无法访问到具体的地址里的某个BIT

    2.怎么解决?

    说白了,就是把某危楼(片内外设区)的一家(一个地址)8口人(8bit)搬到一个另地方(位带别名区),并且,每个人(每一位bit)住上了更大的房子(变成32bit)

    展开全文
  • 位带操作的概念其实 30 年前就有了,那还是8051 单片机开创的先河,如今,CM3 将此能力进化,这里的位带操作是 8051 位寻址区的威力大幅加强版。
  • STM32 位带操作详解

    千次阅读 2018-03-10 14:27:57
    转转:http://blog.csdn.net/a493203176/article/details/38559519
    转转:http://blog.csdn.net/a493203176/article/details/38559519
    展开全文
  • STM32F4位带操作头文件 直接可用

    热门讨论 2014-01-25 18:46:57
    STM32可以通过位带实现位操作。这个头文件已经配置好了位带操作,只要包含头文件就可以在程序中使用位带操作
  • STM32位带操作分析

    千次阅读 2017-06-25 22:02:46
    8051单片机可以直接对某一位IO进行读写操作,而Cortex-M3的位带操作是8051位寻址区的加强版。使用位带操作后,可以使用普通的加载/存储指令对单一的比特...位带操作的原理 位带操作的最终目的是想对位带区的比特位
  • STM32 IO口位带操作

    千次阅读 2019-01-05 01:33:35
    M4中有4GB的访问空间,访问空间有两个比较重要的地址,寄存器映射地址,...使用位带操作能够一步到位,方便快捷。 每个端口都有对应的寄存器地址,查看库函数可以看到对寄存器的的操作。 如: void GPIO_Toggl...
  • stm32L152这款32的芯片资料比较少,我传的这个程序是关于此芯片的位带操作,看了一下午,总算理解,然后在正点原子历程的基础上加以修改完善,目前测试通过,并且用了一块ZX240160M1a的液晶,这个液晶驱动资料也比较...
  • stm32 GPIO 带位操作

    2015-04-01 21:25:49
    STM32带位操作。72Mmz 主频的IO 口翻转时间是 0.18 US 对于需要提高IO 口操作的,值得一看
  • STM32位带操作详解

    千次阅读 2014-08-14 15:45:09
    STM32支持了位带操作(bit_band),有两个区中实现了位带。其中一个是SRAM 区的最低1MB 范围,第个则是片内外设 区的最低1MB 范围。这两个区中的地址除了可以像普通的RAM 一样使用外,它们还都有自己的“位带别名区...
  • STM32位带操作

    千次阅读 2018-10-25 23:49:27
    51单片机中通过关键字sbit来实现位定义,STM32中则是通过访问位带别名区的地址来实现对某一位的操作。 例如51单片机中可以实现以下操作 #define LED_ON 0 sbit LED = P2^0; LED = LED_ON; 而现在STM32的位段、...
  • STM32f0系列GPIO位带操作程序 很方便使用 可以像51单片机那样直接控制某一位的GPIO
  • stm32f0系列的模板,里面的启动文件是030其他芯片更换启动文件就好
  • STM32 M4 位带操作

    2014-08-17 12:30:15
    网上看到的位带代码大部分是M3的,我移植了一个M4的代码,在STM32f429上测试通过。 位带确实比库函数方便一些,尤其在模拟协议的时候。
  • STM32F407 位带操作操作 驱动12864 位操作像51一样操作F407的IO口。
  • 我们在学习STM32到一定阶段可能会了解操作系统,然后便有这种问题产生,下面我就来粗略说说“操作系统与裸机的区别,以及STM32能运行什么操作系统,能运行linux系统吗”等问题。 操作系统与裸机的区别 裸机运行的...
  • 关于STM32的flash操作

    2020-07-19 01:05:05
    说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装芯片配置、芯片ID、自举程序等等。当然, FLASH还可以用来装数据。
  • STM32 - GPIO 的位带操作

    千次阅读 2019-02-25 17:06:10
    我采用得是STM32F10RC 参考得是STM32普中科技的给出得例子:https://www.bilibili.com/video/av30149282/?p=45(这里给出网址) https://blog.csdn.net/bulebin/article/details/73730141 这个博文还可以 ps:在...
  • STM32中的位带操作

    2019-05-21 20:38:49
    STM32中的位带操作 如果你使用过STM32,相比一定听说过位带操作吧!这个其实就是类似于51单片机中的位操作,在51单片机中通过使用sbit来定义一个位,而在STM32中则用到了我们所说的位带操作。 这里我们只涉及到了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 52,787
精华内容 21,114
关键字:

stm32位带操作