GPIO口详解、HAL库操作按键

本次博客知识来自于韦东山老师的7天物联网课程。

一、GPIO详解

1、STM32F103C8T6一共有48个引脚。

2、按A、B、C分组,每组16个引脚,编号为0~15,STM32F103C8T6有2组GPIO,每组有16个引脚,即32个GPIO引脚。

3、GPIO工作模式

STM32F103系列的I/O引脚共有8种工作模式,其中输出模式有四种:推挽输出、开漏输出、复用推挽输出、复用开漏输出;输入模式有四种:上拉输入、下拉输入、浮空输入、模拟输入。

  • 推挽输出( Push-Pull, PP)

        推挽结构由两个MOS管按互补对称的方式连接,任意时刻总是其中一个三极管导通,另一个三极管截止。如上图1所示,内部由一个P-MOS管和一个N-MOS管组成,两个MOS管的栅极( Gate, G)接到了左侧“输出控制” ,漏极( Drain, D)接到外部输出, P-MOS管的源极( Source, S)接到VDD( 3.3V),N-MOS管的源极接到Vss( 0V)。

        MOS管作为开关使用,“输出控制”向两个MOS管栅极加一定电压, P-MOS管源极和漏极之间导通,VDD 经过P-MOS管的S->G->D输出, N-MOS管处于高阻态(电阻很大,近似开路),整体对外为高电平;“输出控制”取消向两个MOS管栅极施加电压, P-MOS管源极和栅极截止, P-MOS管处于高阻态, N-MOS管源极和漏极导通,整体对外为低电平。
        MOS管作为开关使用,“输出控制”向两个MOS管栅极加一定电压, P-MOS管源极和漏极之间导通,VDD 经过P-MOS管的S->G->D输出, N-MOS管处于高阻态(电阻很大,近似开路),整体对外为高电平;“输出控制”取消向两个MOS管栅极施加电压, P-MOS管源极和栅极截止, P-MOS管处于高阻态, N-MOS管源极和漏极导通,整体对外为低电平。

  • 开漏输出( Open-Drain, OD)

        开漏模式下,“输出控制”不会控制P-MOS管, “输出控制”只会向N-MOS管栅极加一定电压, 两个MOS管都处于截止状态,两个漏极处于悬空状态,称之为漏极开路。“输出控制”取消栅极的施加电压, PMOS管依旧处于高阻态, N-MOS管导通,整体对外为低电平。    

        开漏输出模式可以等效将上图中灰色框的P-MOS管看作不存在。即该模式下只能输出低电平,若要输出高电平,则需要外接电阻,所接的电阻称为上拉电阻,此时输出电平取决于此时上拉电阻的外部电源电压情况,如上图中红色VCC+电阻的外部电路。

        推挽输出模式可以直接输出高电平,开漏输出模式需要外接上拉电阻才能输出高电平,但开漏输出拥有一些推挽输出不具有的特性:
        ①利用外部电路驱动能力。如上图所示,“输出控制”只需要提供一个很小的栅极驱动电流, VCC经过上拉电阻为外部负载提高驱动电流;
        ②实现电平转换。推挽输出模式由VDD提供,即只能提供3.3V电平。使用开漏输出模式后, VCC可以为5V,从而实现了电平转换的效果。

        ③方便实现“逻辑与”功能。多个开漏的引脚可以直接并在一起使用,统一接一个合适的上拉电阻,就可以实现“逻辑与”关系,即当所有引脚均输出高电平时,输出才为高电平,若任一引脚输出低电平,则输出低电平。在I2C、 SMBUS等总线电路中经常会用到。

        VCC可以接5V/3.3V,提高引脚的驱动能力,以为芯片内部结构电路很细,能够经过的电流是有限的,在外部加上一个很粗的电路接上,就可以驱动很大的电流。如果VCC是5V就可以实现电平转换的功能,因为正常情况下,IO口输出是3.3V。

  • 复用功能推挽/开漏输出( Alternate Function, AF)

        GPIO引脚除了作为通用输入/输出引脚使用外,还可以作为片上外设( USART、 I2C、 SPI等)专用引脚,即一个引脚可以有多种用途,但同一时刻一个引脚只能使用复用功能中的一个。
        当引脚设置为复用功能时,可选择复用推挽输出模式或复用开漏输出模式,在设置为复用开漏输出模式时,需要外接上拉电阻。

  • 上拉输入模式( Input Pull-up)

        如上图所示, VDD经过开关、上拉电阻,连接外部I/O引脚。当开关闭合, 外部I/O无输入信号时,默认输入高电平。该模式的典型应用就是外接按键,当没有按键按下时候, MCU的引脚为确定的高电平,当按键按下时候,引脚电平被拉为低电平。

  • 下拉输入模式( Input Pull-down)

        如上图所示, Vss经过开关、下拉电阻,连接外部I/O引脚。当开关闭合,外部I/O无输入信号时,默认输入低电平。该模式的典型应用同样是外接按键,当没有按键按下时候, MCU的引脚为确定的低电平,当按键按下时候,引脚电平被拉为高电平。

  • 浮空输入模式( Floating Input)

        如上图所示,两个上/下拉电阻开关均断开,既无上拉也无下拉, I/O引脚直接连接TTL肖特基
