STM32-F1学习系列(8):位带

149 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

位带

Cortex-M3内核是32位,每4个字节一个单元,一个单元对应一个地址。从0x20000000-0x20100000中一共2202^{20}个字节,因此对应1MB.

位带别名区将比特位膨胀为32位,然后重新分配地址,因此对于外设区某一位,距基地址的比特位数目为(A0x40000000)×8+n(A-0x40000000)\times 8+n,重新分配地址时按照4个字节(32位)分配新地址,因此新地址变成((A0x40000000)×8+n)×4((A-0x40000000)\times 8+n)\times 4

优点

  • 便于控制GPIO的输入输出
  • 便于控制串行接口芯片的时序

比如操控LED可以通过对位带地址进行读取和写入(参考了普中视频)

#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) //转换为位带地址
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) //转换为指针
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
#define PCout(n) BIT_ADDR(GPIOC_ODR_Addr,n)