|

楼主 |
发表于 2019-4-15 16:30:24
|
显示全部楼层
本帖最后由 Psheng 于 2019-4-15 18:28 编辑
打开F7的中文参考手册可以看到GPIO的MODER寄存器是用来控制IO的模式的。
然后分析下这句代码
#define VL_SDA_IN() {GPIOB->MODER&=~(3<<(14*2));GPIOB->MODER|=0<<14*2;} //PB14输入模式
可以看到调用这个宏定义后 执行了两个语句分别为 GPIOB->MODER&=~(3<<(14*2)) 和 GPIOB->MODER|=0<<14*2
这两条语句都是操作GPIOB的MODER寄存器的。
GPIOB->MODER&=~(3<<(14*2))
首先3就是2进制的 11 。然后将11 左移 28位。 变成了二进制 0011 0000 0000 0000 0000 0000 0000 0000
然后用按位取反符(~) 变成二进制的 1100 1111 1111 1111 1111 1111 1111 1111
然后将这段数据和MODER进行 与运算(&),(0和任何数与运算都是0 1和任何数与运算都是1)目的就是为了清除MODER寄存器的bit[29:28] 位。
GPIOB->MODER|=0<<14*2
这个语句就是将 0左移28bit ,变成0000 0000 0000 0000 0000 0000 0000 0000
然后将这个数和MODER寄存器进行 或运算。就是为了给改寄存器的 bit[29:28]位重新赋值00.
最后运行完毕的结果就是GPIOB的MODER寄存器的bit[29:28]变成了00.对照手册的寄存器说明 可以知道这个就是将端口GPIOB的PIN14引脚变成了输入模式
同理可得
#define VL_SDA_OUT() {GPIOB->MODER&=~(3<<(14*2));GPIOB->MODER|=1<<14*2;} //PB14输出模式
首先清零 bit[29:28] 然后就是赋值01到 bit[29:28]。
最后运行完毕的结果就是GPIOB的MODER寄存器的bit[29:28]变成了01.对照手册的寄存器说明 可以知道这个就是将端口GPIOB的PIN14引脚变成了输出模式
|
|