2017-10-18 126 views
0

我正試圖學習如何在STM32F4發現中編寫GPIO引腳的驅動程序。我經歷的教程和我碰到這條線進來:C編碼中的按位操作

static void hal_gpio_configure_pin_mode (GPIO_TypeDef *GPIOx, uint16_t pin_no, uint32_t mode) 
{ 
    GPIOx->MODER |= (mode << (2* pin_no)); 
} 

我是比較新的嵌入式系統,不知道是什麼GPIOX->MODER |= (mode << (2* pin_no));一樣。另外,我不知道爲什麼pin_no是16位,而模式是32位。我知道< <是左移位運算符。但我仍然沒有得到完整的上下文。

任何人都可以解釋這一切嗎?

+0

沒有理由'pin_no'和'mode'應具有相同的類型。它們的值不會像加法或乘法那樣在運算中使用,而是'pin_no'只是一個索引,用於(2)來計算一個值的移位量('mode')。移位只是一個數字;它不必與被移位的類型是同一類型,所以,像'+'和'*'這樣的運算符要求將它們的操作數轉換爲相同的類型,'<< '操作員的左右側可能有不同的類型。 –

+1

看着莫der註冊在芯片文檔的gpio部分。你會看到,這只是在這個寄存器中設置了幾位。 –

+0

Google:「c按位運算符如何工作」。或讀一本書。 – Lundin

回答

3

試圖解釋行GPIOx->MODER |= (mode << (2* pin_no));

  • GPIOx是一個指向結構
  • GPIOx->MODER訪問構件MODER這種結構
  • x |= yx = x | y的縮寫,這意味着內「執行一個x和y的邏輯或,並將結果寫回到x
  • mode << (2* pin_no)表示左移變量的內容兩次pin_no位。

因此,行的意思是「取GPIOx->MODER的內容,按位或它的mode左shiftet內容。

+2

我想補充一點,可能每個引腳的模式都由兩位編碼,並且可以有4個不同的值。此功能假設模式初始設置爲「00」。 –

+1

根據復位狀態,復位後復位是正確的,但在復位之前應遮擋。 –