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寄存器各位功能

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值