stm32_GPIO
GPIO功能描述
GPIO端口的每个位可以由软件分别配置成多种输入输出模式
输入模式有:
浮空输入 下拉输入 上拉输入 模拟输入
输出模式有:
开漏输出 推挽输出 复用开漏输出 复用推挽输出
GPIO IO端口寄存器基本结构
简单了解四个输入
GPIO四个输入模式
根据如图输入驱动部分所示,IO引脚来了信号,
1.浮空输入
浮空就是逻辑器件与引脚即不接高电平,也不接低电平。
通俗讲就是浮空就是浮在空中,就相当于此端口在默认情况下什么都不接,呈高阻态,这种设置在数据传输时用的比较多。
浮空最大的特点就是电压的不确定性,它可能是0V,也可能是VCC,还可能是介于两者之间的某个值。
浮空输入一般多用于外部按键、ADC输入用,这样可以减少上下拉电阻对结果的影响。
2.上拉输入
上拉就是把点位拉高,比如拉到Vcc。上拉就是将不确定的信号通过一个电阻嵌位在高电平。
3.下拉输入
就是把电压拉低,拉到GND。下拉就是将不确定的信号通过一个电阻嵌位在低电平。
4.模拟输入
模拟输入是指传统方式的输入,数字输入是输入PCM数字信号,即0、1的二进制数字信号,
通过数模转换,转换成模拟信号,经前级放大进入功率放大器,功率放大器还是模拟的。
简单了解四个输出
GPIO输出模式
推挽输出
核心就是利用了NPN和PNP三极管。(资料手册原理图是N P MOS管)
官方说法:推挽电路是两个参数相同的三极管或 MOSFET,以推挽方式存在于电路中,各负责正负半周的波形放大任务,电路工作时,两只对称的功率开关管每次只有一个导通,有损耗小、效率高的特点。输出既可以向负载灌电流,也可以从负载抽取电流。推拉式输出级既提高电路的负载能力,又提高开关速度。
通俗来说:当一个mos管电流增大时,另一个mos管的电流就减小,当P-MOS管饱和时,同时N-MOS截止,接通并输出Vdd及高电平“1”,反之,当N-MOS管饱和时,同时P-MOS截止,接通并输出Vss及低电平“0”。 (基于上述GPIO结构框架图说明)
反正就是其中一个mos管工作另外一个就截止休息;就像是这两个mos管在相互“推、拉(挽)”,所以就叫推挽。
开漏输出
官方说法:
开漏输出就是不输出电压,控制输出低电平时引脚接地,控制输出高电平时引脚既不输出高电平,也不输出低电平,为高阻态。
外接上拉电阻,则在输出高电平时电压会拉到上拉电阻的电源电压。这种方式适合在连接的外设电压比单片机电压低的时候。
输出端相当于三极管的集电极. 要得到高电平状态需要上拉电阻才行. 适合于做电流型的驱动,其吸收电流的能力相对强(一般20ma以内)。
通俗来说:三极管的输出端外接一个上拉电阻,让其提供高电平,防止三极管出现高阻态1
复用推挽 复用开漏输出
当指定GPIO口配置成复用模式时(AFIO)的功能,只要GPIO口是用的复用功能,输出模式就是这复用推挽和复用开漏
总结
STM32中IO模式选用:
浮空输入GPIO_IN_FLOATING ——浮空输入,可以做KEY识别,RX1
带上拉输入GPIO_IPU——IO内部上拉电阻输入
带下拉输入GPIO_IPD—— IO内部下拉电阻输入
模拟输入GPIO_AIN ——应用ADC模拟输入,或者低功耗下省电
开漏输出GPIO_OUT_OD ——IO输出0接GND,IO输出1,悬空,需要外接上拉电阻,才能实现输出高电平。当输出为1时,IO口的状态由上拉电阻拉高电平,但由于是开漏输出模式,这样IO口也就可以由外部电路改变为低电平或不变。可以读IO输入电平变化,实现C51的IO双向功能。
推挽输出GPIO_OUT_PP ——IO输出0-接GND, IO输出1 -接VCC,读输入值是未知的
复用功能的推挽输出GPIO_AF_PP ——片内外设功能(I2C的SCL,SDA)
复用功能的开漏输出GPIO_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)
STM32中IO使用的5种常用方式,它们的配置方式如下:
作为普通GPIO输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时不要使能该引脚对应的所有复用功能模块。
作为普通GPIO输出:根据需要配置该引脚为推挽输出或开漏输出,同时不要使能该引脚对应的所有复用功能模块。
作为普通模拟输入:配置该引脚为模拟输入模式,同时不要使能该引脚对应的所有复用功能模块。
作为内置外设的输入:根据需要配置该引脚为浮空输入、带弱上拉输入或带弱下拉输入,同时使能该引脚对应的某个复用功能模块。
作为内置外设的输出:根据需要配置该引脚为复用推挽输出或复用开漏输出,同时使能该引脚对应的所有复用功能模块。
GPIO 寄存器
概述:
每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。
GPIOx_CRL寄存器,GPIOx_CRH寄存器:
这个寄存器控制相应的工作模式以及对应输出模式下的输出速度
这里的高位寄存器就是x = 8-15,低位寄存器就是x = 0-7
GPIO结构体的库函数: GPIO引脚,GPIO输出速度,GPIO输出模式都与这两个寄存器有关
GPIO对应的四中输入输出模式,后面写的地址值可以根据数据手册来理解,一般是直接使用!
GPIOx_IDR和GPIOx_ODR 数据输入输出寄存器:
两个寄存只有低16位为数据端口,
当然还有一些其他的寄存器用得不是很多,可以具体查芯片手册去了解。
简单点亮LED灯,实现循环亮灭
之前在51单片机中只需要操作简单的IO口即可或者直接对寄存器进行操作赋值即可!
基于stm32点灯- 相当于0配置GPIO口。
上面讲完GPIO口之后,这里直接上点灯应用
具体操作GPIO口步骤:
1.打开并使能RCC时钟
2.配置GPIO结构体
3.初始化GPIO结构体
4.主函数中实现功能
LED.c文件
#include "led.h"
void LED_Init(void){
GPIO_InitTypeDef led_init;
//打开并使能RCC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
//配置GPIO结构体
led_init.GPIO_Mode = GPIO_Mode_Out_PP;//模式,推挽输出
led_init.GPIO_Pin = GPIO_Pin_13; //引脚, 13号引脚
led_init.GPIO_Speed = GPIO_Speed_10MHz;//输出速度
//初始化GPIO结构体
GPIO_Init( GPIOC, &led_init); //初始化GPIOC结构体
}
``
>LED.h文件
```c
#ifndef LED_H_
#define LED_H_ //预编译,防止重复编译
#include "stm32f10x.h"
void LED_Init(void); //函数声明
#endif
main.c文件
#include "led.h"
#include "stm32f10x.h"
void delay_ms(u32 time)
{
while(time--);
}
int main()
{
LED_Init(); //初始化函数调用一下
GPIO_SetBits(GPIOC, GPIO_Pin_13); //将引脚电平拉高,起手灭灯
while(1)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_13); //拉低,亮灯
delay_ms(50000); //简单延时,观察现象,后面会有专门的系统定时器或者定时器延时程序
GPIO_SetBits(GPIOC, GPIO_Pin_13); //拉高,熄灯
}
}
指的是电路的一种输出状态,既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,和没接一样。 ↩︎