STM32基础篇——GPIO

1. GPIO简介

利用固件库建立好的工程模板,就可以方便地使用STM32 标准库编写应用程序了,可以说从这一章我们才开始迈入STM32 开发的大门,本章节学习控制IO口电平高低实现LED灯闪烁的效果。

标准库已停止更新,现在基本使用HAL库

GPIO是英文General Purpose Input/Output的缩写,中文翻译为通用输入/输出。它是一种在数字电子系统中常见的接口类型,用于与外部设备进行通信和控制。

GPIO接口可以配置成输出模式来控制外部设备,也可以配置成输入模式来读取外部信号,是STM32的一种外设,连接芯片外部的引脚,其引脚可以供使用者自由的进行控制。将STM32芯片的GPIO引脚与外部设备连接起来,也可以实现与外部通讯、控制以及数据采集的功能。GPIO最简单的功能是输出高低电平;GPIO还可以被设置为输入功能,用于读取按键等输入信号;也可以将GPIO复用成芯片上的其他外设的控制引脚。

通过使用GPIO接口,可以方便地与各种外部设备进行交互,如传感器、执行器、显示器、键盘等。在嵌入式系统、单8片机和物联网应用中,GPIO是一种非常常见和重要的接口类型。

2. GPIO输出-LED

STM32F407ZGT6有8组IO。分别为GPIOA~GPIOH,除了GPIOH只有两个IO,其余每组IO有16根引脚。

2.1  硬件原理

查看开发板原理图,找到LED灯原理图和对应的控制引脚

通过原理图我们可知:

LED0和LED1 的阴极都是连接到STM32 的GPIO 引脚,只要我们控制GPIO 引脚的电平输出状态,即可控制LED 灯的亮灭。

LED0 ——PF9引脚

LED1——PF10引脚

2.2  代码编程

编写代码实现GPIO控制

//main.c 
#include "stm32f4xx.h" 
void Delay(uint32_t nCount) 
{ 
    for(;nCount!=0;nCount--); 
} 

int main(void) 
{ 
    GPIO_InitTypeDef GPIO_InitStructure; 
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); 
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; 
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; 
    GPIO_Init(GPIOF, &GPIO_InitStructure); 
    while (1) 
    { 
        GPIO_ResetBits(GPIOF,GPIO_Pin_9); 
        GPIO_SetBits(GPIOF,GPIO_Pin_10); 
        Delay(0xFFFFFF); 
        GPIO_SetBits(GPIOF,GPIO_Pin_9); 
        GPIO_ResetBits(GPIOF,GPIO_Pin_10); 
        Delay(0xFFFFFF); 
    } 
}

这种把所有代码都写在main.c文件里肯定是不可取的。

1. 进入我们工程的目录,在工程根目录文件夹下面新建一个 HARDWARE的文件夹,用来存储以后与硬件相关的代码。然后在 HARDWARE文件夹下新建一个 LED文件夹,用来存放与 LED相关的代码。

2. 打开我们的工程文件,在LED文件夹内新建led.c和led.h文件(KEIL5里建立或者经典方式建立),然后在 Manage Project Itmes管理里面新建一个 HARDWARE的组,并把 led.c加入到这个组里面

3. 在main.c写逻辑代码,led.c写初始化和功能函数,led.h写函数声明,以便被更好地调用。

2.3  程序下载

STM32F4的程序下载有多种方法:USB、串口、JTAG、SWD等,这几种方式都可以用来给STM32F4下载代码。

方式一:J-LINK下载

将J-LINK连接开发板与电脑,注意接口不要接错了。

下载成功

方式二:串口下载

安装CH340驱动,用以识别串口,不然window显示不了下载端口。

不同电脑端口号是不一样,你的可能是COM4、COM5等,但是USB-SERIAL CH340,这个一定是一样的。如果没找到USB串口,则有可能是你安装有误,或者系统不兼容。

打开串口下载工具:

这种方式下载速度很慢,而且不支持仿真调试,一般情况下还是建议用J-LINK

3. GPIO详解

STM32F407有7组IO。分别为GPIOA~GPIOG,每组IO有16个IO口,共有112个IO口  通常称为 PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15

3.1  GPIO工作模式

4种输入模式

(1)GPIO_Mode_IN_FLOATING 浮空输入

(2)GPIO_Mode_IPU 上拉输入

(3)GPIO_Mode_IPD 下拉输入

(4)GPIO_Mode_AIN 模拟输入

模拟输入被使用的原因:

有许多时候需要表示或控制连续变化的量,如:温度,流量,位移等,这个时候光用0/1的开关量是无法表示实际情况的,必须要有能够表示连续值得模块,这就要用模拟量输入模块,如果要控制某个连续变化的量,如变频器的频率,电动比例阀门的开度,这时就要用模拟量输出模块来控制。

