STM32-GPIO——位带操作

1.位带介绍:位操作就是可以单独的对一个比特位读和写, STM32通过访问位带别名区来实现。

在STM32中,有两个地方实现了位带,一个是SRAM区的最低1MB空间,另一个是外设区最低1MB空间。 这两个1MB的空间除了可以像正常的RAM一样操作外,他们还有自己的位带别名区,位带别名区把这1MB的空间的每一个位膨胀成一个32位的字, 当访问位带别名区的这些字时,就可以达到访问位带区某个比特位的目的。

 2.外设位带区:

外设外带区的地址为:0X40000000~0X40100000,大小为1MB,这1MB的大小在103系列大/中/小容量型号的单片机中包含了片上外设的全部寄存器, 这些寄存器的地址为:0X40000000~0X40029FFF。外设位带区经过膨胀后的位带别名区地址为:0X42000000~0X43FFFFFF, 这个地址仍然在CM3 片上外设的地址空间中。在103系列大/中小容量型号的单片机里面,0X40030000~0X4FFFFFFF属于保留地址, 膨胀后的32MB位带别名区刚好就落到这个地址范围内,不会跟片上外设的其他寄存器地址重合。

STM32的全部寄存器都可以通过访问位带别名区的方式来达到访问原始寄存器比特位的效果。

 3.SRAM位带区:

SRAM的位带区的地址为:0X2000 0000~X2010 0000,大小为1MB,经过膨胀后的位带别名区地址为:0X2200 0000~0X23FF FFFF, 大小为32MB。操作SRAM的比特位这个用得很少。

4.位带区和位带别名区地址转换:

位带区的一个比特位经过膨胀之后,虽然变大到4个字节,但是还是LSB才有效。有人会问这不是浪费空间吗, 要知道STM32的系统总线是32位的,按照4个字节访问的时候是最快的,所以膨胀成4个字节来访问是最高效的。

我们可以通过指针的形式访问位带别名区地址从而达到操作位带区比特位的效果。那这两个地址直接如何转换,我们简单介绍一下。

5 外设位带别名区地址:

对于片上外设位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=31)(n的范围根据具体寄存器能控制的位决定),则该比特在别名区的地址为:

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

 0X42000000是外设位带别名区的起始地址,0x40000000是外设位带区的起始地址,(A-0x40000000)表示该比特前面有多少个字节, 一个字节有8位,所以*8,一个位膨胀后是4个字节,所以*4,n表示该比特在A地址的序号,因为一个位经过膨胀后是四个字节,所以也*4。

6.SRAM位带别名区地址:

对于SRAM位带区的某个比特,记它所在字节的地址为 A,位序号为 n(0<=n<=31)(n的范围根据具体寄存器能控制的位决定),则该比特在别名区的地址为:

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

A:表示我们要操作的那个位所在的寄存器的地址

n:位号

理解要点:位带区的一个位在位带别名区会被膨胀成4个字节

把一个ODR寄存器其中的一个位用位带别名区的32位地址表示,这就是把1位扩展成32位的一个地址(这个地址是4个字节(一个字节8位,4*8=32))。n为第多少位。

7.统一公式:

// 把“位带地址+位序号”转换成别名地址的宏
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x02000000+((addr & 0x00FFFFFF)<<5)+(bitnum<<2))

 

addr & 0xF0000000是为了区别SRAM还是外设,实际效果就是取出4或者2,如果是外设, 则取出的是4,+0X02000000之后就等于0X42000000,0X42000000是外设别名区的起始地址。 如果是SRAM,则取出的是2,+0X02000000之后就等于0X22000000,0X22000000是SRAM别名区的起始地址。

addr & 0x00FFFFFF 屏蔽了高三位,相当于减去0X20000000或者0X40000000,但是为什么是屏蔽高三位? 因为外设的最高地址是:0X20100000,跟起始地址0X20000000相减的时候,总是低5位才有效, 所以干脆就把高三位屏蔽掉来达到减去起始地址的效果,具体屏蔽掉多少位跟最高地址有关。SRAM同理分析即可。 <<5相当于*8*4,<<2相当于*4,这两个我们在上面分析过。

addr;要操作的位所在寄存器的地址。

bitnum:位号,即在寄存器的第几位。

  • 12
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值