hi 今天问一个基础问题,看上去不难的但是。。。没办法我不清楚。
拿出来问问。
我的问题是:库函数我理解,寄存器看不懂
软件模拟IIC通讯的时候,其中SDA这个脚的需要切换OUT还是IN两种模式的,
以前我是用库函数,就像下面这样
- //SDA脚设置为OUT
- void I2C_SDA_OUT(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin=I2C_SDA;
- GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
- GPIO_Init(GPIO_I2C, GPIO_InitStructure);
- }
- //SDA脚设置为IN
- void I2C_SDA_IN(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- GPIO_InitStructure.GPIO_Pin=I2C_SDA;
- GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
- GPIO_Init(GPIO_I2C, GPIO_InitStructure);
- }
今天看原子的代码,他用的寄存器写的
- //IO方向设置
- #define SDA_IN() {GPIOB->CRL =0X0FFFFFFF; GPIOB->CRL|=(u32)8<<28;}
- #define SDA_OUT() {GPIOB->CRL =0X0FFFFFFF; GPIOB->CRL|=(u32)3<<28;}
我仔细看了看,因为他用的是PB7,所以最后是4*7=28 这样来的。
但是(u32)3<<28;这个??
3其实是11 对应的是不是GPIO_Mode_Out_PP而是开漏输出呀。
前面 SDA_IN()这句也是看不懂 。OUT是11为啥IN是1000呢?