STM32(一)——GPIO

目录

一、GPIO

1.1  GPIO简介

 1.2  GPIO基本结构

1.3  GPI位微结构

二、三极管开关

2.1  PNP三极管

2.2  NPN三极管

三、LED闪烁&LED流水灯&蜂鸣器

3.1  RCC相关函数介绍

3.2  GPIO相关函数介绍

3.3  LED闪烁

3.4  LED流水灯

四、按键控制LED&光敏传感器控制蜂鸣器

4.1  按键控制LED

4.2  光敏传感器控制蜂鸣器


一、GPIO

1.1  GPIO简介

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

 1.2  GPIO基本结构

1.3  GPI位微结构

分为上面输入部分,下面输出部分,在I/O引脚处有两个二极管进行限幅保护

输入部分:

  • 连接了上拉电阻和下拉电阻,上面导通下面断开,就是上拉输入模式;上面断开下面导通,就是下拉输入模式;上下都断开,就是浮空输入模式(上下拉模式是为了给输入引脚一个默认状态,连接的电阻阻值较大,属于弱上下拉;浮空输入极易受外界干扰)
  • TTL施密特触发器:对输入电压进行整形(大于某一阈值时为高,低于某一阈值时为低)
  • 模拟输入:连接到ADC
  • 复用功能输入:连接到片上外设

输出部分:

  • 输出可由输出数据寄存器或片上外设控制,这两种控制方式通过数据选择器连接到了输出控制部分,位设置/清除寄存器可以单独操作输出寄存器的一位
  • 输出控制之后接到了两个MOS管(上面是P-MOS,下面是N-MOS),MOS管是一种电子开关
  • 推挽输出(推输出):P-MOS和N-MOS均有效,数据寄存器为1时,上管导通,下管断开,输出接到VDD,输出高电平;反之,数据寄存器为0时同理
  • 开漏输出:P-MOS无效,只有N-MOS有效,数据寄存器为1时,下管断开,输出高阻态模式;反之,数据寄存器为0时同理(低电平有驱动能力,高电平没有)(可用于I2C通信引脚)
  • 输出模式时输入也有效,输入模式时输出无效
  • 复用功能下通用输出无效,输出由片上外设控制,输入部分片上外设和输入寄存器都能读取引脚电平

二、三极管开关

2.1  PNP三极管

2.2  NPN三极管

三、LED闪烁&LED流水灯&蜂鸣器

3.1  RCC相关函数介绍

//
void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState);
//
void RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState NewState);
//
void RCC_APB1PeriphClockCmd(uint32_t RCC_APB1Periph, FunctionalState NewState);

3.2  GPIO相关函数介绍

//恢复GPIO缺省配置
void GPIO_DeInit(GPIO_TypeDef* GPIOx);
//恢复AFIO缺省配置
void GPIO_AFIODeInit(void);
//GPIO初始化
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
//GPIO初始化函数的结构体初始化
void GPIO_StructInit(GPIO_InitTypeDef* GPIO_InitStruct);
---------------------------------------------------------------------
//读取指定输入端口
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取输入数据寄存器
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
//读取指定输出端口(用于输出模式)
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//读取输出数据寄存器(用于输出模式)
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
---------------------------------------------------------------------
//指定端口置0
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//指定端口置1
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
//指定端口置一个数
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
//对16位输出数据寄存器操作
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);
---------------------------------------------------------------------
void GPIO_PinLockConfig(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_EventOutputConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_EventOutputCmd(FunctionalState NewState);
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource);
void GPIO_ETH_MediaInterfaceConfig(uint32_t GPIO_ETH_MediaInterface);

3.3  LED闪烁

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	GPIO_ResetBits(GPIOE,GPIO_Pin_5);
	while(1)
	{
		GPIO_WriteBit(GPIOE, GPIO_Pin_5, Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOE, GPIO_Pin_5, Bit_SET);
		Delay_ms(500);
	}
}

3.4  LED流水灯

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

int main(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOE,&GPIO_InitStructure);
	GPIO_Init(GPIOB,&GPIO_InitStructure);
	while(1)
	{
		GPIO_WriteBit(GPIOE, GPIO_Pin_5, Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOE, GPIO_Pin_5, Bit_SET);
		GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_RESET);
		Delay_ms(500);
		GPIO_WriteBit(GPIOB, GPIO_Pin_5, Bit_SET);
	}
}

四、按键控制LED&光敏传感器控制蜂鸣器

4.1  按键控制LED

LED.c

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

//LED1开
void LED1_ON(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_5);
}

//LED1关
void LED1_OFF(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_5);
}

//LED1翻转
void LED1_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5) == 0)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_5);
	}
	else
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_5);
	}
}

//LED2开
void LED2_ON(void)
{
	GPIO_ResetBits(GPIOE, GPIO_Pin_5);
}

//LED2关
void LED2_OFF(void)
{
	GPIO_SetBits(GPIOE, GPIO_Pin_5);
}

//LED2翻转
void LED2_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOE, GPIO_Pin_5) == 0)
	{
		GPIO_SetBits(GPIOE, GPIO_Pin_5);
	}
	else
	{
		GPIO_ResetBits(GPIOE, GPIO_Pin_5);
	}
}

Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOE,&GPIO_InitStructure);
}

//判断按键并返回按键值
uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0)
	{
		Delay_ms(20);
		while(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	return KeyNum;
}

main.c

#include "stm32f10x.h"  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"


uint8_t KeyNum;


int main(void)
{
	LED_Init();
	Key_Init();
	
	while(1)
	{
		KeyNum = Key_GetNum();
		if(KeyNum == 1)
		{
			LED1_Turn();
		}
		if(KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}

4.2  光敏传感器控制蜂鸣器

Buzzer.c

#include "stm32f10x.h"                  // Device header

void Buzzer_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOB, GPIO_Pin_8);
}

void Buzzer_ON(void)
{
	GPIO_SetBits(GPIOB, GPIO_Pin_8);
}

void Buzzer_OFF(void)
{
	GPIO_ResetBits(GPIOB, GPIO_Pin_8);
}

void Buzzer_Turn(void)
{
	if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_8) == 0)
	{
		GPIO_SetBits(GPIOB, GPIO_Pin_8);
	}
	else
	{
		GPIO_ResetBits(GPIOB, GPIO_Pin_8);
	}
}

LightSensor.c

#include "stm32f10x.h"                  // Device header

void LightSensor_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOB,&GPIO_InitStructure);
}

uint8_t LightSensor_Get(void)
{
	return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13);
}

main.c

#include "stm32f10x.h"  // Device header
#include "Delay.h"
#include "Buzzer.h"
#include "LightSensor.h"

uint8_t KeyNum;


int main(void)
{
	Buzzer_Init();
	LightSensor_Init();
	
	while(1)
	{
		if(LightSensor_Get() == 1)
		{
			Buzzer_ON();
		}
		else
		{
			Buzzer_OFF();
		}
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值