4种输入模式的区别:

模拟输入:

首先GPIO输出部分(N-MOS,P-MOS)是不起作用的。并且TTL施密特触发器也是不工作的

上下拉电阻的开关都是关闭的。相当于I/O直接接在模拟输入。

模拟输入模式下,I/O端口的模拟信号(电压信号,而非电平信号)直接模拟输入到片上外设模块,比如ADC模块等。模拟信号一般:3.3v 5v 9v。

浮空输入: 

首先GPIO输出部分(N-MOS,P-MOS)是不起作用的。上下拉电阻的开关都是关闭的。I/O值直接保存在输入数据寄存器里。浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定;如果在该引脚悬空(在无信号输入)的情况下,读取该端口的电平是不确定的。

上拉输入和下拉输入:

上拉就是拉高电平,下拉就是拉低电平。端口的电平信号直接进入输入数据寄存器(32本质就是操作寄存器,记住记死了!!!)

4种输出模式

(5)GPIO_Mode_Out_OD 开漏输出(带上拉或者下拉)

(6)GPIO_Mode_AF_OD 复用开漏输出(带上拉或者下拉)

(7)GPIO_Mode_Out_PP 推挽输出(带上拉或者下拉)

(8)GPIO_Mode_AF_PP 复用推挽输出(带上拉或者下拉)

4种输出模式区别

 普通推挽输出(GPIO_Mode_Out_PP):

使用场合:一般用在0V和3.3V的场合。线路经过两个P_MOS 和N_MOS 管,负责上拉和下拉电流。

使用方法:直接使用

输出电平:推挽输出的低电平是0V,高电平是3.3V。

普通开漏输出(GPIO_Mode_Out_OD): 

使用场合:一般用在电平不匹配的场合,如需要输出5V的高电平。

使用方法:就需要再外部接一个上拉电阻,电源为5V(开漏模式高电平靠自己输出不了,需要外接上拉电阻,如果是小白无法理解很正常,到后面学习到各种通信协议就明白为什么要发明这样的设置了),把GPIO设置为开漏模式, 当输出高组态时,由上拉电阻和电源向外输出5V的电压。

输出电平:在开漏输出模式时,如果输出为0,低电平,则使N_MOS 导通,使输 出接地。若控制输出为1(无法直接输出高电平),则既不输出高电平 也不输出低电平,为高组态。为正常使用,必须在外部接一个上拉电阻。

特性: 它具“线与”特性,即很多个开漏模式 引脚连接到一起时,只有当所有 引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部 上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当 于短路接地,使得整条线路都为低电平,0 v。

复用推挽输出(GPIO_Mode_AF_PP):用作串口的输出。

复用开漏输出(GPIO_Mode_AF_OD):用在IIC。

所有的开漏输出都需要接上拉电阻。

4种最大输出速度

(1)2MHZ  (低速)

(2)25MHZ  (中速)

(3)50MHZ  (快速)

(4)100MHZ  (高速)

3.2 GPIO电路图

3.2.1  保护二极管

引脚上的这两个保护二极管可以将引脚外部过高或过低的电压进行钳位,当引脚电压高于VDD_FT 时,上方的二极管导通吸收这个高电压,当引脚电压低于VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁,也叫钳位二极管。

3.2.2  P-MOS 管和 N-MOS 管

由P-MOS管和N-MOS管组成的单元电路使得GPIO具有“推挽输出”和“开漏输出”的模式,当为输出模式时,线路经过输出控制缓冲器到一个由P-MOS 和N-MOS管组成的双MOS电路,因此GPIO 引脚可以配置成推挽和开漏两种输出模式。

在该结构单元输入一个高电平时,P-MOS 管导通,N-MOS 管截止,对外输出高电平(3.3V)。在该单元输入一个低电平时,P-MOS 管截止,N-MOS 管导通,对外输出低电平(0V)。

3.2.3  TTL 肖特基触发器

信号经过触发器后,将模拟信号转化为 0 和 1 的数字信号。但是,当 GPIO 引脚作为 ADC 采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。

3.3  GPIO工作模式详解(我在一篇文章提两次)

3.3.1  模拟输入

此模式可以检测外部输入的模拟电压,可以检测电压值,只要不高于Vcc即可。

模拟输入模式下,不需要连接上拉和下拉电阻,因为GPIO用于模拟功能时,引脚的上、下拉电阻是不起作用的。这个时候即使在配置了上拉或下拉电阻,也不会影响到模拟信号的输入。

输入信号不再经过TTL施密特触发器,可将外部电压信号直接输入到内部的ADC 外设中去。因为经过施密特触发器后信号只有0、1两种状态,所以ADC外设要采集到原始的、连续变化的模拟信号,信号源输入必须在施密特触发器之前。

