位绑定操做

  • 总存储空间4 GByte,0x0000 0000~0xFFFF FFFF

 

  • 位带区:   支持位带操做的地址区
  • 位带别名:对别名地址的访问最终做用到位带区的访问上(注意:这中间有一个地址映射过程)
  • 支持位绑定区域:
    一、SRAM区1 MByte,  位带区字节地址  A=0x2000 0000~0x200F FFFF,位序号  n=0~7
            别名区地址  AliasAddr = 0x2200 0000 + ((A-0x2000 0000)*8 + n)*4
                      = 0x2200 0000 + (A-0x2000 0000)*32 + n*4
 
         说明:A为所在字节,每一个字节8位,再加第n位。最后乘4由于一位的地址有4个字节。只能一次处理32位数据,故每一个位绑定的地址是32位。
                        若是A是ODR寄存器基址(ODR为32位,低16位有效),也能够n=0~15,详见例程绑定公式计算。
 
    二、片上外设1 MByte,  A=0x4000 0000~0x400F FFFF
              AliasAddr = 0x4200 0000 + (A-0x4000 0000)*32 + n*4
  • 代码实现
     1 #define GPIOA_ODR_A  (GPIOA_BASE+0x0c)//A口输出寄存器 ODR 基地址
     2 #define GPIOA_IDR_A  (GPIOA_BASE+0x08)
     3 #define GPIOB_ODR_A  (GPIOB_BASE+0x0c)
     4 #define GPIOB_IDR_A  (GPIOB_BASE+0x08)
     5 #define GPIOC_ODR_A  (GPIOC_BASE+0x0c)
     6 #define GPIOC_IDR_A  (GPIOC_BASE+0x08)
     7 #define GPIOD_ODR_A  (GPIOD_BASE+0x0c)
     8 #define GPIOD_IDR_A  (GPIOD_BASE+0x08)
     9 #define GPIOE_ODR_A  (GPIOE_BASE+0x0c)
    10 #define GPIOE_IDR_A  (GPIOE_BASE+0x08)
    11 
    12 #define BitBand(Addr,BitNum) *((volatile unsigned long *)((Addr&0xF0000000)+0x02000000 + ((Addr&0x000FFFFF)<<5) + (BitNum<<2)))//BitNum=0~15
    13 
    14 #define PAOut(n) BitBand(GPIOA_ODR_A,n)
    15 #define PAIn(n)  BitBand(GPIOA_IDR_A,n)
    16 #define PBOut(n) BitBand(GPIOB_ODR_A,n)
    17 #define PBIn(n)  BitBand(GPIOB_IDR_A,n)
    18 #define PCOut(n) BitBand(GPIOC_ODR_A,n)
    19 #define PCIn(n)  BitBand(GPIOC_IDR_A,n)
    20 #define PDOut(n) BitBand(GPIOD_ODR_A,n)
    21 #define PDIn(n)  BitBand(GPIOD_IDR_A,n)
    22 #define PEOut(n) BitBand(GPIOE_ODR_A,n)
    23 #define PEIn(n)  BitBand(GPIOE_IDR_A,n)
相关文章
相关标签/搜索