STM32入门——GPIO输入输出

本文介绍了GPIO(通用输入输出)在电子设计中的基本概念、模式选择、结构描述,包括上拉/下拉输入、模拟输入、不同输出模式以及使用案例,如LED控制和按键扫描。还提及了GPIO寄存器和RCC时钟管理的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
	}
	
	
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值