stm32的gpio的工作模式怎么选择(GPIO模式及工作原理详解)

GPIO简介

GPIO即通用I/o(输入/输出)端口,是STM32可控制引脚,更具其模式配置不同可实现信号通讯以及控制外部设备的功能

在stm32f407中共有7组I/O口,从GPIOA-GPIOG每组有16位端口,分别从PAx-PGx(其中x=0,15)

GPIO复用模式

在f4中有许多的内部资源,其内部资源引脚与GPIO是通用的,即一个普通的I/O口因为其用途模式不同可以呈现多种功能,把GPIO用作其他的模式叫做GPIO复用

GPIO的工作模式

1:GPIO_Mode_IN

此模式为GPIO的输入模式,但更具其内部上拉电阻的方式又分为上拉输入,下拉输入,上下拉输入改变的是在没有操作I/O口时其默认电平

2:GPIO_Mode_OUT

此模式于输入模式差不多,区别在于I/O口的操作方向

3:GPIO_Mode_AF

此模式是F4在工作时常用的模式,通常复用与外部中断,串口,定时器。IIC.SPI等通信接口,实现与外部设备的通信

4:GPIO_Mode_AN

此模式为GPIO的模拟输入,常用于内部ADC的输出输出

GPIO的响应速度

1 :GPIO_Low_Speed

2 :GPIO_Medium_Speed

3 :GPIO_Fast_Speed

4: GPIO_High_Speed

此控制的是GPIO工作时的响应速度

GPIO的相关配置在f4中有相应的结构体管理,其最主要的时GPIO_InitTypeDef 结构体这是控制中最主要结构

GPIO框图剖析

stm32的gpio的工作模式怎么选择(GPIO模式及工作原理详解)(1)

在单片机中其每个I/O口中对应的结构都是如此,分别对应着不同的的模式

保护二极管: IO引脚上下两边两个二极管用于防止引脚外部过高、过低的电压输入,当引脚电压高于VDD_FT时,上方的二极管导通,当引脚电压低于VSS时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁

上拉、下拉电阻:控制引脚默认状态的电压,开启上拉的时候引脚默认电压为高电平,开启下拉的时候引脚默认电压为低电平

TTL施密特触发器:基本原理是当输入电压高于正向阈值电压,输出为高;当输入电压低于负向阈值电压,输出为低;IO口信号经过触发器后,模拟信号转化为0和1的数字信号 也就是高低电平 并且是TTL电平协议 这也是为什么STM32是TTL电平协议的原因

P-mos管和N-MOS管:信号由P-MOS管和N-MOS管,依据两个MOS管的工作方式,使得GPIO具有“推挽输出”和“开漏输出”的模式 P-MOS管高电平导通,低电平关闭,下方的N-MOS低电平导通,高电平关

详细分析

输出配置

对 I/O 端口进行编程作为输出时:

输出缓冲器被打开:

–开漏模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”会使端口保持高组态 (Hi-Z)(P-MOS 始终不激活)。

–推挽模式:输出寄存器中的“0”可激活 N-MOS,而输出寄存器中的“1”可激活P-MOS。

施密特触发器输入被打开

根据 GPIOx_PUPDR 寄存器中的值决定是否打开弱上拉电阻和下拉电阻

输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

对输入数据寄存器的读访问可获取 I/O 状态

对输出数据寄存器的读访问可获取最后的写入在这里插入图片描述

stm32的gpio的工作模式怎么选择(GPIO模式及工作原理详解)(2)

推挽电路(push-pull)就是两个不同极性晶体管间连接的输出电路。推挽电路采用两个参数相同的功率BJT管或MOSFET管,以推挽方式存在于电路中,各负责正负半周的波形放

大任务,电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小效率高。

推挽输出既可以向负载灌电流,也可以从负载抽取电流。

在电路设计中,推挽输出是一种很常用的输出模式。推挽输出有很多优点,比如更低的

损耗,更安全的输出等。推挽”之意,即为当一个管子推出去时,另一个管子拉回来。输入

不同,交替导通。

举个例子当输入信号为高电平的时候,上面的管子导通,下面的管子截止,输出信号为高

电平。

当输入信号为低电平的时候,上面的管子截止,下面的管子导通,输出信号为低电平。

MOS管

N型mos比P型mos管使用的多

N型mos管比P型mos管的开关速度快(工艺的影响 ),所以Pmos开关损耗多,发热严重Nmos比Pmos耐压高

Nmos通过电流能力比较大,因此常用于推挽电路的下管。

输入配置

对 I/O 端口进行编程作为输入时:

输出缓冲器被关闭

施密特触发器输入被打开

根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉和下拉电阻

输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样

对输入数据寄存器的读访问可获取 I/O 状态

stm32的gpio的工作模式怎么选择(GPIO模式及工作原理详解)(3)

模拟配置

对 I/O 端口进行编程作为模拟配置时:输出缓冲器被禁止。施密特触发器输入停用,I/O 引脚的每个模拟输入的功耗变为零。施密特触发器的输出被 强制处理为恒定值 (0)。弱上拉和下拉电阻被关闭。对输入数据寄存器的读访问值为“0”。

stm32的gpio的工作模式怎么选择(GPIO模式及工作原理详解)(4)

注:在模拟配置中引脚不能5V

程序编写步骤

1:阅读硬件原理图《GEC-M4原理图2016-07-29.pdf》,了解当前需要使用

STM32芯片哪个硬件,就可以知道使用哪些库函数接口。

2:使用库函数的时候,只需要了解该函数的使用方法,如传入参数、返回值、

功能描述就足矣。库函数里面的编写内容不需要了解,这些代码都是由ST公司去

实现的。

3:如何使用库函数实现一个具体的功能,ST公司都会提供例子文档,告诉我们

库函数如何使用,如函数前后的调用顺序,详细硬件初始化流程,无论是新手还

是老手都要看。

STM32F4xx中文参考手册.pdf

stm32f4xx_dsp_stdperiph_lib_um.chm

使用的编程标准C,也就是ANSI C编程。

库函数规律,硬件时钟 ,socket硬件配置 ,bind硬件控制 ,sendto、recvfrom

函数接口

1:结构体配置

GPIO_InitTypeDef GPIO_InitStructure;//定义了一个结构体GPIO_initStructre 在后面都就可以用词结构体配置

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//打开硬件端口是能

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;//端口的模式

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//端口响应速度

GPIO_InitStructure.GPIO_OType= GPIO_OType_PP ;//推挽输出

GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//设置上下拉电阻

GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化所设置的引脚

2:GPIO初始化函数

void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

3:GPIO结构体初始化

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 se

lected 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 */

18 GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull‐up/Pull d

own for the selected pins.

This parameter can be a value of @ref GPIOPuPd_TypeDef */

}GPIO_InitTypeDef;

3:GPIO相关函数

//设置高电平

void GPIO_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

//设置低电平

void GPIO_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

//这些函数时对某一位I/O口进行操作

//如果是对某一个端口进行读写

void GPIO_Write(GPIO_TypeDef* GPIOx, uint16_t PortVal);

void GPIO_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, BitAction BitVal);

//读取某个端口电平

uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

//读取端口数据

uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);

如果需要将GPIO配置成TIM,USART,SPI,IIC,ADC等模式时GPIO模式设置详见《STM32中文参考手册》第110页

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页