目录
一、功能描述
通过库函数来配置寄存器,控制GPIO的输出。要使用GPIO,首先要使能时钟,再调整GPIO的输出模式、引脚选择、输出速度。本次实验就是学会GPIO的使用。
二、GPIO介绍
- GPIO(General Purpose Input Output)通用输入输出口可配置为8种输入输出模式
- 引脚电平:0V~3.3V部分引脚可容忍5V
- 输出模式下可控制端口输出高低电平,用以驱动LED、控制蜂鸣器、模拟通信协议输出时序等
- 输入模式下可读取端口的高低电平或电压,用于读取按键输入、外接模块电平信号输入、ADC电压采集、模拟通信协议接收数据等
2.1 GPIO的基本结构
- GPIO都是挂在APB2上的,所以GPIO时钟是由APB2外设时钟控制函数来开启。
2.2 GPIO位结构和输入/输出模式
通过配置寄存器来控制上图中各个开关的打开和闭合、推挽输出、开漏输出或者输出关闭。
- 上拉输入:上拉电阻开关闭合,引脚悬空时为高电平。
- 下拉输入:下拉电阻开关闭合,引脚悬空时为低电平。
- 模拟输入:施密特触发器关闭,引脚直接接内部ADC。
- 推挽输出:P-MOS和N-MOS都工作。输出为1时,P-MOS导通,输出为高电平;输出为0时,N-MOS导通,输出为低电平。
- 开漏输出:只有N-MOS工作。输出为1时,N-MOS不导通,输出为高阻状态;输出为0时,N-MOS导通,输出低电平。在I2C总线,可用于多机通信。
模式名称 |
性质 |
特征 |
浮空输入 |
数字输入 |
可读取引脚电平,若引脚悬空,则电平不确定 |
上拉输入 |
数字输入 |
可读取引脚电平,内部连接上拉电阻,悬空时默认高电平 |
下拉输入 |
数字输入 |
可读取引脚电平,内部连接下拉电阻,悬空时默认低电平 |
模拟输入 |
模拟输入 |
GPIO无效,引脚直接接入内部ADC |
开漏输出 |
数字输出 |
可输出引脚电平,高电平为高阻态,低电平接VSS |
推挽输出 |
数字输出 |
可输出引脚电平,高电平接VDD,低电平接VSS |
复用开漏输出 |
数字输出 |
由片上外设控制,高电平为高阻态,低电平接VSS |
复用推挽输出 |
数字输出 |
由片上外设控制,高电平接VDD,低电平接VSS |
三、程序
GPIO初始化步骤:
- 使能时钟。GPIO是挂在APB2上的,所以用RCC_APB2PeriphClockCmd这个函数开启时钟。
- GPIO初始化。包括GPIO的输出模式、引脚选择、输出速度。
注意:GPIO配置好后默认是低电平。
#include "stm32f10x.h" // Device header
#include "Delay.h"
int main()
{
//初始化GPIOA口
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure1;
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure1.GPIO_Pin=GPIO_Pin_All;
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure1);
//初始化GPIOB口
GPIO_InitTypeDef GPIO_InitStructure2;
GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure2);
while(1)
{
GPIO_Write(GPIOA,~0x0001);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0002);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0004);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0008);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0010);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0020);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0040);
Delay_ms(100);
GPIO_Write(GPIOA,~0x0080);
Delay_ms(100);
GPIO_ResetBits(GPIOB,GPIO_Pin_12);
Delay_ms(100);
GPIO_SetBits(GPIOB,GPIO_Pin_12);
}
}
四、效果演示
LED流水灯,每循环一次蜂鸣器都响100ms。
STM32点个灯