MDK寄存器地址映射分析
在51單片機(jī)中:
首先我們看看 51 中是怎么做的。51 單片機(jī)開發(fā)中經(jīng)常會(huì)引用一個(gè) reg51.h 的頭文件,下面我們看看他是怎么把名字和寄存器聯(lián)系起來(lái)的:
sfr 也是一種擴(kuò)充數(shù)據(jù)類型,點(diǎn)用一個(gè)內(nèi)存單元,值域?yàn)?0~255。利用它可以訪問(wèn) 51 單片
機(jī)內(nèi)部的所有特殊功能寄存器。如用 sfr P1 = 0x90 這一句定義 P1 為 P1 端口在片內(nèi)的寄存
器。然后我們往地址為 0x80 的寄存器設(shè)值的方法是:P0=value;
在STM32中:
在 STM32 中,同樣也可以這樣做,但是 STM32 因?yàn)榧拇嫫魈嗵?#xff0c;如果以這樣的方式一一列出來(lái),那要好大的篇幅,既不方便開發(fā),也顯得太雜亂無(wú)序的感覺(jué)。所以 MDK 采用的方式是通過(guò)結(jié)構(gòu)體來(lái)將寄存器組織在一起。下面我們就講解 MDK 是怎么把結(jié)構(gòu)體和地址對(duì)應(yīng)起來(lái)的,為什么我們修改結(jié)構(gòu)體成員變量的值就可以達(dá)到操作對(duì)應(yīng)寄存器的值。這些事情都是在stm32f10x.h文件中完成的。我們通過(guò) GPIOA 的幾個(gè)寄存器的地址來(lái)講解。
(1)寄存器地址映射表
從這個(gè)表我們可以看出,GPIOA 的 7 個(gè)寄存器都是 32 位的,所以每個(gè)寄存器占有 4個(gè)地址,一共占用 28 個(gè)地址,地址偏移范圍為(000h~01Bh)。這個(gè)地址偏移是相對(duì) GPIOA的基地址而言的。GPIOA 的基地址是怎么算出來(lái)的呢?因?yàn)?GPIO 都是掛載在 APB2 總線之上,所以它的基地址是由 APB2 總線的基地址+GPIOA 在 APB2 總線上的偏移地址決定的。同理依次類推,我們便可以算出 GPIOA 基地址了。下面我們打開 stm32f10x.h 定位到 GPIO_TypeDef 定義處:
然后定義到:
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)GPIOA 是將 GPIOA_BASE 強(qiáng)制轉(zhuǎn)換為 GPIO_TypeDef 指針,這句話的意思是,GPIOA 指向地址GPIOA_BASE,GPIOA_BASE 存放的數(shù)據(jù)類型為 GPIO_TypeDef。
然后查看 GPIOA_BASE的宏定義:
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)可知GPIOA 的基地址是 APB2 總線的基地址+GPIOA 在 APB2 總線上的偏移地址
依次類推,可以找到最頂層:
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define PERIPH_BASE ((uint32_t)0x40000000)所以我們便可以算出 GPIOA 的基地址位:
GPIOA_BASE= 0x40000000+0x10000+0x0800=0x40010800(2)GPIOA 的 7 個(gè)寄存器的地址如何計(jì)算:
GPIOA 的寄存器的地址=GPIOA 基地址+寄存器相對(duì) GPIOA 基地址的偏移值這個(gè)偏移值在上面的寄存器地址映像表中可以查到。
(3)結(jié)構(gòu)體里面這些寄存器又是怎么與地址一一對(duì)應(yīng)的:
這里就涉及到結(jié)構(gòu)體的一個(gè)特征,那就是結(jié)構(gòu)體存儲(chǔ)的成員他們的地址是連續(xù)的。上面講到 GPIOA 是指向GPIO_TypeDef 類型的指針,又由于 GPIO_TypeDef 是結(jié)構(gòu)體,所以自然而然我們就可以算出 GPIOA 指向的結(jié)構(gòu)體成員變量對(duì)應(yīng)地址了。
我們可以把 GPIO_TypeDef 的定義中的成員變量的順序和 GPIOx 寄存器地址映像對(duì)比可以發(fā)現(xiàn),他們的順序是一致的,如果不一致,就會(huì)導(dǎo)致地址混亂了。這就是為什么固件庫(kù)里面:GPIOA->BRR=value;就是設(shè)置地址為 0x40010800+0x014(BRR 偏移量)=0x40010814 的寄存器 BRR 的值了。它和 51 里面 P0=value 是設(shè)置地址為 0x80 的 P0 寄存器的值是一樣的道理。
總結(jié)
以上是生活随笔為你收集整理的MDK寄存器地址映射分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: cmd ntsd命令
- 下一篇: 33tomcat目录结构