寄存器操作端口模式#define SDA_IN() /#define SDA_OUT()(正点STM32-IIC实验)

#define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;} //宏定义,PB7:上拉/下拉输入模式
#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;} //宏定义,PB7:50MHz推挽输出模式
//其中GPIOB->CRL&=0X0FFFFFFF;表示PB7先清零
//其中(u32)8<<28表示0000 0000 0000 0000 0000 0000 0000 1000中的1左移28位(4*7)变为1000 0000 0000 0000 0000 0000 0000 0000

分析如下:
(1)STM32 的每个 IO 端口都有 7 个寄存器来控制。他们分别是:配置模式的 2 个 32 位的端口配置寄存器 CRL 和 CRH; 2 个 32 位的数据寄存器 IDR 和 ODR; 1 个 32 位的置位/复位寄存器BSRR;一个 16 位的复位寄存器 BRR; 1 个 32 位的锁存寄存器 LCKR。
CRL 和 CRH 控制着每个 IO 口的模式及输出速率。
其中端口低配置寄存器 CRL 如下表,CRH 的作用和 CRL 完全一样,只是 CRL 控制的是低 8 位输出口,而 CRH 控制的是高 8位输出口。
在这里插入图片描述
由表可知,STM32 的 CRL 控制着每组 IO 端口(A~G)的低 8 位(IO口的0-7端口)的模式,每个 IO 端口的位占用CRL的4个位,高两位为CNF,低两位为 MODE(相关描述见表)。
(2)#define
define表示宏定义,如#define Count int //只是简单地字符串替换,即Count i;与int i;同等效果;注意语句后无分号,注意与typedef 区别。
(3)利用寄存器控制IO口,一般先与运算清零再或运算置位
如:GPIOB->CRL&=0X0FFFFFFF;//先与运算清零再或运算置位
即端口B的寄存器CRL对应位值为0000 1111 1111 1111 1111 1111 1111 1111,也就是PB7先清零。
GPIOB->CRL|=(u32)8<<28;
//其中(u32)8<<28表示0000 0000 0000 0000 0000 0000 0000 1000中的1左移28位(4*7)变为1000 0000 0000 0000 0000 0000 0000 0000,对应CRL寄存器相应描述可知PB7为上拉/下拉输入模式。

其中28位(4*7)对应CRL中每4位控制1个IO口,也就是由控制PB0左移7组变为控制PB7。

猜你喜欢

转载自blog.csdn.net/qq_38693598/article/details/86512823
sda