1. 程式人生 > >STM32韌體庫之GPIOx操作理解

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

_BB = (uint32_t)NewState;   //注意這裡*(__IO uint32_t *) CR_PLLON_BB = 。。。
}