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
程序编写步骤
- 阅读硬件原理图《GEC-M4原理图2016-07-29.pdf》,了解当前需要使用
STM32芯片哪个硬件,就可以知道使用哪些库函数接口。 - 使用库函数的时候,只需要了解该函数的使用方法,如传入参数、返回值、
功能描述就足矣。库函数里面的编写内容不需要了解,这些代码都是由ST公司去
实现的。 - 如何使用库函数实现一个具体的功能,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初始化函数
/**
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页