STM32的存儲映射是靠基地址和地址偏移實現的。
32位的M3有4GB的尋址空間,其中用於片上外設的有512MB,基地址為0x40000000。
M3各外設基地址,包括片上外設、片上靜態RAM和FLASH。特別要注意的是所有外設都是掛載在總線上,有AHP、APB1、APB2總線。從各外設基地址定義就可以很清楚知道該外設是掛在哪個總線上。
與參考手冊對照起來看更清楚:
以GPIO為例,如何實現GPIOA寄存器控制?
首先找到GPIOA對應的基地址,GPIOA是掛在APB2總線上的,相對於地址總線偏移量為0x800,計算后與參考手冊地址一致。
再來看看GPIO寄存器結構體:
7個32位寄存器及其對應偏移量可以查閱參考手冊:
如想獲得GPIOA_CRH(端口配置高寄存器)的地址,只需要將抵地址偏移量0x04加上GPIOA的基地址0x40010800就好了。這種通過寄存器地址直接配置寄存器各個位的方法很容易出錯,還好ST公司為我們封裝了庫,庫其實就是將各個寄存器地址通過分解為基地址和偏移地址,用宏來定義地址,從字面意義就可以知道該外設/寄存器地址了。用結構體來定義各個外設寄存器,使用C/C++強大的指針,只需要直接調用庫函數就可以實現相應的功能。