STM32入门——GPIO输入输出

GPIO简介

  • GPIO(General Purpose Input Output)通用输入输出口 可配置为8种输入输出模式
  • 引脚电平:0V~3.3V,部分引脚可容忍5V
  • 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
  • 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等

GPIO基本结构

STM32入门——GPIO输入输出_第1张图片
GPIO位结构
STM32入门——GPIO输入输出_第2张图片
上拉:默认为高电平的输入
下拉:默认为低电平的输入
施密特触发器:稳定输出信号,高于上限输出高电平,低于下限输出低电平
模拟输入:这要连接到ADC上面,因为ADC(模拟转数字)需要接收模拟量

GPIO模式

STM32入门——GPIO输入输出_第3张图片
对应下面结构体
STM32入门——GPIO输入输出_第4张图片

浮空/上拉/下拉输入
STM32入门——GPIO输入输出_第5张图片
模拟输入
STM32入门——GPIO输入输出_第6张图片
开漏/推挽输出
STM32入门——GPIO输入输出_第7张图片
复用开漏/推挽输出
STM32入门——GPIO输入输出_第8张图片

GPIO寄存器描述(详细看手册)

这几个寄存器要看看
STM32入门——GPIO输入输出_第9张图片
LED和蜂鸣器
STM32入门——GPIO输入输出_第10张图片
LED:看引脚,长正短负

STM32入门——GPIO输入输出_第11张图片
三极管可作开关和放大:
导通:发射极正偏,集电极反偏;截止:均反偏

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




你可能感兴趣的:(江科大学习STM32记录,stm32,嵌入式硬件,单片机)