暫存器名稱和位址的對映分析

2021-10-21 06:40:50 字數 1687 閱讀 9776

同學們在學習stm32時,會看不懂mdk中那些結構體是怎麼與暫存器位址對應起來的。這裡做乙個簡要的分析。

1)51微控制器:

首先我們看看51中是怎麼做的。51微控制器開發中經常會引用乙個reg51.h的標頭檔案,下面我們看看他是怎麼把名字和暫存器聯絡起來的:

sfr p0=

0x80

;//關鍵字sfr 宣告位址和名稱的對映

p0=0x00

;//將0x00賦值給p0口的8位(51微控制器一組io為8位)

sfr也是一種擴充資料型別,點用乙個記憶體單元,值域為0~255。利用它可以訪問51微控制器內部的所有特殊功能暫存器。如用sfr p1 = 0x90這一句定義p1為p1埠在片內的暫存器。然後我們往位址為0x80的暫存器設值的方法是:

p0=value;
2)stm32:那麼在stm32中,是否也可以這樣做呢??答案是肯定的。肯定也可以通過同樣的方式來做,但是stm32因為暫存器太多太多,如果一一以這樣的方式列出來,那要好大的篇幅,既不方便開發,也顯得太雜亂無序的感覺。所以mdk採用的方式是通過結構體來將暫存器組織在一起。下面我們就講解mdk是怎麼把結構體和位址對應起來的,為什麼我們修改結構體成員變數的值就可以達到操作對應暫存器的值。這些事情都是在stm32f10x.h檔案中完成的。

gpioa->odr=

0x00000000

//為gpioa的odr暫存器位址賦值0x00000000

二,以gpioa為例說明stm32暫存器和名稱的對映:gpioa下的某個暫存器,掛載在gpioa下,位址為gpioa基位址+偏移量

gpioa掛載在apb2匯流排,位址為apb2匯流排基位址+gpioa偏移量

abp2掛載加外設基位址,位址為外設基位址+abp2偏移量

原始碼中可以找到:

//外部匯流排基位址

#define periph_base ((uint32_t)0x40000000)

//apb2基位址=外部匯流排基位址+偏移量

#define apb2periph_base (periph_base + 0x10000)

//gpioa基位址=apb2基位址+偏移量

#define gpioa_base (apb2periph_base + 0x0800)

//gpioa將位址順序分配給7個32位暫存器(結構體分配)

#define gpioa ((gpio_typedef*)gpioa_base)

//將暫存器位址對映到7個32位暫存器,分別控制

typedef

struct

gpio_typedef;

在stm32手冊中:gpio暫存器位址映像如下:

如此,實現stm32暫存器名稱和位址之間的對映關係.

暫存器位址對映

目錄 暫存器位址對映 暫存器位址對映關係 mdk5 中的位址關係以及查詢方法 gpiob的埠位址 埠位址如何對映到具體暫存器的位址?暫存器位址與埠位址的關係 apb2外圍裝置匯流排的位址 外圍裝置基位址 綜上所述 如上圖所示,進行了一次強制型別轉換,其實位址這個東西就是代表儲存的地點,任何型別對他來...

暫存器對映

在block2這塊區域,設計的是片上外設,它們以4個位元組為1個單元,共32位,每乙個單元對應不同的功能,當控制這些單元時,就可以驅動外設工作,可以找到每個單元的起始位址,然後通過c語言指標的操作方式來訪問這些單元。根據每個單元功能的不同,以功能為名給這個記憶體單元取乙個別名,這個別名就是暫存器。給...

位址暫存器

段位址 偏移 左邊的是段位址 右邊的是偏移位址 8086 cpu 字長16位 資料匯流排20條 cpu最多定址空間為2 16 資料匯流排卻有20條 cpu無法只能定址16位 無法定址20位 那麼怎麼解決呢 既然乙個暫存器無法儲存20位那就拿兩個cpu來儲存 乙個用來存段位址 乙個用來存偏移位址 實體...