做嵌入式开发的,一定免不了和硬件打交道。我们通过读写寄存器的方式来管理相关的硬件,这里的寄存器并不是CPU空间中的寄存器,我们的寄存器实际上是一个地址单元(属于特殊寄存器),烧写程序时要被映射到地址空间上。所以我们通过读写地址这种方法来访问寄存器是避免不了的。

方法:

(*(volatile unsigned int *)0x11400020) = 0x22   //向0x11400020这个地址指向的空间写入0x22值
  • * 0x11400020 表示为要访问的地址 ,因为地址类型 前面要加上一个 * 说明
  • *(unsigned int *)0x11400020 地址是没有类型的,我们要根据写入的数据给它转换成对应的类型,前面加(unsigned int *)进行转换
  • (*(volatile unsigned int *)0x11400020) 由于我们访问的是硬件地址,有时候数据是不受我们控制的(易变的)。所以加上volatile 修饰符,避免编译器自作主张的优化

 

为了方便,我们可以通过宏将前面的地址给‘封装’起来:

#define  ADDR    (*(volatile unsigned int *)0x11400020)

...
...

ADDR = 0x22; //向地址ADDR 写入 0x22