MPU 6050 的示例代码
问题:IIC 协议代码中 IO 方向代码相关解析
回归 STM 32 数据手册:
1 . STM 32 的 IO 口可以配置为以下 8 种模式
- 输入浮空(floating input)
- 输入上拉(pull-up input)
- 输入下拉(pull-dowm input)
- 模拟输入(analog)
- 开漏输出(open-drain output)
- 推挽输出(push-pull output)
- 推挽式复用功能(alternate function open-drain)
- 开漏复用功能(alternaate function push-pull)
2. STM 32 的每个 IO 端口都有 7 个寄存器进行控制
-
配置模式的 2 个 32 位端口配置寄存器 CRL (IO 0-7)和 CRH (IO 8-15)
-
2 个 32 位的数据寄存器 IDR (只读) 和 ODR(只写)
-
1 个 32 位的置位/复位寄存器 BSRR
-
1 个 16 位的复位寄存器 BRR
-
1 个 32 位的锁存寄存器 LCKR
我们常用的 IO 端口配置寄存器只有 4 个:CRL, CRH, IDR,ODR。CRH 和 CRL 控制每个 IO 口的模式及输出速率。
官方数据手册配置表如图:
STM 32 输出模式配置表如图:
STM 32 的 CRL 寄存器控制着每组 IO 端口的低八位模式。每个 IO 占用 CRL 的四个位,高两位为 CNF ,低两位为 MODE。
端口配置低寄存器表如图:
端口配置高寄存器如图:
3.代码解释
GPIOA->CRL &= 0XFF0FFFFF; \
GPIOA->CRL |= 8 << 20;
代码解释如下:
1. 将 GPIOA 的 CRL 寄存器(第 5 个 IO 口)的地址位(CNF[1:0], MODE 5[1:0])清零,其余位保持不变;
2. 将“8 (D)=1000 (B)“左移 20 位后写入寄存器:
即:SDA_IN ():
CNF 5[1:0] = 10; 上/下拉输入模式;(复位后状态)
MODE[1:0]=00; 输入模式
SDA_OUT ():
CNF 5[1:0] = 00; 通用推挽输出模式;
MODE[1:0]=11; 输出模式,最大速度 50 MHz