hejun96 发表于 2020-2-18 20:21:05

STM32F1配置AT24C02的SDA_IN和SDA_OUT的方向和GPIO_CRH和GPIO_CRL

      在之前的一次用STM32F1配置AT24C02时,之前错误的写法是这样
//#define SDA_IN(){GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
//#define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}

   配置正确的写法是这样:
#define SDA_IN(){GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)4<<4;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)3<<4;}


就是这两行写的不一样导致的这个错误,这个应该怎么解释?把CRL改成CRH就可以了是什么原因呢?
file:///C:\Users\Administrator\Documents\Tencent Files\643011664\Image\C2C\~0JVYN3ZF04J_LR9VR%UN(2.png
file:///C:\Users\Administrator\Documents\Tencent Files\643011664\Image\C2C\~0JVYN3ZF04J_LR9VR%UN(2.png

哀歌与世无争 发表于 2020-2-19 09:32:07


一个io配置位口占4bit,通过CNF1,CNF0,MODE1,MODE0组合可以配置成各种模式。
GPIOB->CRH&=0XFFFFFF0F;这里用与运算,和0相与都为0,和1相与都为本身,所以可以清除PB9的配置位又能保持其他IO口配置不变。
GPIOB->CRH|=(u32)4<<4;前面的是4,因为4的二进制是0100,也就是浮空输入;后面左移4是因为PB9是在CRH寄存器的bit4-bit7,所有左移4位;
用或运算,可以配置PB9又能保持其他IO口配置不变。

哀歌与世无争 发表于 2020-2-18 20:56:45

看原理图现在SDA连的是PB9,GPIIO配置寄存器CRL是配置端口0-7的,CRH配置8-15,看你原来的代码SDA连的是PB7吧,现在改PB9所以要改成CRH。

hejun96 发表于 2020-2-18 22:10:01

哀歌与世无争 发表于 2020-2-18 20:56
看原理图现在SDA连的是PB9,GPIIO配置寄存器CRL是配置端口0-7的,CRH配置8-15,看你原来的代码SDA连的是PB7 ...

是的,的确和所说一样#define SDA_IN(){GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)4<<4;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)3<<4;}
比方说4 << 4 后面的4 表示的是PB9 ,但是手册里面还有一个5是否也可以写成 4<<5? 那写在前面的3和4表示的是什么?
GPIOB->CRH&=0XFFFFFF0F;为啥前面与,后面又是GPIOB->CRH|=(u32)4<<4;或的?


hejun96 发表于 2020-2-18 22:11:19

哀歌与世无争 发表于 2020-2-18 20:56
看原理图现在SDA连的是PB9,GPIIO配置寄存器CRL是配置端口0-7的,CRH配置8-15,看你原来的代码SDA连的是PB7 ...

是的,的确和所说一样#define SDA_IN(){GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)4<<4;}
#define SDA_OUT() {GPIOB->CRH&=0XFFFFFF0F;GPIOB->CRH|=(u32)3<<4;}
比方说4 << 4 后面的4 表示的是PB9 ,但是手册里面还有一个5是否也可以写成 4<<5? 那写在前面的3和4表示的是什么?
GPIOB->CRH&=0XFFFFFF0F;为啥前面与,后面又是GPIOB->CRH|=(u32)4<<4或的?


页: [1]
查看完整版本: STM32F1配置AT24C02的SDA_IN和SDA_OUT的方向和GPIO_CRH和GPIO_CRL