本文以讲解stm32f103c8t6为例,板子上具体有多少个IO口,我们可以查看相应的数据手册来获取。
对GPIO口的简单理解是:输入输出的接口。
其输入输出模式共有8种,可以分为:
输入模式 | 输出模式 | |
GPIO | GPIO_Mode_AIM (模拟输入) | GPIO_Mode_Out_OD(开漏输出) |
GPIO_Mode_IN_FLOATING (浮空输入) | GPIO_Mode_Out_PP(推挽输出) | |
GPIO_Mode_IPD (下拉输入) | GPIO_Mode_AF_OD(复用开漏输出) | |
GPIO_Mode_IPU (上拉输入) | GPIO_Mode_AF_OD(复用推挽输出) |
下边我们通过GPIO输出点亮一颗LED灯来说GPIO的一些配置操作吧
首先看一下点亮一颗LED灯的原理图,如下:
图中原理图一端连接的是电源,则GPIO口接入低电平时LED灯亮,当接入高电平是LED灯灭。
实现的代码:
void LED_UserConfig(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //类似于 char a;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启外设时钟
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;// 模式(推挽输出)
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//设置引脚
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;速率(设置为2MHz)
GPIO_Init(LED_PORT, &GPIO_InitStruct);
GPIO_SetBits(LED_PORT, GPIO_Pin_5);//LOW 0 低电平
}
因为我们是让LED作为一个输出状态来显示的,所以在配置GPIO口的模式时选择了输出模式。如果我们弄一个按键来控制一个LED灯时则需要选择的模式为输入模式。
原理图如下:
按键是接低电平的,且引脚接到GPIO_Pin_1脚。
具体引脚配置代码如下:
因为按键的一段接的是低电平,所以引脚的一段接的是高电平,则设置为上拉输入。
u8 FLAG = 0;
void LED_UserConfig(void)
{
GPIO_InitTypeDef GPIO_InitStruct; //类似于 char a;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//开启外设时钟
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_5;//设置引脚
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(LED_PORT, &GPIO_InitStruct);
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;//上拉输入
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;//设置引脚
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(LED_PORT, &GPIO_InitStruct);
//GPIO_SetBits(LED_PORT, GPIO_Pin_5);//LOW 0 低电平
}
void KEY_UserConfig(void)//中断函数
{
if(GPIO_ReadInputDataBit(GPIO_Pin_1,GPIOA) = RESET){
if(GPIO_ReadInputDataBit(GPIO_Pin_1,GPIOA) = RESET)
{
FLAG = 1;//标志位
}
while(!GPIO_ReadInputDataBit(GPIO_Pin_1,GPIOA));//松手检测
}
}