STM32寄存器操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33194301/article/details/89397254

习惯用标准库的我有时见到写满寄存器操作的程序就头皮发麻,不过仔细想想这些东西有手册就很好办,虽然相对标准库或者是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)。
接下来就好办了。

下面看一下每个端口的寄存器配置:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述再结合这段代码:
{GPIOC->CRL&=0XFFFFFF0F;GPIOC->CRL|=(u32)8<<4; GPIOC->ODR&=0XFFFFFFFD;GPIOC->ODR|=(u32)1<<1;}
我的目的是将PC1引脚设置成上拉输入。

前面这一句是将PC1引脚配置的寄存器先清零
然后后面这句是将1000B左移四位与CRL求
即将PC1引脚配置寄存器设置为1000B,
对比上面的端口位配置表可以知道配置模式为输入
但是是上拉还是下拉输入呢?
接下来还需要配置PxODR寄存器
在这里插入图片描述GPIOC->ODR &=0XFFFFFFFD;GPIOC->ODR |=(u32)1<<1;
这句话就是让GPIOC的ODR寄存器对应GPIO_Pin1的ODR1位置1。(测试发现不加这句话,默认用下拉输入也行,这一定程度上可以减少代码量吧)
到这步我想大家对寄存器的操作有些明了了吧。

我找的一些关于STM32比较全的手册资料,感兴趣的朋友可以下载来看一看:
STM32比较全面的几个手册
参考网址:
寄存器操作端口模式SDA_OUT()/SDA_IN()这篇参考文章有些错误,大家斟酌看一下

猜你喜欢

转载自blog.csdn.net/qq_33194301/article/details/89397254