1.模式功能
GPIO分为4种工作模式(通用输入模式、通用输出模式、模拟模式、复用模式),8种功能。
(1)输入浮空:在没有外界干扰的情况下,引脚自身的电平不确定,可以是高电平也可能是低电平,当外界传输一个确定的电平之后,引脚会变成和外界传输的信号一样的电平。主要用来检测外界传输的电平。
(2)输入上拉:在没有外界干扰的情况下,引脚本身处于高电平状态,主要用来检测低电平信号。
(3)输入下拉:在没有外界干扰的情况下,引脚本身处于低电平状态,主要用来检测高电平信。
(4)模拟功能:可以分为两种,一种是模拟输入(专属于ADC),一种是模拟输出(DAC)。
(5)推挽输出:既可输出高电平1也可输出低电平0。
(6)开漏输出:开漏输出也叫断开输出,可以正常输出低电平0,但没有输出高电平1的能力,如果需要输出高电平1,必须配置成上拉功能的开漏输出,或者外接一个上拉电阻。开漏输出一般用于GPIO端口对“输入输出方向”切换,或者需要较强的驱动能力时使用。
(7)复用功能推挽:是使用端口的第二功能,复用功能推挽可输出高电平,也可输出低电平
(8)复用功能开漏:是使用端口的第二功能,复用功能推挽只能输出低电平,如果需要输出高电平则需要上拉电阻。
2.配置(寄存器)
①开启相应端口时钟 ②配置所需模式 如果是输出(输出类型(开漏/推挽),输出速度) 如果是输入(上拉/下拉/浮空) ③如果是输出模式则还需配置输出速度 ④根据具体情况设置初始电平 |
2.1端口模式寄存器
配置相应模式

2.2端口输出类型寄存器
配置输出类型(如果是输入模式无需配置)


2.3端口输出速度寄存器
配置输出速度(如果是输入模式无需配置)

2.4端口上拉/下拉寄存器
配置输入模式(上拉、下拉、浮空)


3.应用
#include "gpio.h"
/*******************************
函数功能:LED1初始化函数
硬件接口:
LED1----PF6-----低电平点亮
LED2----PF9-----低电平点亮
LED3----PF10-----低电平点亮
LED4----PC0-----低电平点亮
********************************/
void LED_Init(void)
{
RCC->AHB1ENR |= 1<<5; //开启F口时钟
RCC->AHB1ENR |= 1<<2; //开启C口时钟
//PF6
GPIOF->MODER &= ~(3<<2*6); //清零
GPIOF->MODER |= 1<< 2*6; //通用输出功能
GPIOF->OTYPER &= ~(1<<6); //推挽输出
GPIOF->OSPEEDR &= ~(3<<2*6); //清零
GPIOF->OSPEEDR |= 2<<2*6; //输出速度为50MHZ
GPIOF->ODR |= 1<<6; //初始电平为高电平
//PF9
GPIOF->MODER &= ~(3<<2*9); //清零
GPIOF->MODER |= 1<< 2*9; //通用输出功能
GPIOF->OTYPER &= ~(1<<9); //推挽输出
GPIOF->OSPEEDR &= ~(3<<2*9); //清零
GPIOF->OSPEEDR |= 2<<2*9; //输出速度为50MHZ
GPIOF->ODR |= 1<<9; //初始电平为高电平
//PF10
GPIOF->MODER &= ~(3<<2*10); //清零
GPIOF->MODER |= 1<< 2*10; //通用输出功能
GPIOF->OTYPER &= ~(1<<10); //推挽输出
GPIOF->OSPEEDR &= ~(3<<2*10); //清零
GPIOF->OSPEEDR |= 2<<2*10; //输出速度为50MHZ
GPIOF->ODR |= 1<<10; //初始电平为高电平
//PC0
GPIOC->MODER &= ~(3<<2*0); //清零
GPIOC->MODER |= 1<< 2*0; //通用输出功能
GPIOC->OTYPER &= ~(1<<0); //推挽输出
GPIOC->OSPEEDR &= ~(3<<2*0); //清零
GPIOC->OSPEEDR |= 2<<2*0; //输出速度为50MHZ
GPIOC->ODR |= 1<<0; //初始电平为高电平
}
/*****************************************
函数功能:BEEP初始化
硬件接口:
BEEP----PF8----高电平响
*****************************************/
void BEEP_Init(void)
{
RCC->AHB1ENR |= 1<<5; //开启F口时钟
//PF8
GPIOF->MODER &= ~(3<<2*8); //清零
GPIOF->MODER |= 1<< 2*8; //通用输出功能
GPIOF->OTYPER &= ~(1<<8); //推挽输出
GPIOF->OSPEEDR &= ~(3<<2*8); //清零
GPIOF->OSPEEDR |= 2<<2*8; //输出速度为50MHZ
GPIOF->ODR &= ~(1<<8); //初始电平为高电平
}
/*******************************
函数功能:按键初始化
函数参数:无
函数返回值:无
硬件接口:
KEY1----PA0-----输入浮空/输入下拉
-按键没有按下为低电平,按键按下为高电平
********************************/
void KEY_Init(void)
{
RCC->AHB1ENR |= 1<<0; //开启A口时钟
GPIOA->MODER &= ~(3<<0*2); //清零&&输入
GPIOA->PUPDR &= ~(3<<0*2); //清零&&浮空
}