最近在做关于stm32的项目时看到的一个参考代码,里面的IO口配置是使用寄存器配置的,因为直接接触的比较少,不太清楚其原理,琢磨了好一会才理解整个思路,下面是对这段代码的解释。
这段代码配置的是一个IIC通信中SDA的方向和输出模式,整体分为MPU_SDA_IN()和MPU_SDA_OUT()两个方向的配置。
#define MPU_SDA_IN() {GPIOB->CRH &= 0XFFFF0FFF;GPIOB->CRH |= (u32)8<<12;}
#define MPU_SDA_OUT() {GPIOB->CRH &= 0XFFFF0FFF;GPIOB->CRH |= (u32)3<<12;}
一、GPIOB->CHR
对应端口配置高寄存器,也就是PB8-PB15端口。
二、&= 0XFFFF0FFF
指寄存器的第12位清零,除了第12位,其他的都是1,也就是擦除了CNF11【1:0】和MODE【1:0】的数据,不影响其他IO口的配置。
三、|= (u32)8<<12:
这行代码将第12位引脚的模式设置为输出模式。(u32)3指的是将3转换为32位无符号整数。 3<<12表示数字3左移12位,得到0x00008000,也就是0x0000 0000 0000 0000 1000 0000 0000 0000。然后,通过位或运算(|=)将其与GPIOB->CRH的当前值合并,从而设置第12位引脚的模式。
四、对应模式
引脚的配置如下图所示,0011对应的是CNF11【1:0】为10,MODE【1:0】为00,所以定义的IO口配置为通用推挽输出。
五、输出速度
根据上面的分析我们得知MPU_SDA_IN()的MODE【1:0】为输入模式,而在输出模式中可以选择其速度。我们分析可得,MPU_SDA_OUT()的MODE【1:0】为11,对应50MHz。
下图为整体思路的总结:
stm32c8t6的中文手册:
链接:https://pan.baidu.com/s/10ZqjuypXtfU6aHr0O14scA?pwd=m52c
提取码:m52c