上圖是LPC1114用戶手冊系統(tǒng)控制模塊(SYSCON)中的部分寄存器,請看紅色框內(nèi),地址相差0x4。
上圖是STM32內(nèi)部RCC寄存器的部分寄存器,請看紅色框內(nèi),地址相差0x4。
為什么會相差4?很多初學者問我這個問題,高手就請繞過吧。
計算機、單片機都是以字節(jié)為單位進行存儲的。這里的4就是4個字節(jié)的意思。上面列舉的LPC1114是ARM Cortex-M0內(nèi)核,STM32是ARM Cortex-M3內(nèi)核,這兩ARM單片機都是32位的。1個字節(jié)是8位,4個字節(jié)就是32位。32位單片機的寄存器基本上是32位的,8位單片機的寄存器基本上也是8位的。
打開你曾經(jīng)用過的reg51.h文件,看看普通51單片機的寄存器地址映射,一共不到100個寄存器,幾下就寫完了。但是ARM單片機內(nèi)部的模塊非常多,寄存器也非常多,寄存器地址映射文件如果像51那樣寫,也可以,但是還有一種更有利于程序閱讀和書寫的而方法,就是利用結構體,所以當你打開ARM單片機的寄存器映射文件后(例如lpc11xx.h、stm32f10x_map.h),你會看到,他們的地址全部采用結構體的形式,一個同類模塊的所有寄存器被放在了同一個結構體內(nèi)部。在以后寫程序的時候,不論是書寫還是閱讀,都有很大的作用。例如下面一條語句:
LPC_SYSCON->PRESETCTRL=0x1;
從語句中就可以看出,這是在對SYSCON模塊中的PRESETCRTL寄存器進行配置。