GPIO端口

GPIO(通用输入/输出)具有4种工作模式和8种功能,包括输入浮空、输入上下拉、模拟输入输出、推挽和开漏输出等。配置GPIO涉及开启端口时钟、设置模式、输出类型、速度以及上拉/下拉。示例代码展示了如何初始化LED和按键的GPIO配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);  //清零&&浮空
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值