ARM单片机寄存器地址为什么相差4

  • 学习7323次

LPC1114寄存器列举

上图是LPC1114用户手册系统控制模块(SYSCON)中的部分寄存器,请看红色框内,地址相差0x4。

stm32寄存器例举

上图是STM32内部RCC寄存器的部分寄存器,请看红色框内,地址相差0x4。

为什么会相差4?很多初学者问我这个问题,高手就请绕过吧。

计算机、单片机都是以字节为单位进行存储的。这里的4就是4个字节的意思。上面列举的LPC1114是ARM Cortex-M0内核,STM32是ARM Cortex-M3内核,这两ARM单片机都是32位的。1个字节是8位,4个字节就是32位。32位单片机的寄存器基本上是32位的,8位单片机的寄存器基本上也是8位的。

ARM寄存器的地址一般放到了0x40000000开头位置的地址。

这里的0x40000000、0x40000001、0x40000002…这些都是一个地址,也是一个字节,就是8个位,32位的寄存器都是32位的,所以,你看到的地址就都是0x40000000、0x40000004、…这样以4为倍数的地址了。

打开你曾经用过的reg51.h文件,看看普通51单片机的寄存器地址映射,一共不到100个寄存器,几下就写完了。但是ARM单片机内部的模块非常多,寄存器也非常多,寄存器地址映射文件如果像51那样写,也可以,但是还有一种更有利于程序阅读和书写的而方法,就是利用结构体,所以当你打开ARM单片机的寄存器映射文件后(例如lpc11xx.h、stm32f10x_map.h),你会看到,他们的地址全部采用结构体的形式,一个同类模块的所有寄存器被放在了同一个结构体内部。在以后写程序的时候,不论是书写还是阅读,都有很大的作用。例如下面一条语句:

LPC_SYSCON->PRESETCTRL = 0x1;

从语句中就可以看出,这是在对SYSCON模块中的PRESETCRTL寄存器进行配置。

 

发表评论