深入浅出之HAL库 您所在的位置:网站首页 gpio模式设置推挽输出 深入浅出之HAL库

深入浅出之HAL库

2023-04-19 19:14| 来源: 网络整理| 查看: 265

在单片机的世界中,作为一个与外部沟通最重要的外设,显然是GPIO。

本文以stm32F1xx系列为重点,带你深入浅出地了解GPIO外设及其HAL库使用。

在stm32中一个完整的GPIO配置步骤应是如下

1.使能时钟

2.设置工作模式

接下来我们一一讲解两个步骤

使能时钟

HAL库中已经给了我们一个非常方便的使能函数,我们只需调用即可

__HAL_RCC_GPIOx_CLK_ENABLE() x为需要使能的IO口组名

设置工作模式

在stm32F1xxx系列中,GPIO口有八大工作模式

输入浮空输入上拉输入下拉模拟输入推挽输出开漏输出开漏式复用推挽式复用输入浮空

通过红色标注的电流流向我们可以知道,流进输入数据寄存器的电平即完全由IO引脚输入的电平所确定,当流入为高电平时,数据寄存器记录为高电平,当流入为低电平时,数据寄存器记录低电平,当没有电流流入时无法确定高低电平,因此也叫浮空状态也称高阻态(不确定电平)。

输入上拉红线为高电平,黑线为IO引脚电平,Vdd开关闭合

在IO引脚无输入电流时,输入数据寄存器读取的值为红线即高电平,因此在初始状态下输入数据寄存记录的值为高电平。称此初始状态为上拉,称该电阻为上拉电阻(上拉电阻被红线遮挡,我们可以看那个锯齿形符号)

在IO引脚有输入电流时若输入电平为高电平,两者经过叠加(实际并不会)输入数据寄存器读取的值还是高电平。若输入电平为低电平,则上拉电阻(锯齿形符号)的下侧为低电平,靠近Vdd那侧为高电平,输入数据寄存器读取的是上拉电阻的下侧(忽略导线电阻的情况下,一根导线电平处处相等)即低电平。

综上在输入上拉模式下,当IO引脚无电流来临时,输入数据寄存值记录的是高电平,当IO引脚有电流来临时,输入数据寄存器的值由IO引脚的高低电平决定

输入下拉蓝线为低电平,黑线为IO引脚电平,Vss开关闭合

了解过输入上拉时,输入下拉就很好理解了。

在IO引脚无电平输入时,输入数据寄存器记录的值为Vss低电平

在IO引脚有电平输入时,若输入电平为高电平,下拉电阻(下面那个锯齿形符号)的上侧为高电平,靠近Vss一侧为电平,输入数据寄存器记录的是下拉的电阻的上侧即高电平,若输入电平为低电平,则输入数据寄存器记录的是低电平

综上可知,在输入上拉的模式下,当IO引脚无电流来临时,输入数据寄存器记录为低电平,当IO引脚有电流来临时,输入数据寄存器记录的值为IO引脚的电平。

模拟输入

模拟输入同输入浮空同理,区别在于输入电流取决于IO引脚还是AD转换器或DA转换器

推挽输出红线为高电平,蓝线为低电平

在推挽输出中,由输出控制器去控制P-MOS或N-MOS的导通与关闭,我们暂且不去深究MOS管如何导通,将其简化为开关。

当Vdd P-MOS管导通时,电路从Vdd流向IO引脚,输出高电平

当Vss N-MOS管导通时,电路从Vss流向IO引脚,输出低电平

当P-MOS N-MOS均不导通时,输出浮空状态

开漏输出红线为高电平,蓝线为低电平

开漏模式下比较特殊,在该模式下它只可以选择性导通 Vss N-MOS管 不能控制P-MOS管

当N-MOS管导通时,电流流向由Vss到IO引脚,输出低电平

当N-MOS管不导通时,电平为浮空状态,此时不能确定高低电平,但当我们接入Vcc(图中红色部分)时,,电流流向由Vcc到IO引脚,输出高电平。

综上,开漏模式下 N-MOS管导通时,输出低电平,当N-MOS管不导通时,输出浮空状态(不确定电平),若外接高电平电源及上拉电阻时,输出高电平。

推挽式复用

推挽式复用与推挽输出原理相似,区别在于输出控制器的控制权交由芯片上的外设,本文不再过多讲解。

开漏式复用

开漏式复用与开漏输出原理相似,区别在于输出控制器的控制权交由芯片上的外设,本文不再过多讲解。

使用HAL库进行GPIO配置

了解了八大工作模式后我们就可以进行GPIO的配置

同样HAL库提供了一个很方便的配置函数

HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init) //GPIOx为引脚组名

其中最主要的参数就是struct GPIO_InitTypeDef这个结构体的配置

在STM32F1xx_HAL_GPIO.H这个文件中我们可以看到这个结构体所包含的成员

typedef struct { uint32_t Pin; /*!< 引脚设置 */ uint32_t Mode; /*!< 工作模式 */ uint32_t Pull; /*!< 上下拉 */ uint32_t Speed; /*!< 输出速度 */ } GPIO_InitTypeDef;

其中具体的成员我也给大家整理了,可以参考进行配置,以下都可以在STM32F1xx_HAL_GPIO.H这个文件中找到

/*Pin引脚号*/ GPIO_PIN_0 引脚0 GPIO_PIN_1 引脚1 : : 修改对应数字即可 : : GPIO_PIN_15 引脚15 GPIO_PIN_All 所有引脚

/*MODE模式*/ GPIO_MODE_INPUT 0x00000000u /*!


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有