C编码中的按位运算

时间:2017-10-18 20:55:24

标签: c embedded stm32f4discovery

我正在尝试学习如何在STM32F4 Discovery中为GPIO引脚编写驱动程序。我正在阅读教程,我遇到了这一行:

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位。我知道&lt;&lt;是左移位运算符。但我仍然没有得到完整的背景。

有人可以解释这一切吗?

1 个答案:

答案 0 :(得分:3)

尝试解释第GPIOx->MODER |= (mode << (2* pin_no));行:

  • GPIOx是指向结构的指针
  • GPIOx->MODER访问此结构中的成员MODER
  • x |= yx = x | y的缩写,表示&#34;执行x和y的逻辑OR,并将结果写回x
  • mode << (2* pin_no)表示将变量mode的内容左移两次pin_no位。

因此,该行表示&#34;取GPIOx->MODER的内容,按位-OR与mode的左撇子内容。