C 编码中的按位运算

Bitwise operations in C coding

我正在尝试学习如何在 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 位,而 mode 是 32 位。我知道 << 是左移按位运算符。但我仍然没有得到完整的上下文。

任何人都可以解释这一切吗?

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

  • GPIOx是一个指向结构的指针
  • GPIOx->MODER 访问此结构中的成员 MODER
  • x |= yx = x | y的缩写,意思是“对x和y进行逻辑或,并将结果写回x
  • mode << (2* pin_no)表示将变量mode的内容左移两次pin_no位。

因此,该行的意思是“获取 GPIOx->MODER 的内容,将其与 mode 的左移位内容按位或。