idr暫存器 嘿哈 暫存器對映

2021-10-14 14:51:25 字數 2553 閱讀 9082

上一次我們已經實現了如何直接操作暫存器位址來點亮一盞led燈,但是這樣實在是太麻煩,那麼這次要講的就是,如何實現暫存器對映,更加快捷的實現點燈(怎麼又是點燈??)

我們先來看一下上一次的**。

圖中的這些位址都是看著官方給出的文件算出來的,這樣做的缺點很明顯,就是每一次都要算,算每乙個暫存器的位置,實際上我們可以暫存器對映來做到同樣的效果。

那麼這個位址從**來的呢?可以看一下面這張圖,st把所有的儲存器分成了8個塊,直接來看(從下往上數)第三個塊(絕對不是我不知道其他塊是幹哈的!!)

那麼apb2的位址在哪呢?

在上圖紅色框中的位置,0x4001000,那麼是直接定義#define apb2periph_base  0x4001000這樣嗎?在這裡,我們往往用偏移的方式,也就是這樣:

這裡我們用外設基位址+0x10000的方式,到達apb2的位置。

那麼ahb同理(雖然用不上,但還是寫上吧...):

rcc時鐘配置同理,先在stm32f10x.h裡面定義巨集:

再回到main裡面更換

那麼最終的**就是:

"stm32f10x.h"int main(void)// 函式為空,目的是為了騙過編譯器不報錯void systeminit(void)
__stm32f10x__h#define __stm32f10x__h/*片上外設基位址  */#define periph_base           ((unsigned int)0x40000000)/*apb1 匯流排基位址 */#define apb1periph_base       (periph_base)/*apb2 匯流排基位址 */#define apb2periph_base       (periph_base + 0x10000)/* ahb匯流排基位址 */#define ahbperiph_base        (periph_base + 0x20000)/*gpioa外設基位址*/#define gpioa_base            (apb2periph_base + 0x0800)/* gpioa暫存器位址,強制轉換成指標 */#define gpioa_crl      *(unsigned int*)(gpioa_base+0x00)#define gpioa_crh      *(unsigned int*)(gpioa_base+0x04)#define gpioa_idr      *(unsigned int*)(gpioa_base+0x08)#define gpioa_odr      *(unsigned int*)(gpioa_base+0x0c)#define gpioa_bsrr        *(unsigned int*)(gpioa_base+0x10)#define gpioa_brr      *(unsigned int*)(gpioa_base+0x14)#define gpioa_lckr      *(unsigned int*)(gpioa_base+0x18)/*gpiob外設基位址*/#define gpiob_base            (apb2periph_base + 0x0c00)/* gpiob暫存器位址,強制轉換成指標 */#define gpiob_crl      *(unsigned int*)(gpiob_base+0x00)#define gpiob_crh      *(unsigned int*)(gpiob_base+0x04)#define gpiob_idr      *(unsigned int*)(gpiob_base+0x08)#define gpiob_odr      *(unsigned int*)(gpiob_base+0x0c)#define gpiob_bsrr     *(unsigned int*)(gpiob_base+0x10)#define gpiob_brr      *(unsigned int*)(gpiob_base+0x14)#define gpiob_lckr     *(unsigned int*)(gpiob_base+0x18)/*rcc外設基位址*/#define rcc_base      (ahbperiph_base + 0x1000)/*rcc的ahb1時鐘使能暫存器位址,強制轉換成指標*/#define rcc_apb2enr     *(unsigned int*)(rcc_base+0x18)  #endif  /*__stm32f10x__h*/
我是誰我在哪,我在幹神魔。。>

idr暫存器 實驗 使用暫存器點亮LED

埠配置高暫存器後面的英文就是暫存器名稱可參考參考手冊,然後x可以為a e也就是適用gpuoa gpioe埠這樣的乙個暫存器。位址偏移,就是本暫存器相對這個外設基位址的偏移 暫存器位表 表示0 31位名稱及許可權,表上方的數字位編號,中間位位名稱,下方位讀寫許可權,w表示寫,r表示讀 位功能,如表所描...

暫存器對映

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

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

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