本篇文章只是移植别人例程的时候遇到的寄存器操作,并不是专门寄存器编程的文章。
(2021/11/14编辑)
1. IO设置
IO口的寄存器设置就两步骤
- 设置引脚
- 设置方向及模式
1.1 引脚的设置
- 每个IO口有两个寄存器CRH和CRL来设置IO口
- 每个引脚占用寄存器的4个位,32位的寄存器即控制8个引脚
设置哪个引脚将其对应的4个位全置0即可 - 其中CRH寄存器用来设置IO口高8位的引脚(如:PA8–PA15),CRL寄存器用来设置IO口低8位的引脚(如:PA0–PA7)
示例:
以PA0为例设置寄存器,总共需要两步,首先设置引脚,然后设置方向及模式
GPIOA->CRL&=0xFFFFFFF0; //设置引脚为PA0
GPIOA->CRL|=8<<0; //设置引脚的方向与模式
1.2 方向及模式的设置
之前说了每个引脚由寄存器的4个位进行设置,我们给出如下的寄存器真值表。
1、0位:设置方向
0 0 :输入
0 1 :输出(最大速度10Mhz)
1 0 :输出(最大速度20Mhz)
1 1 :输出(最大速度50Mhz)
3、2位数:设置模式
当方向为输入时:
0 0:模拟输入
0 1:浮空输入
1 0:上/下拉输入
1 1:保留
当方向为输出时:
0 0:通用推挽输出
0 1:通用开漏输出
1 0:复用推挽输出
1 1:复用开漏输出
所以在我另外一篇DHT11传感器使用的文章中的引脚设定的意思为
#define DHT11_IO_IN() {DHT11_GPIO_Port->CRL&=0XFFFFFFF0;DHT11_GPIO_Port->CRL|=8<<0;}
#define DHT11_IO_OUT() {DHT11_GPIO_Port->CRL&=0XFFFFFFF0;DHT11_GPIO_Port->CRL|=3<<0;}
以上的意思就是
- 设置引脚为DHT11_GPIO_Port的0号引脚
- 8的二进制代码为1000,对应上面的真值表即为:输入模式、上/下拉输入