在学习正点原子IIC例程时遇到SDA_IN()和SDA_OUT()两个端口模式配置函数,代码如下:
//IO口方向设置
#define SDA_IN() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=0<<9*2;} //PB9输入模式
#define SDA_OUT() {GPIOB->MODER&=~(3<<(9*2));GPIOB->MODER|=1<<9*2;} //PB9输出模式
首先,我们分析一下IO口MODER寄存器的作用是配置IO方向模式,原子哥配置的是PB9端口,下面图中可以看出在寄存器的第18-19位,所以只需要在第18-19位进行置00或者01来达到相关的配置;
SDA_IN()函数中代码 GPIOB->MODER&=~(3<<(9*2))中,3可能为默认的int型数据,占4个字节32位,其二进制表示方法为0..0011(总共32位),先将3左移18位,此操作后第18-19位置1,其余位为0;再取反操作,此操作后第18-19位为0,其余位为1;最后将与MODER寄存器相与,结果MODER寄存器中第18-19位置0,其他位数值不变。第二步操作代码 GPIOB->MODER|=0<<9*2与第一步操作一