嵌入式系統 儲存器對映與暫存器對映原理

2021-10-07 07:25:10 字數 1771 閱讀 8090

圖1 儲存器對映

儲存器在產家製作完成後是一片沒有任何資訊的物理儲存器,而cpu要進行訪存就涉及到記憶體位址的概念,因此儲存器對映就是為物理記憶體按一定編碼規則分配位址的行為。值得注意,儲存器對映一般是由產家規定,使用者不能隨意更改。

圖2 stm32晶元儲存器對映

注1stm32中,i-code bus與d-code bus預設對映到0x00000000 ~ 0x1fffffff記憶體位址段;ahb系統匯流排預設對映到0x20000000 ~ 0xdfffffff和0xe0100000 ~ 0xffffffff兩個記憶體位址段;apb外設匯流排預設對映到0xe0040000 ~ 0xe00fffff記憶體位址段,但由於tpiu、etm以及rom表占用部分空間,實際可用位址區間為0xe0042000~0xe00ff000

暫存器對映是在儲存器對映的基礎上進行的。

以stm32為例,操作硬體本質上就是操作暫存器。在儲存器片上外設區域,四位元組為乙個單元,每個單元對應不同的功能。當我們控制這些單元時就可以驅動外設工作,我們可以找到每個單元的起始位址,然後通過c 語言指標的操作方式來訪問這些單元。但若每次都是通過這種方式訪問位址,不好記憶且易出錯。這時我們可以根據每個單元功能的不同,以功能為名給這個記憶體單元取乙個別名,這個別名實質上就是暫存器名字。給已分配好位址(通過儲存器對映實現)的有特定功能的記憶體單元取別名的過程就叫暫存器對映

圖3 暫存器對映

下面以gpio暫存器crl為例,先給出crl定義如下:

typedef struct

gpio_typedef;

在實際使用時,會有gpioa->crl=0x0000 0000這種寫法,表示將16進製制數0賦值給gpioa的crl暫存器所在的儲存單元。而gpioa->crl就構造了乙個暫存器對映。具體過程如下:

#define periph_base      ((uint32_t)0x40000000)
這裡屬於儲存器級別的對映,將外設基位址對映到0x40000000,可對應圖2

#define apb2periph_base       (periph_base + 0x10000)
這裡對外設基位址進行偏移量為0x10000的位址偏移,偏移到apb2匯流排對應外設區。

#define gpioa_base            (apb2periph_base + 0x0800)
這裡對apb2外設基位址進行偏移量為0x0800的位址偏移,偏移到gpioa對應區域。

#define gpioa               ((gpio_typedef *) gpioa_base)
這裡將gpioa巨集定義為gpioa基位址經過強制型別轉換為gpio_typedef的指標,這樣的作用是使gpioa結構體內對應的成員按順序填充記憶體區域,如圖3所示。因此gpioa的crl暫存器就是作為gpioa基位址後的第乙個記憶體塊,gpioa->crl的本質就是這個記憶體塊的位址,或者說是用gpioa->crl給這個位址取了個形象的別名,即暫存器對映。

暫存器對映與直接操作暫存器

一 儲存器對映 與重對映 儲存器本身不具有位址資訊,它的位址是由晶元廠商或使用者分配,給 物理儲存器分配 邏輯位址的過程就稱為儲存器對映 通過這些邏輯位址就可以訪問到相應的儲存器的物理儲存單元。如果給儲存器再分配乙個位址就叫儲存器重對映。如stm32,對於 片上外設,它們以四個位元組為乙個單元,共3...

STM32儲存器對映和暫存器對映

對於cortex m3來講,有一塊4g大小的儲存器空間。儲存器對映指的是晶元廠商為這個空間分配位址的操作。這4g空間被均勻地劃分為8個大小為512mb的儲存塊 block 並且每個塊都各具特色。下面主要介紹block1 block2。flash 起始位址為0x0800 0000,存放使用者程式和掉電...

暫存器以及嵌入式彙編語法及使用

一 嵌入式彙編語法 1 格式 1 asm 彙編語句 之前用asm 或 asm 意為 的內容是彙編語句 2 輸出暫存器 3 輸入暫存器 4 會被修改的暫存器 除第一行以外,後面帶冒號的行若不使用就都可一省略。輸入暫存器 表示在開始執行彙編 時,這裡指定的一些暫存器中應存放的輸入值,它們也分別對應著一c...