STM32位带操作

32 位带简介

        位操作,顾名思义是指单独的对某一位进行操作。在51中经常用到,可能会有人不是很理解,但是对于sbit这一关键词,应该会很熟悉。单片机中一般都是用这一个关键字来定义的,但在32中是没有这一关键字的,而是通过访问位带别名区实现的。

        在32中有两个地方实现了位带操作,SRAM区的最低1MB空间和外设去最低1MB空间,这两个区域既可以像正常的RAM一样操作外,又有自己的位带别名区,位带别名区把这1MB的空间的每一个位膨胀成一个32位的字节;通过访问这些字节,来达到访问位带区某个位的目的。

        外设位带区        地址:0X40000000~0X40100000                大小:1MB        

包含了单片机片上外设的全部寄存器,寄存器的地址为0X400000000~0X40029FFF,同构膨胀后地址为0X42000000~0X43FFFFFF。在32中0X40030000~0X4FFFFFFF属于保留地址,膨胀后的32MB位带区别名刚好就落在这个地址范围内,不会跟片上外设的其他寄存器地址重合。

转换公式         AliasAddr= =0x42000000+(A-0x40000000)*8*4+n*4

上式中乘以8 是因为一个字节有8位,乘以4是因为一个位膨胀后是4个字节,n是该位在A地址的序号,乘以4 也是因为要膨胀到4个字节。

SRAM位带区            地址:0X20000000~0X20100000                大小:1MB                         

膨胀后位带别名区        地址为0X22000000~0X23FFFFFF               大小:32

转换公式         AliasAddr= =0x22000000+(A-0x20000000)*8*4+n*4

推理同上。

上面两个公式 可以统一为下面公式

#define BITBAND(addr,bitnum)        ((addr&0XF00000000)+0X02000000+((addr &0X00FFFFFF)<<5)+(bitnum<<2))

addr&0XF00000000是为了区别是外设寄存器还是SRAM区域,得到的值是4或2;然后加上0X02000000就是两个区域的起始地址,<<5相当于乘8乘4;<<2相当于乘4。

本文为自己学习笔记,如有不对,欢迎指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值