当前位置:   article > 正文

STM32 HAL库 STM32CubeMx -- GPIO输出(点亮LED灯)_stm32推挽输出电路

stm32推挽输出电路


一、GPIO输出模式详解

STM32F103系列的I/O引脚共有8种工作模式,
其中输出模式有四种:推挽输出、开漏输出、复用推挽输出、复用开漏输出;
输出模式下一节讲述;

推挽输出(Push Pull Output,PP)

推挽输出的结构是由两个三极管或者MOS管受到互补信号的控制,两个管子始终保持一个处于截止,另一个处于导通的状态。

PP

推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力。

可以输出强高低电平

推挽输出的缺点:如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。
这也就是推挽输出不能实现" 线与"

开漏输出(Open Drain Output,OD)

与推挽输出相对的就是开漏输出,对于开漏输出和推挽输出的区别就是开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。
下面就从内部结构和原理上说明为什么开漏输出输出高电平时没有驱动能力,以及进一步比较与推挽输出的区别。

首先需要介绍一些开漏输出和开集输出。这两种输出的原理和特性基本是类似的,区别在于一个是使用MOS管,其中的"漏"指的就是MOS管的漏极;另一个使用三极管,其中的"集"指的就是MOS三极管的集电极。这两者其实都是和推挽输出相对应的输出模式,由于使用MOS管的情况较多,很多时候就用"开漏输出"这个词代替了开漏输出和开集输出。

介绍就先从开集输出开始,其原理电路下图所示:
OC

左边的电路是开集(OC)输出最基本的电路,当输入为高电平时,NPN三极管导通,Output被拉到GND,输出为低电平;当输入为低电平时,NPN三极管闭合,Output相当于开路(输出高阻)。高电平时输出高阻(高阻、三态以及floating说的都是一个意思),此时对外没有任何的驱动能力。这就是开漏和开集输出最大的特点,如何利用该特点完成各种功能稍后介绍。这个电路虽然完成了开集输出的功能,但是会出现input为高,输出为低;input为低,输出为高的情况。

右边的电路中多使用了一个三极管完成了"反相"。当输入为高电平时,第一个三极管导通,此时第二个三极管的输入端会被拉到GND,于是第二个三极管闭合,输出高阻;当输入为低电平时,第一个三极管闭合,此时第二个三极管的输入端会被上拉电阻拉到高电平,于是第二个三极管导通,输出被拉到GND。这样,这个电路的输入与输出是同相的了。

接下来介绍开漏输出的电路。原理与开集输出基本相同,只是将三极管换成了MOS。
OD
当MOS管闭合时,开漏输出电路输出高电平,且连接着负载时,电流流向是从外部电源,流经上来电阻RPU,流进负载,最后进入GND。

开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平

只能输出强低电平

开漏输出的优势
开漏输出可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。

开漏输出可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现电流倒灌,损坏器件。

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

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

二、GPIO 相关函数介绍

在这里只介绍一些常用的函数,如果以后有其他用到的也会详细介绍

void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);

功能: GPIO初始化

实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为01

实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);

  • 1
  • 2
  • 3
  • 4
  • 5
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:引脚写01 、 GPIO_PIN_RESET 或 GPIO_PIN_SET

实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);

  • 1
  • 2
  • 3
  • 4
  • 5
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
翻转引脚的电平状态   

实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4);    常用在LED上

  • 1
  • 2
  • 3
  • 4
  • 5
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能:  中断回调函数,可以理解为中断函数具体要响应的动作。

实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);    

  • 1
  • 2
  • 3
  • 4
  • 5

三、STM32CubeMx 配置

基础STM32CubeMx的配置可以参考这篇 STM32 CubeMx教程 – 基础知识及配置使用教程

首先选择芯片

选择芯片

然后配置外部晶振模式

RCC
配置debug 由于我使用的是ST-Link 所以设置为 Serial Wire 即使用SWD协议的下载和调试

SYS
然后查看相关原理图,可知LED对应的引脚为PA8

原理图
然后将PA8引脚设置为输出模式

设置输出模式
接下来详细介绍一下GPIO配置界面

配置界面

1)GPIO output level:只有当引脚设置为“GPIO_Output”时才需要设置

    High:GPIO输出初始化为高电平

    Low:GPIO输出初始化为低电平
  • 1
  • 2
  • 3

2)GPIO mode

    Output Push Pull:推挽输出,能输出高低电平,且高低电平都有驱动能力,对应标准库函数中的“GPIO_Mode_Out_PP”

    Output Open Drain:开漏输出,只能输出低电平,需要借助外部上拉电阻才能输出高电平,对应标准库函数中的“GPIO_Mode_Out_OD”

    Analog mode:模拟输入,ADC采样信号输入引脚的配置模式,对应标准库函数中的“GPIO_Mode_AIN”

    Alternate Function Push Pull:推挽式复用功能,对应标准库函数中的“GPIO_Mode_AF_PP”

    Input mode:输入模式,配合No pull-up/pull-down可形成GPIO_Mpde_IN_FLOATING、GPIO_Mode_IPD、GPIO_Mode_IPU等不同工作模式
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3)GPIO Pull-up/Pul-down

    No pull-up/pull-down:无内部上拉或下拉

    Pull-up:内部上拉,默认高电平

    Pull-down:内部下拉,默认低电平
  • 1
  • 2
  • 3
  • 4
  • 5

4)Maximum output speed

    Low:低速,对应标准库函数中的“GPIO_Speed_2MHz”

    Medium:中速,对应标准库函数中的“GPIO_Speed_10MHz”

    High:高速,对应标准库函数中的“GPIO_Speed_50MHz”
  • 1
  • 2
  • 3
  • 4
  • 5

5)User Label:用户标签,可以按照需要给引脚命名

配置完GPIO以后,配置时钟树

时钟树

然后配置代码生成器

Project

Code Generator
最后点击右上角的 GENERATE CODE 生成工程


四、代码分析

打开生成的工程

首先介绍一下怎么找到想要用的库函数

库函数
先点击左下角的 Function ,然后在里面寻找想要使用的外设;
比如目前使用的是GPIO系列,所以选择stm32fxx_hal_gpio.c ;
点开这个目录,里面就是关于GPIO相关的函数介绍;

然后返回 Project,接下来介绍GPIO配置

Project
点开里面的gpio.c 里面就是之前在STM32CubeMx 里面配置的GPIO基本信息,可以看到在GPIO_Init 里面对于GPIO进行了初始化,对于模式,初始电平等等;

接下来实现 LED每隔500ms的闪烁:

main
在main 函数里面,找到while(1),在/* USER CODE BEGIN 3 / 和 / USER CODE END 3 */ 之间写入自己的代码;
这里的代码是:

		HAL_Delay(500); // 延时500ms
		HAL_GPIO_WritePin(L1_GPIO_Port,L1_Pin,GPIO_PIN_SET);  //将L1端口设置为高电平
		HAL_Delay(500); //延时500ms
		HAL_GPIO_WritePin(L1_GPIO_Port,L1_Pin,GPIO_PIN_RESET);  //将L1端口设置为低电平
  • 1
  • 2
  • 3
  • 4

写完之后,进行编译烧录

编译 烧录

最后查看效果

1
2


附录

本文相关程序源代码 STM32 HAL库 GPIO输出(0积分下载)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/126101?site
推荐阅读
相关标签
  

闽ICP备14008679号