习惯用标准库的我有时见到写满寄存器操作的程序就头皮发麻,不过仔细想想这些东西有手册就很好办,虽然相对标准库或者是HAL库看起来不太容易懂就是了。
例如在关于IIC协议里面的程序通常会见到SDA_IN、SDA_OUT宏定义:
e.g.
#define SDA_IN() {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=(u32)8<<4; GPIOC->ODR &=0XFFFFFFFD;GPIOC->ODR |=(u32)1<<1;} //PC1上拉输入
#define SDA_OUT() {GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=(u32)3<<4;} //PC1推挽输出
接下来我们看看STM32手册上关于GPIO寄存器的说明
其中GPIOx_CRL决定端口的低八位(GPIO_Pin_0 ~ GPIO_Pin_7),而GPIOx_CRH则决定高八位(GPIO_Pin_8 ~ GPIO_Pin_15)。
接下来就好办了。
下面看一下每个端口的寄存器配置: