一、要理解固定库操作GPIOx的寄存器,首先固定库通过
void GPIO_Init(GPIO_TypeDef GPIOx, GPIO_InitTypeDef GPIO_InitStruct)
函数来实现的。这函数 操作寄存器CRL和CRH
二、认识GPIO的配置寄存器CRL和CRH
STM32的一组GPIO有16个IO口,比如GPIOA这一组,有GPIOA0~GPIOA15一共16个IO口。每一个IO口需要寄存器的4位用来配置工作模式。
那么一组GPIO就需要16x4=64位的寄存器来存放这一组GPIO的工作模式的配置,但STM32的寄存器都是32位的,所以只能使用2个32位的寄存器来存放了。CRL用来存放低八位的IO口(GPIOx0—GPIOx7)的配置,CRH用来存放高八位的IO口(GPIOx8—GPIOx15)的配置。
这两个寄存器的全称是:端口配置低寄存器(GPIOx_CRL) (x=A…E) 和 端口配置高寄存器(GPIOx_CRH) (x=A…E)
也就是每一组GPIO都有两个32位的寄存器是用来配置IO口的工作模式的。
三、CRL与CRH
CRL与CRH分别为端口配置低与端口配置高寄存器,为32位寄存器,其中每四位控制一个I/O口。
对CNFy与MODEy(y=0,1,2…7)位写1或0控制I/O口的输入输出模式
面来几个例子就明白了
例如PD1配置为推挽输出,最大速度50MHz
GPIOD->CRL=3<<4 写成二进制:0011----左移四位得到00110000 下划线代表PD0的操作。00110000这个代表PD1的操作.0011中的11代表输出模式,最大速度为50MHZ。而00代表通用输出模式。
再比如PC10配置为复用推挽输出,最大速度2MHz
GPIOC->CRH=0xA<<8
注释:0x为十六进制格式,A表示十进制10,换成二进制就是1010,
左移后的结果1010 0000 0000 下划线代表操作PC8与PC9.再来看
结果1010 0000 0000 下划线右边两位10代表输出模式,输出速度为2MHz
而最左边10复用推挽输出. 下一篇介绍IDR与ODR分别为输入与输出数据寄存器.