2017-10-18 83 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

根据复位状态,复位后复位是正确的,但在复位之前应遮挡。 –