1.GPIO是统用I/O口,对于stm32来说,IO的输入与输出需要一定的寄存器来进行一些控制,从图中也能看出GPIO的输入与输出分别做不同的控制,包括位设置/清除寄存器,输入与输出寄存器,如果希望真正了解GPIO,这个图需要了解电流走向;
2.接下来就是非常实际的编程问题,在寄存器设置这一块,有两个需要设置,一个GPIOx->CRL或者GPIOx->CRH,(其中x可以取到A-G)这个部分是设置GPIO的输出/输入,以及速度,即其中的CNF1,CNF0,mode1,mode0 见下图:
下面是补充一下mode1,mode0对应的速度;
3.接下来想说的就是GPIO口的设置在stm32固件库里有直接设置的函数,可以调用,当然也可以自己设置,下面给出的是一个LED输出的初始化GPIO口的函数,用的就是调用固件库,推荐用固件库;
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50MHz
GPIO_Init(GPIOG, &GPIO_InitStructure); //GPIO
GPIO_SetBits(GPIOG,GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
}
4.另一个事是关于时钟的,之前有了解过时钟,也看过相关结构体和函数,但是一直不是很了解他的作用,这里给出一个时钟必须使用的地方就是,在初始化GPIO前必须使能GPIO的时钟,我不懂时钟,只是学习期,供大神给出解释。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOG, ENABLE);
5.还有一点就是上面关于CRL和CRH,这是两个32位寄存器,其实可以发现一个IO引脚需要4bit来确定输入输出方式及速度,所有CRL可以控制一个GPIO的0-7的8个引脚,CRH则控制8-15等8个引脚,正好确定了GPIOx的16个引脚;在一个就是GPIO的IDR和ODR,这两个均是32位寄存器,但都是去低16位来决定GPIO的引脚值,每位决定一个引脚值。这里给出GPIO->CRL的分配图,CRH类似;
目前就是我的了解。