作者disap ( )
看板ASM
標題Re: [問題] 關於GPIO的指標寫法
時間Sat Nov 19 15:43:54 2016
※ 引述《goodzey (--)》之銘言:
: 請教大家,在STM32Lxx.h有以下指標寫法
: #define GPIOB_BASE (0x0c00)
: #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
: typedef struct
: {
: __IO uint32_t CRL;
: __IO uint32_t CRH;
: __IO uint32_t IDR;
: __IO uint32_t ODR;
: __IO uint32_t BSRR;
: __IO uint32_t BRR;
: __IO uint32_t LCKR;
: } GPIO_TypeDef;
: int main(void)
: {
: GPIOB->CRH &= 0xFFFFFFF0;
: GPIOB->CRH |= 0x00000003;
: }
: 其中的指標寫法:
: #define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
: 請問大家,有沒有簡單的example code可以協助理解這種寫法?
: 我找了很多網路資料都沒有多說
: 在正規C語言中這種寫法的關鍵字是什麼?查得到C語言正規教材嗎?
: 謝謝!
0x0c00 本來只是常數,這裡是把它強制轉型為一個資料結構(GPIO_TypeDef)的指標,
所以:
GPIOB->CRH &= 0xFFFFFFF0;
實際上是:
((GPIO_TypeDef *)0x0c00)->CRH &= 0xFFFFFFF0;
這段程式是當成有一個 GPIO_TypeDef 的實例,存放在從 0x0c00 開始的位置,
然後從該位置開始往下索引到 CRH 的位置,對那個位置內的數值執行"& 0xFFFFFFF0"。
可以參考該IC的 reference manual,GPIO_TypeDef 內的成員對應的是實體的暫存器。
這些程式只是出於擴充方便而採用間接定址的方式去存取這些暫存器。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 175.181.154.224
※ 文章網址: https://webptt.com/m.aspx?n=bbs/ASM/M.1479541436.A.CE6.html
1F:→ goodzey: 謝謝! 11/20 08:53
2F:推 karamajean: 推專業 06/08 13:24