GPIO简介
- GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式
- 引脚电平:0V~3.3V,部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
GPIO基本结构
GPIO位结构
上拉:默认为高电平的输入
下拉:默认为低电平的输入
施密特触发器:稳定输出信号,高于上限输出高电平,低于下限输出低电平
模拟输入:这要连接到ADC上面,因为ADC(模拟转数字)需要接收模拟量
GPIO模式
对应下面结构体
浮空/上拉/下拉输入
模拟输入
开漏/推挽输出
复用开漏/推挽输出
GPIO寄存器描述(详细看手册)
这几个寄存器要看看
LED和蜂鸣器
LED:看引脚,长正短负
三极管可作开关和放大:
导通:发射极正偏,集电极反偏;截止:均反偏
案例1:按键控制LED
LED.c
#include "LED.h"
void LED_Init(void)
{
//开启对应时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
//初始化PC13
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStructure);
}
void LED_setState(uint8_t state)//LED设置状态
{
if(state == 1){
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}else {
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
}
void LED_Turn(void)//LED翻转
{
if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_13) == Bit_SET){
LED_setState(0);
Delay_ms(500);
}else {
LED_setState(1);
Delay_ms(500);
}
}
KEY.c
#include "key.h"
void Key_Init(void)
{
//开启对应时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//初始化PA0
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
}
void Key_Scan(void)//按下就亮,松开就灭
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == Bit_RESET){
Delay_ms(20);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == Bit_RESET){
LED_setState(0);
}
while((GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == Bit_RESET));
}else {
LED_setState(1);
}
}