原创 Cortex的Bit-Band简测

2009-12-3 22:14 4035 3 3 分类: MCU/ 嵌入式
在CM3中有两个区中实现了位带,一个是SRAM区的最低1MB范围;另一个则是片内外设区的最低1MB范围。SRAM的位带的实际功能暂时不知如何应用,应该是类似于应用在OS中的互斥信号之类吧。但片内外设的功能就经常应用了,模拟I2C和SPI及UART等,或者最简单的IO开关操作。
  Bit band alias(位带别名区),共32MB;Bit band region(位带)共1MB;这二者的对应关系好理解,1个字32位,把32位中的每位扩展成一个字,那么Bit band region的一个字就需要Bit band alias中的32个字了,因此也不难理解1MB的位带对应32MB的位带别名区。
  查看了下Peripheral的最低1MB,从0x4000_0000开始,至0x4010_0000。包括了全部外设寄存器,也就是说,所有外设寄存器都可以用位别名区来查看。
   ARM Cortex-M3权威指南的89页,分别别出计算位带别名区地址的两个关系式,如Peripheral计算为:AliasAddr=0x42000000+((A-0x40000000)*8+n)*4=0x42000000+(A-0x40000000)*32+n*4;
其实我的理解后一种写法更容易理解,
AliasAddr=0x42000000+(A-0x40000000)*32+n*4,
0x42000000为位别名区的起始地址;
(A-0x40000000)*32,A为寄存器地址,减去起始地址,可得出共偏移多少个字,每个字有32位,可计算出相对寄存器的起始地址;
n*4,同理,每位占4个字节,几位再乘4,得出寄存器的偏移地址;
   Cortex_m3的英文内容上的91页上的例,0x23FFFFE0=0x22000000+(0xFFFFF*32)+0*4;
这种写法我认为更容易理解,除去整个外设的基地址,只有偏移地址计算,相对更容易理解。

接着就定义了几个变量(根据万利的EK-STM32F/PS,手头唯一的CM3)

#define GPIOC_ODR_BIT0        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+0*4))
#define GPIOC_ODR_BIT1        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+1*4))
#define GPIOC_ODR_BIT2        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+2*4))
#define GPIOC_ODR_BIT3        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+3*4))
#define GPIOC_ODR_BIT4        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+4*4))
#define GPIOC_ODR_BIT5        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+5*4))
#define GPIOC_ODR_BIT6        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+6*4))
#define GPIOC_ODR_BIT7        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+7*4))
#define GPIOC_ODR_BIT8        (*(unsigned int *)(PERIPH_BB_BASE+(GPIOC_BASE+0x0C-0x40000000)*32+8*4))

 并在主程序中进行了写0和1操作,
 if(!(GPIOD->IDR&GPIO_Pin_3))
     {
        GPIOC_ODR_BIT4=1;
        GPIOC_ODR_BIT5=1;
     }
    if(!(GPIOD->IDR&GPIO_Pin_4))
     {
        GPIOC_ODR_BIT4=0;
        GPIOC_ODR_BIT5=0;
     }
 验证成功,有待进一步学习,先过做别的实验。完整示例见附件。




 

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /2 下一条