小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

 岐岐feng 2018-07-09

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

APB1總線掛載外設(shè) 及地址

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

APB2總線掛載外設(shè)及地址

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

AHB1掛載外設(shè)及地址

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

AHB2及AHB3掛載外設(shè)及基地址

第一步確定整個(gè)外設(shè)區(qū)域的基地址

#define PERIPH_BASE ((uint32_t)0x40000000) /*!< peripheral="" base="" address="" in="" the="" alias="">

第二步確定不同總線的基地址,因?yàn)椴煌偩€的上邊掛載著不同的系統(tǒng)外設(shè)

/*!< peripheral="" memory="" map="">

#define APB1PERIPH_BASE PERIPH_BASE

#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)

#define AHB1PERIPH_BASE (PERIPH_BASE + 0x00020000)

#define AHB2PERIPH_BASE (PERIPH_BASE + 0x10000000)

可以發(fā)現(xiàn)對應(yīng)的是對的

第三步我們以AHB1上掛載的GPIO外設(shè)的地址封裝為例講解

/*!< ahb1="" peripherals="">

#define GPIOA_BASE (AHB1PERIPH_BASE + 0x0000)

#define GPIOB_BASE (AHB1PERIPH_BASE + 0x0400)

#define GPIOC_BASE (AHB1PERIPH_BASE + 0x0800)

#define GPIOD_BASE (AHB1PERIPH_BASE + 0x0C00)

#define GPIOE_BASE (AHB1PERIPH_BASE + 0x1000)

#define GPIOF_BASE (AHB1PERIPH_BASE + 0x1400)

#define GPIOG_BASE (AHB1PERIPH_BASE + 0x1800)

#define GPIOH_BASE (AHB1PERIPH_BASE + 0x1C00)

#define GPIOI_BASE (AHB1PERIPH_BASE + 0x2000)

#define GPIOJ_BASE (AHB1PERIPH_BASE + 0x2400)

#define GPIOK_BASE (AHB1PERIPH_BASE + 0x2800)

#define CRC_BASE (AHB1PERIPH_BASE + 0x3000)

#define RCC_BASE (AHB1PERIPH_BASE + 0x3800)

#define FLASH_R_BASE (AHB1PERIPH_BASE + 0x3C00)

#define DMA1_BASE (AHB1PERIPH_BASE + 0x6000)

#define DMA1_Stream0_BASE (DMA1_BASE + 0x010)

#define DMA1_Stream1_BASE (DMA1_BASE + 0x028)

#define DMA1_Stream2_BASE (DMA1_BASE + 0x040)

#define DMA1_Stream3_BASE (DMA1_BASE + 0x058)

#define DMA1_Stream4_BASE (DMA1_BASE + 0x070)

#define DMA1_Stream5_BASE (DMA1_BASE + 0x088)

#define DMA1_Stream6_BASE (DMA1_BASE + 0x0A0)

#define DMA1_Stream7_BASE (DMA1_BASE + 0x0B8)

#define DMA2_BASE (AHB1PERIPH_BASE + 0x6400)

#define DMA2_Stream0_BASE (DMA2_BASE + 0x010)

#define DMA2_Stream1_BASE (DMA2_BASE + 0x028)

#define DMA2_Stream2_BASE (DMA2_BASE + 0x040)

#define DMA2_Stream3_BASE (DMA2_BASE + 0x058)

#define DMA2_Stream4_BASE (DMA2_BASE + 0x070)

#define DMA2_Stream5_BASE (DMA2_BASE + 0x088)

#define DMA2_Stream6_BASE (DMA2_BASE + 0x0A0)

#define DMA2_Stream7_BASE (DMA2_BASE + 0x0B8)

#define ETH_BASE (AHB1PERIPH_BASE + 0x8000)

#define ETH_MAC_BASE (ETH_BASE)

#define ETH_MMC_BASE (ETH_BASE + 0x0100)

#define ETH_PTP_BASE (ETH_BASE + 0x0700)

#define ETH_DMA_BASE (ETH_BASE + 0x1000)

#define DMA2D_BASE (AHB1PERIPH_BASE + 0xB000)

可以看出我們已經(jīng)知道了每個(gè)外設(shè)的基地址 ,我們有公式

寄存器地址=外設(shè)的基地址+外設(shè)的偏移地址 利用公式那么說我們的每個(gè)外設(shè)內(nèi)需要操作的寄存器的地址,我們都可以進(jìn)行訪問了。

第四步 看看庫函數(shù)是怎么幫助我們定義外設(shè)的寄存器地址的,是怎么樣對其進(jìn)行封裝的?4

#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)

#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)

#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)

#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)

#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)

#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)

#define GPIOH ((GPIO_TypeDef *) GPIOH_BASE)

#define GPIOI ((GPIO_TypeDef *) GPIOI_BASE)

#define GPIOJ ((GPIO_TypeDef *) GPIOJ_BASE)

#define GPIOK ((GPIO_TypeDef *) GPIOK_BASE)

可以看出以上庫函數(shù)神奇的操作是把一堆的32位的無符號的整數(shù) 強(qiáng)制轉(zhuǎn)換成了結(jié)構(gòu)體類型的指針。

并且(GPIO_TypeDef *) 這個(gè)指針只能指向GPIO_TypeDef 這個(gè)結(jié)構(gòu)體類型

下面我們打開這個(gè)結(jié)構(gòu)體

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

發(fā)現(xiàn)庫函數(shù)把我們的GPIO的寄存器類型全都放在了一起 ,因?yàn)槲覀冞@些具有相同的特征描述的是同一事物的不同性質(zhì),不禁就讓人想到了c語言的結(jié)構(gòu)體,并且C語言的結(jié)構(gòu)體成員變量在我們的sram中存儲(chǔ)的方式是連續(xù)的。

第五步看看怎么用

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

這是應(yīng)用

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

這是一個(gè)結(jié)構(gòu)體

我們訪問結(jié)構(gòu)體

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

stm32標(biāo)準(zhǔn)庫對寄存器地址的封裝

我們最終訪問到了GPIOA

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多