每个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; //设置引脚的方向与模式
设置当前引脚的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:复用开漏输出
那么开头的例子就是设置PA0引脚为上下拉输入
OK再举个例子
设置PA2引脚为通用开漏输出
//首先设置引脚
GPIOA->CRL&=0xFFFFF0FF //将2号IO口对应的4个位全置0
//其次设置方向与模式
GPIOA->CRL|=7<<8 //通用开漏输出为0111(速度可自选也可以是0110),左移8位即设置到2号IO口