3.3.2  浮空输入

输入浮空模式下,指的是该IO口既不配置接上拉电阻也不配置接下拉电阻。如果该引脚悬空的情况无信号输入时,该端口的电平是不确定的。当有电平信号进入IO时,IO电平状态是完全由外部输入决定,MCU复位上电后,默认为浮空输入模式。

3.3.3  上拉输入

上拉输入模式下,GPIO端口悬空无输入信号时,输入端的电平可以默认保持在高电平;而当输入信号低电平时,IO口读取的电平就是低电平;当输入信号高电平时,IO口读取的电平自然就是高电平。

3.3.4  下拉输入

输入下拉模式下,GPIO端口悬空无输入信号时,输入端的电平可以默认保持在低电平;而当输入信号高电平时,IO口读取的电平就是高电平;当输入信号低电平时,IO口读取的电平自然就是低电平。

3.3.5  推挽输出

推挽输出模式就是,对输出数据寄存器进行置0或置1操作,然后通过输出控制缓冲器对双MOS电路进行控制。IO电平输出的双MOS电路通路同时由PMOS和NMOS组成。

当输出控制端输出为1时,上方PMOS导通,下方NMOS截止,电流方向为VDD->PMOS->输出端,对外部引脚输出高电平;

当输出控制端输出为0时,上方PMOS截止,下方NMOS导通, 电流方向为VSS->NMOS->输出端,对外输出低电平;

简单来说就是pmos和nmos, 同一时间只有一个mos管导通, 可输出高电平或低电平, 输出寄存器决定输出什么就是什么。

3.3.6  开漏输出

开漏输出最主要的特性就是高电平没有驱动能力,需要借助外部上拉电阻才能真正输出高电平,这一特性一个明显的优势就是可以很方便的调节输出的电平,因为输出电平完全由上拉电阻连接的电源电平决定。所以在需要进行电平转换的地方,非常适合使用开漏输出。

开漏输出的另一特性好处在于可以实现"线与"功能,所谓的"线与"指的是多个信号线直接连接在一起,只有当所有信号全部为高电平时,合在一起的总线为高电平;只要有任意一个或者多个信号为低电平,则总线为低电平。而推挽输出就不行

开漏输出常用在通信接口,有多个设备连接在同一线上(例如 I2C、One-Wire)。线路默认被上拉电阻拉至高电平,当任意设备有信号触发时,就会将整条线电平拉低。

开漏输出和推挽输出的区别最普遍的说法就是开漏输出无法真正输出高电平,即高电平时没有驱动能力,需要借助外部上拉电阻完成对外驱动。

两者对比:

3.3.7  复用推挽输出

GPIO不仅仅可以用作普通的 IO 口输出,还可以作为芯片上其他外设的特殊功能引脚,有些引脚可能可以用作多种不同功能,这种就叫做GPIO的复用,具体用作哪种功能,需要根据使用进行相应的配置。

使用GPIO复用功能时,当配置成推挽输出,这样片上外设就可以输出高电平或者低电平,例如将GPIO配置成串口USART输出TXD管脚。

需要注意的是,如果需要实现DAC模拟输出,那么也需要将管脚配置成复用功能,但是此时作为“模拟输出”功能,DAC的模拟信号输出就不经过双MOS管结构了

3.3.8  复用开漏输出

与开漏输出模式的不同在于是片上外设决定输出(片上外设位置看图)

为什么是片上外设决定输出呢?

因为这个是复用开漏输出,重点在于复用,复用就是使引脚多出了一些引脚可以所支持外设的功能。

关于在STM32中选用IO模式:

上拉输入、下拉输入可以用来检测外部信号;例如,按键等;

模拟输入 ——应用ADC模拟输入,或者低功耗下省电

开漏输出一般应用在I2C、SMBUS通讯等需要"线与"功能的总线电路中。

推挽输出模式一般应用在输出电平为0和3.3伏而且需要高速切换开关状态的场合。在STM32的应用中,除了必须用开漏模式的场合,我们都习惯使用推挽输出模式。

复用功能的推挽输出_AF_PP ——片内外设功能(IIC的SCL,SDA)

复用功能的开漏输出_AF_OD——片内外设功能(TX1,MOSI,MISO.SCK.SS)

4. 操作GPIO库函数

实验总结如下:

(1) 使能 IO口时钟。调用函数为 RCC_AHB1PeriphClockCmd ();

(2) 初始化 IO参数。调用函数 GPIO_Init();

(3) 操作 IO,点亮LED;

函数 RCC_AHB1PeriphClockCmd ()为开启挂在其上的外设时钟,因为STM32 外设很多,为了降低功耗,每个外设都对应着一个时钟,在芯片刚上电的时候这些时钟都是被关闭的,如果想要外设工作,必须把相应的时钟打开。

