本帖最后由 新鄉(xiāng)吳彥祖 于 2018-8-18 15:57 編輯
MDK中寄存器地址名稱映射分析(開發(fā)指南4.6節(jié)) 對MCU,一切底層配置,最終都是配置寄存器 庫函數(shù)是對底層寄存器封裝了一遍,位操作也是最終操作的寄存器 51中映射的方法:sfr P0=0x80;//P0映射到地址0x80 ,以后只需要直接寫P0=0x00即代表往寄存器地址0x80所代表的寄存器賦值,0x00相當(dāng)于給P0的每一位IO口都賦值0。這樣的好處是不需要記住每個寄存器的地址,需要用對應(yīng)的寄存器時直接寫寄存器相應(yīng)的名稱即可。最常用的P0、P1、P2、P3,四組輸入輸出(I/O)寄存器,以及TH1, TH0, TL1,TL0,SCON,TCON,TMOD,SBUF等等 相比于51,32的寄存器要多得多,32采用了結(jié)構(gòu)體來表示相應(yīng)的寄存器 GPIOA->ODR=0x00000000。32中每組IO口都有7個寄存器控制這與51稍有不同。每組IO對應(yīng)一個基地址,寄存器根據(jù)基地址進行偏移取的地址,GPIOA的基地址又是根據(jù)APB2的地址來偏移,同理得到其他地址。其中外設(shè)基地址是一個比較高的地址,他被定義為一個常量,作為參考。再回頭說結(jié)構(gòu)體,我們打開stm32f10x.h 定位到GPIO_TypeDef 定義處:GPIOA被強制轉(zhuǎn)換為結(jié)構(gòu)體指針,就意味著接下來的地址代表了結(jié)構(gòu)體中的七個寄存器。由于每個寄存器是32位,每個地址設(shè)置八位(類似于51),并且結(jié)構(gòu)體存儲的成員他們的地址是連續(xù)的。所以GPIOA下的寄存器相對應(yīng)的寄存器之間的地址都是相差了4,例如我們訪問ODR寄存器就是訪問了ODR相對于GPI_的基地址的偏差的四個地址。 |