赞
踩
STM32F103系列的I/O引脚共有8种工作模式,
其中输出模式有四种:推挽输出、开漏输出、复用推挽输出、复用开漏输出;
输出模式下一节讲述;
推挽输出的结构是由两个三极管或者MOS管受到互补信号的控制,两个管子始终保持一个处于截止,另一个处于导通的状态。
推挽输出的最大特点是可以真正能真正的输出高电平和低电平,在两种电平下都具有驱动能力。
可以输出强高低电平
推挽输出的缺点:如果当两个推挽输出结构相连在一起,一个输出高电平,即上面的MOS导通,下面的MOS闭合时;同时另一个输出低电平,即上面的MOS闭合,下面的MOS导通时。电流会从第一个引脚的VCC通过上端MOS再经过第二个引脚的下端MOS直接流向GND。整个通路上电阻很小,会发生短路,进而可能造成端口的损害。
这也就是推挽输出不能实现" 线与"
与推挽输出相对的就是开漏输出,对于开漏输出和推挽输出的区别就是开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。
下面就从内部结构和原理上说明为什么开漏输出输出高电平时没有驱动能力,以及进一步比较与推挽输出的区别。
首先需要介绍一些开漏输出和开集输出。这两种输出的原理和特性基本是类似的,区别在于一个是使用MOS管,其中的"漏"指的就是MOS管的漏极;另一个使用三极管,其中的"集"指的就是MOS三极管的集电极。这两者其实都是和推挽输出相对应的输出模式,由于使用MOS管的情况较多,很多时候就用"开漏输出"这个词代替了开漏输出和开集输出。
介绍就先从开集输出开始,其原理电路下图所示:
左边的电路是开集(OC)输出最基本的电路,当输入为高电平时,NPN三极管导通,Output被拉到GND,输出为低电平;当输入为低电平时,NPN三极管闭合,Output相当于开路(输出高阻)。高电平时输出高阻(高阻、三态以及floating说的都是一个意思),此时对外没有任何的驱动能力。这就是开漏和开集输出最大的特点,如何利用该特点完成各种功能稍后介绍。这个电路虽然完成了开集输出的功能,但是会出现input为高,输出为低;input为低,输出为高的情况。
右边的电路中多使用了一个三极管完成了"反相"。当输入为高电平时,第一个三极管导通,此时第二个三极管的输入端会被拉到GND,于是第二个三极管闭合,输出高阻;当输入为低电平时,第一个三极管闭合,此时第二个三极管的输入端会被上拉电阻拉到高电平,于是第二个三极管导通,输出被拉到GND。这样,这个电路的输入与输出是同相的了。
接下来介绍开漏输出的电路。原理与开集输出基本相同,只是将三极管换成了MOS。
当MOS管闭合时,开漏输出电路输出高电平,且连接着负载时,电流流向是从外部电源,流经上来电阻RPU,流进负载,最后进入GND。
开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平
只能输出强低电平
开漏输出的优势
开漏输出可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。
开漏输出可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行,如果高电平和低电平连在一起,会出现电流倒灌,损坏器件。
GPIO引脚除了作为通用输入/输出引脚使用外,还可以作为片上外设( USART、 I2C、 SPI等)专用引脚,即一个引脚可以有多种用途,但同一时刻一个引脚只能使用复用功能中的一个。
当引脚设置为复用功能时,可选择复用推挽输出模式或复用开漏输出模式,在设置为复用开漏输出模式时,需要外接上拉电阻。
在这里只介绍一些常用的函数,如果以后有其他用到的也会详细介绍
void HAL_GPIO_Init(GPIO_TypeDef *GPIOx, GPIO_InitTypeDef *GPIO_Init);
功能: GPIO初始化
实例:HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_PinState HAL_GPIO_ReadPin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
功能:读取引脚的电平状态、函数返回值为0或1
实例:HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_4);
void HAL_GPIO_WritePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, GPIO_PinState PinState);
功能:引脚写0或1 、 GPIO_PIN_RESET 或 GPIO_PIN_SET
实例:HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4,0);
void HAL_GPIO_TogglePin(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
翻转引脚的电平状态
实例:HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_4); 常用在LED上
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);
功能: 中断回调函数,可以理解为中断函数具体要响应的动作。
实例:HAL_GPIO_EXTI_Callback(GPIO_PIN_4);
基础STM32CubeMx的配置可以参考这篇 STM32 CubeMx教程 – 基础知识及配置使用教程
首先选择芯片
然后配置外部晶振模式
配置debug 由于我使用的是ST-Link 所以设置为 Serial Wire 即使用SWD协议的下载和调试
然后查看相关原理图,可知LED对应的引脚为PA8
然后将PA8引脚设置为输出模式
接下来详细介绍一下GPIO配置界面
1)GPIO output level:只有当引脚设置为“GPIO_Output”时才需要设置
High:GPIO输出初始化为高电平
Low:GPIO输出初始化为低电平
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等不同工作模式
3)GPIO Pull-up/Pul-down
No pull-up/pull-down:无内部上拉或下拉
Pull-up:内部上拉,默认高电平
Pull-down:内部下拉,默认低电平
4)Maximum output speed
Low:低速,对应标准库函数中的“GPIO_Speed_2MHz”
Medium:中速,对应标准库函数中的“GPIO_Speed_10MHz”
High:高速,对应标准库函数中的“GPIO_Speed_50MHz”
5)User Label:用户标签,可以按照需要给引脚命名
配置完GPIO以后,配置时钟树
然后配置代码生成器
最后点击右上角的 GENERATE CODE 生成工程
打开生成的工程
首先介绍一下怎么找到想要用的库函数
先点击左下角的 Function ,然后在里面寻找想要使用的外设;
比如目前使用的是GPIO系列,所以选择stm32fxx_hal_gpio.c ;
点开这个目录,里面就是关于GPIO相关的函数介绍;
然后返回 Project,接下来介绍GPIO配置
点开里面的gpio.c 里面就是之前在STM32CubeMx 里面配置的GPIO基本信息,可以看到在GPIO_Init 里面对于GPIO进行了初始化,对于模式,初始电平等等;
接下来实现 LED每隔500ms的闪烁:
在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端口设置为低电平
写完之后,进行编译烧录
最后查看效果
本文相关程序源代码 STM32 HAL库 GPIO输出(0积分下载)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。