STM32——关于GPIO口的输出方式和输入方式

在STM32中,我们会要使用程序来对I/O口进行控制,当我们使用I/O口时,我们就需要知道在程序中我们需要这个I/O口来实现什么功能,是输入还是输出。

 

1、使用输出模式

I/O口常用的输出方式有推挽输出和开漏输出。

(1)推挽输出(GPIO_Mode_Out_PP):可以输出高、低电平,连接数字器件。

(2)开漏输出(GPIO_Mode_Out_OD):输出端相当于三极管的集电极,要得到高电平状态,需要外接上拉电阻。它适合于做电流型的驱动,其吸收电流的能力相对较强,一般可达到20mA。

在开漏输出模式下,P-MOS是无效的,只有N-MOS在工作,数据寄存器为1时,下管断开,这时输出相当于断开,也就是高阻模式。数据寄存器为0时,下管导通,输出直接接到Vss,也就是输出低电平。这种模式下,只有低电平具有驱动能力,高电平是没有驱动能力的。

2、使用输入模式

(1)输入浮空(GPIO_Mode_IN_FLOATING):信号进入芯片内部后,即没有经过上拉电阻也没有经过下拉电阻,只经由施密特触发器输入。如果被配置成该模式,其端口的电平不确定。由于其输入阻抗比较大,所以一般把这种模式用于标准的通信协议。

(2)输入上拉(GPIO_Mode_IPU):上拉输入,就是信号进入芯片后被内部的一个上拉电阻上拉,再经过施密特触发器转换成0、1信号,因此,复位后该引脚电平为高电平。

(3)输入下拉(GPIO_Mode_IPD):下拉输入,就是信号进入芯片后被内部的一个下拉电阻下拉,再经过施密特触发器转换成0、1信号,因此,复位后该引脚电平为低电平。

(4)模拟输入(GPIO_Mode_AIN):信号进入芯片后不经过上拉电阻或者下拉电阻,也不经过施密特触发器,经由另一线路把电压信号传送到偏上相应的外设模块。例如,通常是ADC模块,然后由ADC采集电压信号。因此,可以将这种方式理解为模拟输入的信号是未经处理的信号,是“原汁原味”的信号。

 

  •  序号1,这里是I/O引脚,在这里接了两个保护二极管,这里是对输入电压进行限幅的,Vdd接3.3V,Vss接0V。
  • 序号2,这里连接了一个上拉电阻和下拉电阻,上拉电阻至Vdd,下拉电阻至Vss,该电路可以通过程序进行配置,当上面导通,下面断开,即为上拉输入模式。与之相反的就是下拉输入模式。如果两个电阻都断开,那么就是浮空输入模式,电压值不确定。在这里的作用就是为了给输入提供一个默认的输入电平。讲过施密特触发器整形的波形可以直接写入输入数据寄存器,在用程序读取输入数据寄存器对于某一位的数据,即可知端口的输入电平了
  • 图中为TTL肖特基触发器,实际为施密特触发器(施密特触发器的作用是对输入电压进行整形的)如果输入电压大于某一阈值,输出则会瞬间升为高电平,如果输入电压小于某一阈值,输出则会瞬间降为低电平。
  • 序号3为模拟输入,这个是连接到ADC上的,因为ADC需要接收模拟量。
  • 序号4为复用功能输入,这个是连接到其他需要读取端口的外设上的,如串口的输入引脚等,这根线接收的是数字量,故在施密特触发器后面。

3、复用输出

(1)复用开漏输出、复用推挽输出:可以理解为GPIO口被用作第二功能时的配置情况(即并非作为通用I/O口使用)。

 

 

 

 

 

 

 

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
好的,我理解了你的问题。这是一个常见的STM32应用实战问题,下面是一个简单的解决方案: 首先,你需要连接一个LED和一个按键到STM32开发板。将LED连接到开发板的一个GPIO引脚,将按键连接到另一个GPIO引脚。 接下来,你需要编写程序来控制LED亮灭。在这个程序中,你需要初始化GPIO引脚,设置LED引脚为输出模式,设置按键引脚为输入模式,然后在一个循环中不断读取按键状态并根据按键状态控制LED亮灭。 以下是一个示例代码: ```c #include "stm32f10x.h" int main(void) { GPIO_InitTypeDef GPIO_InitStructure; // 初始化LED引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // 初始化按键引脚 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); while(1) { if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == RESET) { // 按键按下 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_RESET); } else { // 按键未按下 GPIO_WriteBit(GPIOB, GPIO_Pin_0, Bit_SET); } } } ``` 在这个程序中,我们使用了STM32的库函数来初始化GPIO引脚和读取按键状态。当按键按下时,LED引脚被设置为低电平,LED灯会亮起来。当按键未按下时,LED引脚被设置为高电平,LED灯会熄灭。 希望这个解决方案能帮助到你。如果你有任何问题或需要进一步的帮助,请随时问我。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Xa_L

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值