目录
一、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();
}
}
}