什么是GPIO
GPIO 英文全称 general porpose intput output 即,通用输入输出端口。 顾名思义,芯片最基本的输入输出接口。
STM32或其它单片机芯片的GPIO引脚可以与外部设备连接起来,可以实现与外部设备通讯、控制或者数据采集的功能。除了电源类引脚(VDD、VSS、VREF+、VREF-、VSSA、VDDA)、 晶振引脚(OSC_IN、OSC_OUT )复位管引脚NRST、BOOT 引脚(BOOT0 、BOOT1),其它一般都是GPIO引脚 , 取名 PA1、PA2…PB1、PB2…PC1、PD1… 等等。
作为输出时,可以控制为外设的高低电平,控制LED、 输出PWM、输出时钟等等,作为输入可以用作ADC、DAC、电平检测、中断等功能。
STM32中GPIO的基础实现
GPIO最为最基础的实现也就是将端口作为高低电平来使用。
1、初始化
下面的代码stm32的GPIO初始化,其中GPIO_Output_Init_PE5(void)是初始化PE5口为输出的GPIO口,将端口的初始化结构体赋值并将其设置为高电平。其中GPIO_Input_Init(void)是将PA5设置为输入的GPIO口。
//GPIO 输出初始化
void GPIO_Output_Init_PE5(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOE时钟
//GPIO初始化设置
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//指定pin脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//无上下拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化
GPIO_SetBits(GPIOE,GPIO_Pin_5);//设置高电平
}
//GPIO 输入初始化
void GPIO_Input_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //指定pin脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//指定输入模式
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化
}
2、控制输出
前面如果已经初始化好了输出模式,那么我们就可以将该口的输出就可以任由我们控制了。通过GPIO_ResetBits函数可以将指定口的电平置低,而通过GPIO_SetBits则可以将指定的端口置高。
//输出低
GPIO_ResetBits(GPIOE,GPIO_Pin_5);//设置PE5为低电平
//输出高
GPIO_SetBits(GPIOE,GPIO_Pin_5);//设置PE5为高电平
3、控制输入
如果已经初始化好了输入模式,那我们就可以将该口用来检测输入和打印效果,见下面的程序实现。
//############## 输入电平测试 ############//
void GpioLevelTest()
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_5))//返回为1,检测为高电平
{
printf("------->1\r\n");
}
else
{
printf("------->0\r\n");
}