触发器,此时I/O引脚浮空,读取的电平是不确定的,外部信号是什么电平, MCU引脚就输入什么电平。 MCU复位上电后,默认为浮空输入模式。

  • 模拟输入模式( Analog mode)

        如上图所示,两个上/下拉电阻开关均断开,同时TTL肖特基触发器开关也断开,引脚信号直接连接模拟输入,实现对外部信号的采集。

二、cubeMX设置GPIO

1、先选择一个GPIO,这里选择为PA1为输出。

2、点击左侧的GPIO。

3、点击中间的PA1选项,之后即可设置PA1的详细参数。

4、这里可以设置默认输出电平、输出模式、是否上下拉、时钟的频率高中低。

 5、可以为PA1设置一个别名,这里取为LED。 在代码中体现为:在mian()找到MX_GPIO_Init(),然后右键go to definition,即可找到。

 

 三、cubeMX操作按键

1、按键的硬件分析

 

 机械按键在按下过程中会有抖动,所以会有硬件消抖和软件消抖,硬件消抖为上图中的电容。

2、cubeMX生成工程框架

PA0选择输入模式,因为为硬件上拉,所以不用选择上下拉。默认按键松开时,IO读取为高电平,按键按下时,IO读取为低电平。

PA1设置为输出,控制LED灯。

3、keil些控制逻辑

在main()函数的while循环里,写控制逻辑,设置了延时8ms的软件消抖。按键按下为按键为LED熄灭,松开为LED亮。

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
    {
        HAL_Delay(8);
        if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == GPIO_PIN_RESET)
        {
            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);
        }
        else
        {
            HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);
        }
    }
    }
  /* USER CODE END 3 */
}

版权声明:本文为CSDN博主「2021.09」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39240700/article/details/122933386

生成海报
点赞 0

创世纪

单片机学习,电子制作DIY学习与分享,各种新鲜的,有趣的,好玩的,一起来吧!机器人、无人机、树莓派/Raspberry Pi、arduino、极客、创客等

暂无评论

发表评论

相关推荐

GPIO口详解、HAL库操作按键

本次博客知识来自于韦东山老师的7天物联网课程。 一、GPIO详解 1、STM32F103C8T6一共有48个引脚。 2、按A、B、C分组,每组16个引脚,编号为0~15,STM32F103C8T6

ESP32S2+ES8388移植过程及问题

电路图如下, 有点小瑕疵ES8388_VMID PIN10/19/20电容没有忘加,查资料应该不影响语言输出,可能噪音大,如果能导致不输出请告诉我一下。 ESP32S2管脚映射 这里主