1.gpio概述
gpio用于感知外部信号(输入)和控制外部设备(输出)。
gpio可以控制led灯,蜂鸣器。可直接由io口输出高低电平控制灯的亮灭。
也可用于usart,以及spi等外设,可以设置成复用功能。
2.gpio的八种工作模式
gpio有推挽输出,开漏输出,复用推挽,复用开漏这是输出模式
上拉输入,下拉输入,模拟输入,浮空输入。
2.1 gpio输出的四种模式
2.1.1 推挽输出
图中红框中当我们设置的寄存器输出1时,经过输出控制变为0,P-MOS导通,io引脚输出1
当我们设置的寄存器输出0时,经过输出控制变为1,N-MOS导通,io引脚输出0
2.1.2 开漏输出
当使用开漏输出时,P-MOS不起作用,N-MOS起作用,当我们设置寄存器输出1时,引脚若想输出高电平必须外接上拉电阻,如果不接上拉电阻,此时引脚就是悬空态。
当控制寄存器输出0时,那么引脚的电平就是低电平
2.1.3 复用推挽
当我们usart或者iic等外设用到了gpio引脚,那么引脚要设置成复用功能模式就有复用推挽
2.1.4 复用开漏
复用开漏也是和复用推挽一样的道理,就是输出模式不同,但都是复用功能模式
2.2 输入模式的四种模式
2.2.1 上拉输入
上拉输入,如图所示,设置上拉开关闭合,当没有外部信号的时候,默认引脚为高电平
2.2.2 下拉输入
当下拉开关控制闭合,输入引脚默认为低电平
2.2.3 浮空输入
当设置为浮空输入,引脚没有信号是,是悬空态,输入什么电平就是什么电平
2.2.4 模拟输入
模拟输入,就是采集模拟信号时要设置成的模式
3. 输出模式设置速度
有高速,中速,低速,一般设置成低速,只有用到复用功能,比如usart就需要设置成高速了。
4. gpio调用标准库写代码
4.1灯的闪烁
可知pa1输出低电平 灯就点亮
led.c
#include "led.h"
#include "stm32f10x.h"
//初始化led灯的函数
void LED_Init()
{
GPIO_InitTypeDef init;
//初始化时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//初始化led引脚GPIOA
init.GPIO_Mode = GPIO_Mode_Out_PP;
init.GPIO_Speed = GPIO_Speed_2MHz;
init.GPIO_Pin = GPIO_Pin_1;
GPIO_Init(GPIOA, &init);
}
main.c
int main()
{
LED_Init();
while(1)
{
GPIO_SetBits(GPIOA, GPIO_Pin_1);
delay(500);
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
delay(500);
}
}
4.2 蜂鸣器
蜂鸣器是低电平触发,我用杜邦线连接到开发板上,配置的是pa3引脚,和点亮led是一样的原理
beap.c
#include "beap.h"
#include "stm32f10x.h"
void beap_Init()
{
GPIO_InitTypeDef init;
//时钟使能
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
//GPIO初始化
init.GPIO_Mode = GPIO_Mode_Out_PP;
init.GPIO_Speed = GPIO_Speed_2MHz;
init.GPIO_Pin = GPIO_Pin_3;
GPIO_Init( GPIOA, &init);
}
这里要注意这个时钟使能要写对,我就是写的复位使能所以写错了,改回来蜂鸣器才响。
main.c
int main()
{
//LED_Init();
beap_Init();
while(1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_3);
}
}
4.3 按键控制灯的亮灭
让sw2控制灯亮,sw3控制灯灭
按键会抖动,所以用的时候要延时消抖。
为了保证采集数据的准确性,还要用松手检测。
key.c
#include "key.h"
#include "stm32f10x.h"
void Key_Init()
{
GPIO_InitTypeDef k1init;
GPIO_InitTypeDef k2init;
//时钟初始化
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//gpio初始化
k1init.GPIO_Mode = GPIO_Mode_IPU;
k1init.GPIO_Pin = GPIO_Pin_0;
k2init.GPIO_Mode = GPIO_Mode_IPU;
k2init.GPIO_Pin = GPIO_Pin_13;
GPIO_Init( GPIOA, &k1init);
GPIO_Init( GPIOC, &k2init);
}
main.c
int main()
{
LED_Init();//灯的初始化
Key_Init();//按键初始化
while(1)
{
if(!GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_0))
{
delay(5);//延时消抖
if(!GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_0))
{
while(!GPIO_ReadInputDataBit( GPIOA, GPIO_Pin_0));//松手检测
GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}
}
if(!GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_13))
{
delay(5);//延时消抖
if(!GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_13))
{
while(!GPIO_ReadInputDataBit( GPIOC, GPIO_Pin_13));//松手检测
GPIO_SetBits(GPIOA, GPIO_Pin_1);
}
}
}
}