IIC协议中SDA_IN与SDA_OUT理解 IO口寄存器

在学习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。

 

硬件小白,不断努力中,希望前辈、同行,可以留言,多多指教,探讨,多谢。

 

 

 

 

 

 

 

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值