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。
本文为自己学习笔记,如有不对,欢迎指正。