[STM32]详解单片机GPIO输出模式配置-推挽与开漏

文章详细介绍了STM32单片机中GPIO配置的推挽输出(GPIO_Mode_Out_PP)和开漏输出(GPIO_Mode_Out_OD)模式。推挽输出能提供强驱动能力,适合驱动LED或蜂鸣器,而开漏输出常用于线与逻辑,需外接上拉电阻。配置示例代码也一并给出。

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

现在的很多单片机在GPIO配置的时候,除了配置输入输出类型、速度以外,还需要配置一下模式,即GPIO_Mode。以STM32为例,有输入浮空、输入上拉、输入下拉、模拟输入、开漏输出、推挽式输出、 推挽式复用功能、开漏复用功能。

GPIO_Mode_Out_PP原理说明:
在采用单片机系统做信号控制以及外部电路驱动时,为了加快控制速度和提高IO驱动能力,经常要使用推挽(push-pull)式输出模式,即GPIO_Mode_Out_PP。该模式根据输入不同,两个晶体管交替导通。在芯片内部采用CMOS工艺,是由两个场效应晶体管构成推挽式电路,STM32的内部的推挽电路由上P下N的MOSFET构成,MOSFET有3个极性,S源极、D漏极、G栅极。上P管的S接到电源VDD上,D接到下N管的D上,下N管的S接到电源地的VSS上。通过对于GPIO输出数据寄存器的数据写入,可以控制推挽式电路的栅极输出高低电平。当控制栅极为低电平时,上面的P沟道MOS管导通,下面的的N沟道MOS管截至,由于上管的S连接VDD,所以输出高电平。当控制栅极为高电平时,上面的P沟道MOS管截止,下面的的N沟道MOS管导通,由于下管的S连接VSS,所以输出低电平。对于STM32单片机,由于P沟道的MOS输出电流能力很强,所以推挽输出的电流最大可以输出20mA。对于驱动LED或者是蜂鸣器都是可以直接驱动的。

GPIO_Mode_Out_OD原理说明:
当通过配置将输出模式配置成开漏输出时,即GPIO_Mode_Out_OD。芯片内部上方的P沟道MOS管被关闭,这导致当栅极为低时,无法出书高电平1,而是输出高阻态Z,相当于开路状态。但是当控制栅极为高电平时,下面的的N沟道MOS管仍然可以导通,由于下管的S连接VSS,所以可以输出低电平0。开漏输出是为了实现逻辑器件的线与逻辑,如果配置成这种开漏输出,在需要电流输出驱动外部电路时,往往需要上拉一个电阻来提供电路的驱动电流,驱动能力的大小由外部上拉电阻决定,电阻越大,驱动能力越小,电阻越小,驱动能力越大,但是不能超过单片机的GPIO电流能力范围。

STM32单片机当端口被配置为输出的时候,输出缓冲器被激活。此时如果是开漏模式,输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将端口置于高阻状态,PMOS从不被激活。如果是推挽模式:输出寄存器上的’0’激活N-MOS,而输出寄存器上的’1’将激活P-MOS。并且每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH)用来配置模式与速度,两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR)用来存放端口的输入数据与端口的输出数据,一个32位置位/复位寄存器(GPIOx_BSRR)和一个16位复位寄存器(GPIOx_BRR)用来设置和清除端口数据,一个32位锁定寄存器(GPIOx_LCKR)用来所存端口当前配置。
推挽输出配置参考例程:
void PP_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;



    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

}
开漏输出配置参考例程:
void OD_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;



    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);



    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_Init(GPIOB, &GPIO_InitStructure);

}

---------------------
作者:forgot
链接:https://bbs.21ic.com/icview-3282460-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值