GPIO简介

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

GPIO基本结构:

GPIO位结构

输入电路中TTL肖特基触发器,应为施密特触发器,翻译错误。对输入电压进行整形。

GPIO模式

模式名称性质特征
浮空输入数字输入可读取引脚电平,若引脚悬空,则电平不确定
上拉输入数字输入可读取引脚电平,内部连接上拉电阻,悬空时默认高电平
下拉输入数字输入可读取引脚电平,内部连接下拉电阻,悬空时默认低电平
模拟输入模拟输入GPIO无效,引脚直接接入内部ADC
开漏输出数字输出可输出引脚电平,高电平为高阻态,低电平接VSS
推挽输出数字输出可输出引脚电平,高电平接VDD,低电平接VSS
复用开漏输出数字输出由片上外设控制,高电平为高阻态,低电平接VSS
复用推挽输出数字输出由片上外设控制,高电平接VDD,低电平接VSS

浮空/上拉/下拉输入

模拟输入

开漏/推挽输出

复用开漏/推挽输出

相关寄存器

端口配置低寄存器(GPIOx_CRL(x=A..E、端口配置高寄存器(GPIOx_CRH(x=A..E):每位端口的模式由4位控制。

端口输出速度:可以选择端口的翻转速度,为了低功耗和稳定性,一般直接配置成50Mhz即可。

端口输入数据寄存器(GPIOx_IDR)(x=A..E)。

端口输出数据寄存器(GPIOx_ODR)(x=A..E)。

端口位设置/清除寄存(GPIOx_BSRR)(x=A..E):高16位为位清除用的,低16位为位位设置的。

端口位清除寄存器(GPIOx_BRR)(x=A..E): 跟上面寄存器一样,为了方便操作及同步性考虑。

端口配置锁定寄存器(GPIOx_LCKR)(x=A..E)

LED和蜂鸣器简介

LED:发光二极管,正向通电点亮,反向通电不亮。
有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可持续发声,频率固定。
无源蜂鸣器:内部不带振荡源,需要控制器提供振荡脉冲才可发声,调整提供振荡脉冲的频率,可发出不同频率的声音。

面包板

点亮LED试验

RCC相关函数介绍stm32f10x_rcc.h

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

GPIO相关函数stm32f10x_gpio.h

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
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);
void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

main函数

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

int main(void)
{
    //开启时钟
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA,ENABLE);
    
    //配置GPIO模式
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 ;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
    
    //点灯
    //GPIO_SetBits(GPIOA,GPIO_Pin_0);
    //GPIO_ResetBits(GPIOC,GPIO_Pin_0);
 
    while(1)
    {
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);//亮
        Delay_ms(500);
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);//灭
        Delay_ms(500);
    }
}

按键简介

按键:常见的输入设备,按下导通,松手断开。
按键抖动:由于按键内部使用的是机械式弹簧片来进行通断的,所以在按下和松手的瞬间会伴随有一连串的抖动。

传感器模块简介

传感器模块:传感器元件(光敏电阻/热敏电阻/红外接收管等)的电阻会随外界模拟量的变化而变化,通过与定值电阻分压即可得到模拟电压输出,再通过电压比较器进行二值化即可得到数字电压输出。

GPIO读取输入相关函数

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