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初始化函数
10 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct)
3:GPIO结构体初始化
typedef struct
5 {
6 uint32_t GPIO_Pin;
8
9 GPIOMode_TypeDef GPIO_Mode;
11
12 GPIOSpeed_TypeDef GPIO_Speed;
14
15 GPIOOType_TypeDef GPIO_OType;
17
18 GPIOPuPd_TypeDef GPIO_PuPd;
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);
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页
|