在学习IIC协议时,看到以下代码,查阅资料,自己理解了一下:
#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
首先,STM32中对IO口进行配置,需要对7个32bit的寄存器进行配置:CRL、CRH(配置端口模式);IDR、ODR(数据寄存器);BSRR(置位\复位)、BRR(复位);LCKR(锁存)
其中CRL与CRH寄存器功能:控制每个IO口模式及输出速率。CRL配置PB.0—PB.7;CRH配置PB8—PB.15。每一个IO口通过4个位控制,一共CRL/CRH有32个位,分别控制8个IO口。
一、#define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
1、GPIOB->CRL&=0X0FFFFFFF;//将CRL寄存器的bit31-bit28为置0,这些位控制PB.7,temp=0000 XXXX XXXX XXXX XXXX XXXX XXXX XXXX 其中X为操作前的状态 &后不变 保持原状态
2、GPIOB->CRL|=(u32)8<<28;//①将十进制的8转换为32位的二进制,即temp1=0000 0000 0000 0000 0000 0000 0000 1000 ②将其左移28位,变成temp2= 1000 0000 0000 0000 0000 0000 0000 0000 即0x8000H③temp=temp | temp2=8XXXXXXXH
3、最终就是GPIOB7_CRL=0X8XXXXXXX,查手册可知当MODE7[1:0]=00,此时CNF7[1:0]表示:为上拉/下拉输入模式
二、同理#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
MODE7[1:0]=11,CNF7[1:0]=00表示为:通用推挽输出模式,最大速度50MHz。
硬件小白,不断努力中,希望前辈、同行,可以留言,多多指教,探讨,多谢。