STM32F4 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框图剖析

在这里插入图片描述在单片机中其每个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 状态
对输出数据寄存器的读访问可获取最后的写入在这里插入图片描述推挽电路(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 状态
在这里插入图片描述

复用功能配置

对 I/O 端口进行编程作为复用功能时:
可将输出缓冲器配置为开漏或推挽
输出缓冲器由来自外设的信号驱动(发送器使能和数据)
施密特触发器输入被打开
根据 GPIOx_PUPDR 寄存器中的值决定是否打开上拉电阻和下拉电阻
输入数据寄存器每隔 1 个 AHB1 时钟周期对 I/O 引脚上的数据进行一次采样
对输入数据寄存器的读访问可获取 I/O 状态

在这里插入图片描述

模拟配置

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

程序编写步骤

  1. 阅读硬件原理图《GEC-M4原理图2016-07-29.pdf》,了解当前需要使用
    STM32芯片哪个硬件,就可以知道使用哪些库函数接口。
  2. 使用库函数的时候,只需要了解该函数的使用方法,如传入参数、返回值、
    功能描述就足矣。库函数里面的编写内容不需要了解,这些代码都是由ST公司去
    实现的。
  3. 如何使用库函数实现一个具体的功能,ST公司都会提供例子文档,告诉我们
    库函数如何使用,如函数前后的调用顺序,详细硬件初始化流程,无论是新手还
    是老手都要看。
    STM32F4xx中文参考手册.pdf
    stm32f4xx_dsp_stdperiph_lib_um.chm
  4. 使用的编程标准C,也就是ANSI C编程。
  5. 库函数规律
    硬件时钟 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初始化函数

/**
2 * @brief Initializes the GPIOx peripheral according to the specified par
ameters in the GPIO_InitStruct.
3 * @param GPIOx: where x can be (A..K) to select the GPIO peripheral for
STM32F405xx/407xx and STM32F415xx/417xx devices
4 * x can be (A..I) to select the GPIO peripheral for STM32F42xxx/43xxx de
vices.
5 * x can be (A, B, C, D and H) to select the GPIO peripheral for STM32F40
1xx devices.
6 * @param GPIO_InitStruct: pointer to a GPIO_InitTypeDef structure that c
ontains
7 * the configuration information for the specified GPIO peripheral.
8 * @retval None
9 */
10 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)

3:GPIO结构体初始化

typedef struct
5 {
6 uint32_t GPIO_Pin; /*!< Specifies the GPIO pins to be configured.
7 This parameter can be any value of @ref GPIO_pins_define */
8
9 GPIOMode_TypeDef GPIO_Mode; /*!< Specifies the operating mode for the se
lected pins.
10 This parameter can be a value of @ref GPIOMode_TypeDef */
11
12 GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected
pins.
13 This parameter can be a value of @ref GPIOSpeed_TypeDef */
14
15 GPIOOType_TypeDef GPIO_OType; /*!< Specifies the operating output type
for the selected pins.
16 This parameter can be a value of @ref GPIOOType_TypeDef */
17
18 GPIOPuPd_TypeDef GPIO_PuPd; /*!< Specifies the operating Pull‐up/Pull d
own for the selected pins.
19 This parameter can be a value of @ref GPIOPuPd_TypeDef */
20 }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页

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值