STM32韌體庫之GPIOx操作理解
關於使用韌體庫操作GPIO管腳,在配置時,使用了這樣的語句:
GPIOx->BRR = GPIO_Pin;
韌體庫相關原始碼:
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;
#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)
查得GPIOA_BASE為地址值GPIOA_BASE= 0x40000000+0x10000+0x0800=0x40010800
那麼一個地址值被強制轉化為GPIO_TypeDef型別指標GPIOA ,GPIOA的地址與首地址相同,此時為GPIOA_BASE,
是一個暫存器的地址值。考慮到是個GPIOA結構體型別指標,那麼想象分配記憶體時(定義結構體變數時才有分配)使用對齊方式分配連續的地址,
那麼GPIOA->CRH的地址值為GPIOA_BASE+4;
好的,現在回顧操作暫存器時是用這樣的語句*GPIOA_BASE = XXXX(表示對暫存器指向的儲存空間賦值);
我們現在就可以來理解GPIOx->BRR = GPIO_Pin;
可以理解成*(&GPIOX->BRR)= XXX(即GPIO_Pin);往GPIOX->BRR的地址所指向的空間賦值;
驗證方式:
可以用MDK 軟體除錯把GPIOx->BRR的地址值打印出來看看;
具體的方法可以參考網上的資料。
驗證方式:2
stm32f10x_rcc.c裡有這樣的函式
void RCC_PLLCmd(FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_FUNCTIONAL_STATE(NewState));
*(__IO uint32_t *) CR_PLLON
}