stm32儲存器映像和標準庫中定義外設位址的方法

2022-07-22 04:51:10 字數 2101 閱讀 7215

結合儲存器映像理解stm32標準庫中定義外設位址的方法。

stm32f103zet6是32位的。它所能訪問的位址空間範圍為2^32=4gb,把4gb分為8個block,分別為block0-block-7。把這8個block用於不同的用途。

圖1

圖2從上面的圖2中可以看到block2作為外設的位址,也就是說我們操作的外設都在block2中。block2的起始位址是0x4000 0000。這些外設包括哪些?看下面圖3上,所有apb1、apb2、ahb上的外設都在這個block2中。

#define periph_bb_base        ((uint32_t)0x42000000) /*!< peripheral base address in the bit-band region */

//標準庫中定義了外設起始位址(block2的起始位址)

圖3我們操作的外設都在block2中,而外設又必定在apb1、apb2、ahb中的某一條匯流排上。那apb1、apb2、ahb在block2中怎麼排布?圖4上列出來3條匯流排的位址,可以看到apb1匯流排的起始位址和block2的起始位址是一樣的。

#define apb1periph_base       periph_base        //apb1的起始位址是block2的起始位址

#define apb2periph_base (periph_base + 0x10000) //apb2的起始位址是在block2的位址上偏移得到的

#define ahbperiph_base (periph_base + 0x20000) //ahb的起始位址是0x4001 8000(sdio的位址),標準庫中ahbperiph_base是0x4002 000(dma1外設)

圖4從圖5中列出了apb1匯流排上的外設。觀察發現apb1匯流排上的第乙個外設是tim2定時器。

#define tim2_base             (apb1periph_base + 0x0000) //標準庫中定義的定時器2的位址,+0x0000是因為tim2地偏移位址是0,

//比如,apb1匯流排上第二給外設是tim3,偏移位址0x0400,它的寫法就是

圖5經過上面的外設基位址+偏移位址得到了tim2的起始位址,tim2這個外設有很多暫存器,第乙個暫存器偏移位址是0x00。每個暫存器的偏移位址都是0x04。這裡沒有再用上面的巨集定義的方法去通過基位址+偏移位址去計算每個外設的暫存器的位址,通過一種更巧妙的方法。

因為暫存器是32位的,也就是4個位元組。暫存器都是記憶體對齊的(暫存器用不了32位的,剩多少保留多少),用結構體的方式去強制轉換一tim2的起始位址。這個利用了結構體中變數對齊和外設暫存器對齊的方式。

#define tim2                ((tim_typedef *) tim2_base)
結構體內部:

typedef struct

tim_typedef;

總結一下:

stm32中,標準庫中定義乙個外設位址的方法是,外設起始位址(block2起始位址)+匯流排偏移位址(apb1、apb2、ahb)+具體外設偏移位址(tim、gpio等)。最後把具體外設偏移位址通過結構體型別強制轉換成結構體變數。

初始STM32標準庫

庫檔案一開始包含五個檔案 htmresc libraries project utilities stm32f10x stdperiph lib um.chm下面一一介紹 裡邊只有兩張,一張cmsis的logo,另一張是st的logo 裡邊是st官方實驗板的例程,目前不會用到。這個是庫幫助文件,我們...

STM32儲存器對映

stm32儲存器對映 1 cortex m3儲存器對映cm3的位址空間有4g,但它只對這4g空間作了預先的定義,把4g空間分成8個塊,每塊大小為512m,並指出各段該分給哪些裝置。具體的實現由晶元廠商決定,廠商可以設計出具有自己特色的產品。下圖是cm3的儲存器對映圖 來自cm3權威指南 1.1 st...

STM32儲存器結構 儲存器對映

問題 1 什麼是儲存器對映?是怎麼乙個運作過程?2 stm32總體架構 3 cm3核心結構 以下 1 stm32系統結構 要想深刻理解stm32的儲存器,需要首先知道stm32的系統結構。如figure 1,是stm32系統結構框圖。根據stm32 reference manual rm0008 中...