STM32 IO配置
以模拟IIC接口形式举例说明;
IO方向设置
//IO方向设置
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
SDA _IN()
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=(u32)8<<28;
- 将CRL高4位清零,其他位保持不变;
- 将“8”即“0b1000”左移28位;
- 如下图寄存器表,则CNF7[1:0] = 10; MODE7[1:0] = 00;
即:
SDA_IN():
CN7[1:0] = 10: 浮空输入模式(复位后状态)
MODE7[1:0] = 00: 输入模式
SDA_OUT()
GPIOB->CRL&=0X0FFFFFFF;
GPIOB->CRL|=(u32)3<<28;
同样:
- 高位4位二进制清零其他不变;
- 将“3”即“0b0011”左移28位;
SDA_OUT():
CN6[1:0] = 00: 通用推挽输出模式;
MODE6[1:0] = 11: 输出模式,最大速度50MHz;
小结
SDA_IN :PB7设置为浮空输入模式;
SDA_OUT :PB7设置为推挽输出;
IO操作函数
//IO操作函数
#define IIC_SCL PBout(6) //SCL
#define IIC_SDA PBout(7) //SDA
#define READ_SDA PBin(7) //输入SDA
打开“PBout()”函数定义:
//IO操作函数
#define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出
#define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入
对应寄存器地址 参照《STM32中文参手册》
修改为高位管脚
将IIC管脚修改为:
SDA:PB11
SCL:PB10
PB11寄存器地址偏移12
只需要设置IO方向
//IO方向设置
#define SDA_IN() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)8<<12;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFF0FFF;GPIOB->CRH|=(u32)3<<12;}
The secret of happiness, you see, is not found in seeking more, but in developing the capacity to enjoy less.