所有的GPIO 都挂载到AHB1 总线上,有关STM32的时钟系统我们在往后的RCC 章节会详细的讲解,此处我们只需知道在访问GPIO 这个外设的寄存器之前,要先开启它的时钟,可以通俗理解为,要用这个端口,第一步要先通上电。

GPIO寄存器可查阅手册《STM32F4xx参考手册》7.4章节,不在这里说明,下面介绍操作这些寄存器的库函数:

在库函数种,操作配置寄存器初始化 GPIO是通过 GPIO初始化函数完成:

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

第一个参数是用来指定需要初始化的 GPIO对应的 GPIO组 ,取值范围为 GPIOA~GPIOK。

第二个参数为初始化参数结构体指针,结构体类型为 GPIO_InitTypeDef。

typedef struct 
{ 
    uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured. This parameter can be 
                         any value of @ref GPIO_pins_define */ 
    GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the selected pins. 
                                This parameter can be a value of @ref GPIOMode_TypeDef */     
    GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins. This 
                                  parameter can be a value of @ref GPIOSpeed_TypeDef */ 
    GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type for the selected 
                                  pins. This parameter can be a value of @ref 
                                  GPIOOType_TypeDef  */ 
    GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull-up/Pull down for the         
                                 selected pins. This parameter can be a value of @ref 
                                 GPIOPuPd_TypeDef */ 
}GPIO_InitTypeDef;

第一个成员变量 GPIO_Pin用来设置是要初始化哪个或者哪些 IO口

第二个成员变量 GPIO_Mode是用来设置对应 IO端口的输出输入端口模式

第三个参数GPIO_Speed是 IO口输出速度设置

第四个参数GPIO_OType是 GPIO的输出类型设置

第五个参数 GPIO_PuPd用来设置 IO口的上下拉

每个参数设置成什么值,根据具体情况用户自己设定即可。

5. 引脚复用

IO引脚是有限的,但是外设模块是无限的,IO引脚肯定是不够用的,为了解决引脚不够用的问题,引出了引脚复用的概念。

STM32F4系列微控制器 IO 引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能, AF 连接到对应的 IO 口。这样可以确保共用同一个 IO 引脚的外设之间不会发生冲突。

具体怎么使用,后面文章再说。

6. 电气知识

什么是二极管?

二极管是PN结合的构造。P形半导体端的端子叫阳极,N形半导体端的端子叫做阴极。

电流只能从阳极流到阴极,从阴极到阳极几乎没有电流流过。二极管最普遍的功能就是只允许电流由单一方向通过(正向导通),反向时阻断 (方向截止)。

A段+B段–正向特性:

该段表示外加正向电压时二极管的工作情况,正向特性的起始部分,正向电压很小,外电场不足以客服内电场对多数载流子的阻碍作用,正向电流几乎为零,这一区域成为正向二极管的伏安特性的死区,对应的电压成为死区电压(也称为门坎电压),硅管的死区电压为0.5V,锗管的死区电压为0.1V;

当正向电压超过某一数值后,内电场就被削弱,正向电流迅速增大,二极管导通,这一区域成为正向导通区。二极一旦导通后,只要正向电压有微小变化,就会使正向电流变化较大。二极管正向导通后,管子上的正向压降不大,正向压降的变化很小,一般硅管的为0.7V,锗管的死区电压为0.3V;,在使用二极管时,如果外加电压较大,一般需要串联限流电阻,以免产生过大电流烧坏二极管。

C段–反向特性:

这段表示外加反向电压时二极管的工作情况,在一定的反向电压范围时,反向电流很小且变化不大,这一区域称为反向截止区,这是因为反向电流是少数载流子的偏移运动形成的,一定的温度下,少子的数目基本不变,所以反向电流基本恒定,与反向电压的大小无关,故通常成为反向饱和电流。

D段–反向击穿特性

当反向电压继续增大到某一数值时,二极管的反向电流会突然增大,我们称此时二极管发生了反向击穿,所以 普通二极管的应该避免被击穿。

LED

发光二极管(名称取至 "Light Emitting Diode"的首字母,简称LED)是一种能将电能转化为光能的半导体电子元件,发光二极管已被广泛地应用于室内外LED照明、LED显示屏、交通信号灯、汽车用灯、LCD显示屏的背光源、灯饰、光纤通信等等。

LED与普通二极管一样是由一个PN结组成,也具有单向导电性,只是LED可以发光!其发光原理可描述为:

P区和N区的电子空穴结合的过程中产生大量的能量,而这些能量以光的形式释放出来,这就是其发光的奥秘。与先将电能转换为热能,再转换为光能的以往光源相比(如:早期爱迪生发明的白炽灯),因为LED能够直接将电能转换为光能,所以能够不浪费光能,高效率地获得光。

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值