2017-06-14 55 views
2

是什麼串#定義爲ARM微控制器

#define RCC     ((RCC_TypeDef *) RCC_BASE) 

是什麼意思?

我明白,這是一個指針的定義和RCC_BASE按照下列行

#define RCC_BASE    (AHB1PERIPH_BASE + 0x00001000) 
#define AHB1PERIPH_BASE  (PERIPH_BASE + 0x00020000) 
#define PERIPH_BASE   ((uint32_t)0x40000000)  

但代表uint_32 0x400021000爲什麼定義有兩種類型:RCC_TypeDef *和uint_32?

+0

因爲每個宏都有它自己的意義,並獨立使用時,必須是正確的。 – StoryTeller

+0

如果你提供更多的上下文(例如typedef),有人可以告訴你如何使用該宏。 – Yunnosch

+1

這是基本的C語言的東西,它們使用該結構來創建偏移0x00,0x04等(名稱爲RCC-> something)到0x40021000基址。與ARM無關,也沒有與該芯片的ARM部分。 PERIPH_BASE中的uint32_t不是必需的,也許他們正在收到編譯器警告。 –

回答

3
#define RCC     ((RCC_TypeDef *) RCC_BASE) 

裝置宏這是RCC_TypeDef *類型和解決MCU地址空間RCC_BASE的。

RCC_BASE是RCC寄存器在MCU地址空間中的地址。

地址本身就是數字,因此它有(uint32_t)盈方。

這種類型的宏允許您使用的寄存器與指針訪問

//Read RCC register APB1ENR 
uint32_t apb1enr_Reg = RCC->APB1ENR; 
+0

我可以如下定義它: uint_32 RCC_BASE = 0x400021000; RCC_TypeDef * RCC = NULL; RCC = RCC_BASE; ? – Ruslan1935

+0

由於#define RCC ...存在,如果您執行代碼,則會出錯。你可以這樣做:'RCC_TypeDef * myRcc; myRcc =(RCC_TypeDef *)RCC_BASE;',但我不知道你爲什麼要這樣做。使用CMSIS聲明。 – tilz0R

+0

我只是想更好地理解它。謝謝 – Ruslan1935

0

行:

#define RCC     ((RCC_TypeDef *) RCC_BASE) 

簡直是明確鑄造指向的地址RCC_BASE的指針無論typedefRCC_TYPEDEF定義在其他地方。

例如,如果RCC_TYPEDEF被定義爲long,然後RCC將被定義爲:

#define RCC     ((long *) RCC_BASE) 
+0

謝謝,先生。 – Ruslan1935