STM32的位带操作的理解详解

2019-01-10 15:19

STM32的位带操作的理解详解

首先要了解一个基本的概念:STM32单片机的一个地址(如:0x20000000)是一个字节,即8bit。

STM32的位带操作简单的说就是把一个地址A的8个位,分别单独的重新定义8个地址, 操作一个地址等同于操作一个位,形象的理解即为取别名。

位带区中的地址除了可以同RAM一样使用外,还带有自己的“位带别名”。 将每个位拓展为32位的字,既成了位带别名。

如:0x20000000(一个字节)拓展到32位可得8个32位的字分别是: 0x220000000 x220000040 x220000080 x2200000c 0x220000100 x220000140 x220000180 x2200001c

由此可得“位带区” 上任意地址的 “位带别名地址” SRAM :0x22000000 +((A‐0x20000000)*8+n)*4 FLASH :0x42000000 +((A‐0x40000000)*8+n)*4 既:0x22000000+ (A‐0x20000000)*32 + n*4 0x42000000+ (A‐0x40000000)*32 + n*4 别名区地址 = 位带别名区起始地址+偏移量 备注 :字节的地址: A位序号 :n(0

例 :0x22000000 + ((0x20000000 - 0x20000000 )*8+4)*4 = 0x22000010 既 :0x20000000第4位带别名区地址 \位带地址+位序号\转换别名地址

#define GPIOA_ODR_Addr (GPIOA_BASE+12) //0x4001080C #define GPIOA_IDR_Addr (GPIOA_BASE+8) //0x40010808 #define GPIOB_ODR_Addr (GPIOB_BASE+12) //0x40010C0C #define GPIOB_IDR_Addr (GPIOB_BASE+8) //0x40010C08 #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) #define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //计算bit区地址偏移

#define MEM_ADDR(addr) (*((vu32 *)(addr) )) //强制转换为指针

#define BIT_ADDR(addr, bitnum) MEM_ADDR( BITBAND(addr, bitnum) ) 再来一个宏重命名一下

#define PA0 BIT_ADDR(GPIOA_ODR_Addr, 0)

有什么好处呢?

是这样的,记得MCS51吗? MCS51就是有位操作,以一位(BIT)为数据对象的操作, MCS51可以简单的将P1口的第2位独立操作: P1.2=0;P1.2=1 ; 就是这样把P1口的第三个脚(BIT2)置0置。

而现在STM32的位段、位带别名区就为了实现这样的功能。 对象可以是SRAM,I/O外设空间。实现对这些地方的某一位的操作。

它是这样的。在寻址空间(32位地址是 4GB )另一地方,取个别名区空间,从这地址开始处,每一个字(32BIT)

就对应SRAM或I/O的一位。 这样呢,1MB SRAM就 可以有32MB的对应别名区空间,就是1位膨胀到32位(1BIT 变为1个字)

我们对这个别名区空间开始的某一字操作,置0或置1,就等于它映射的SRAM或I/O相应的某地址的某一位的操作。


STM32的位带操作的理解详解.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:团队活动推荐

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: