C编码中的按位操作
问题描述:
我正试图学习如何在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位。我知道< <是左移位运算符。但我仍然没有得到完整的上下文。
任何人都可以解释这一切吗?
答
试图解释行GPIOx->MODER |= (mode << (2* pin_no));
:
-
GPIOx
是一个指向结构 -
GPIOx->MODER
访问构件MODER
这种结构 -
x |= y
是x = x | y
的缩写,这意味着内“执行一个x和y的逻辑或,并将结果写回到x -
mode << (2* pin_no)
表示左移变量的内容两次pin_no
位。
因此,行的意思是“取GPIOx->MODER
的内容,按位或它的mode
左shiftet内容。
+2
我想补充一点,可能每个引脚的模式都由两位编码,并且可以有4个不同的值。此功能假设模式初始设置为“00”。 –
+1
根据复位状态,复位后复位是正确的,但在复位之前应遮挡。 –
没有理由'pin_no'和'mode'应具有相同的类型。它们的值不会像加法或乘法那样在运算中使用,而是'pin_no'只是一个索引,用于(2)来计算一个值的移位量('mode')。移位只是一个数字;它不必与被移位的类型是同一类型,所以,像'+'和'*'这样的运算符要求将它们的操作数转换为相同的类型,'
看着莫der注册在芯片文档的gpio部分。你会看到,这只是在这个寄存器中设置了几位。 –
Google:“c按位运算符如何工作”。或读一本书。 – Lundin