读取MPU6050时,在IIC.h中看到了如下的代码,比较疑惑是什么意思。
#define MPU_SDA_IN() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=8<<4;}
#define MPU_SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=3<<4;}
经查,CRH为STM32GPIO的端口配置寄存器,之于对应的还有CRL寄存器。
CRL和CRH的作用
CRL和CRH控制着每个IO口的模式以及输出速率。
CRH寄存器
通过中文参考手册可以了解到,CRH是控制GPIO的高8位
即GPIOB->CRH,表示要操作GPIOB的高8位,就是PB8 ~ PB15;
同理GPIOB->CRL,表示要操作GPIOB的低8位,就是PB0 ~ PB7。
由上述知"GPIOB->CRH&=0XFFFFFF0F"的意思就是,将PB9的设置清零,其余位保持不变。
GPIOB->CRH|=8<<4的意思:8<<4 表示为二进制位是1000 0000,结合上表,则整个的意思是将CNF9设为10,即将PB9设为上拉输入模式。
GPIOB->CRH|=3<<4的意思: 3<<4表示为二进制是0011 0000,表示将MODE9设为11,即将PB9设为输出模式,最大输出速度为50Mhz。
CRL则同理。
参考:
【浅析STM32之GPIO寄存器(CRL/CRH)配置 】_@slow-walker的博客-CSDN博客_gpiob->crl