STM32 I2C实验中的 SDA_IN()和SDA_out()的含义

在STM32 I2C实验例程中有这样的一段:
//IO方向设置
#define SDA_IN() {GPIOB->MODER&=~(3<<(92));GPIOB->MODER|=0<<92;} //PB9输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(92));GPIOB->MODER|=1<<92;} //PB9输出模式

其具体过程为:3是二进制的11,~(3<<(92)是将11左移92=18位,也就是第18位和第19位为11,其他各位为0,。然后取反,即除了第18位和第19位为0,其他各位都为1。这里可能默认3是int型,占据4个字节32位。然后再与GPIOB组的moder寄存器取与,即将moder寄存器第18位和第19位置0,其他各位保持不变。由moder寄存器各位功能可知,就是讲PB9口设置为复位模式(即输入模式)。而GPIOB->MODER|=0<<92同样的过程,由于0<<92最后的结果是各位都是0,再与moder寄存器取或,即moder寄存器各位都不变,所以最终设置PB9为输入模式。
第二行同样,不过是后面变成了1<<9*2,则运算完成之后,moder寄存器第18位和第19位变为01,即为输出模式。这样通过位运算,最终实现了对PB9口的输入输出模式的设置。

注:1.在位运算中,常用的有以下原理:与1进行与运算,原位保持不变;与1进行或运算,原位置1(置位);与0进行与运算,原位置0(复位);与0进行或运算,原位保持不变。
2.其实第一行的操作与GPIOB->MODER&=0XFFF3FFFF;GPIOB->MODER|=0X00000000是一样的。

moder寄存器各位功能

你可能感兴趣的:(STM32)