【无标题】

STM32 GPIO相关介绍(简述)

GPIO是通用输入与输出端口的简称,STM32通过引脚(GPIO输入输出)与外部模块的配合使用,可以实现大部分的功能。STM32的引脚被分为16个一组,标号为从0~15。

GPIO的输入模式与输出模式

在这里插入图片描述
上图为官方手册中所给的GPIO硬件结构框图
其中TTL肖特基触发器 应为TTL施密特触发器,这里是一个标注失误

在这里先补充一些信息

上下拉保护电阻Vdd和Vss ,当上拉起作用时,默认电平为高
当下拉起作用时,默认电平为低

i/o引脚内快的上下拉电阻加上二极管,是为了防止引脚输入过低或过高的电压,来保护单片机的,如果高于所规定的最高电压,上方导通,如果低于所规定的最低电压,下方导通。

TTL施密特触发器的作用是,规定两个值,如,0.2 和0.8,当输入的的电平高于设定最大值或者低于设定最小值时,电平才会发生跳变
(这里来举个例子,加入现在电平为0.9,通过施密特触发器,因为0.9大于0.8,所以电平为高电平,现在如果电平变为了0.5,但是因为只有低于设定最小值时,电平才会发生改变,所以现在依然为高电平,当电平变为0.1时,此时低于了0.2,电平才会变为低电平)
所以原本电平不稳的输入,在经过施密特触发器时,只有0和1两种结果

P-MOS管和N-MOS管
上方的P-MOS导通,下方的N-MOS关闭,对外输出高电平
下方的N-MOS导通,上方的P-MOS关闭,对外输出低电平

1,输入

模拟输入
当GPIO引脚用于ADC采集电压的输入通道时,用作“模拟输入功能”,此时不经过施密特触发器,因为需要最原始的电平信号,此外,当模拟输入时,上下拉电阻是不起作用的。
复用功能输入
先需要设置引脚的复用功能
STM32其他片上外设的信号传到STM32上,由单片机读取外设的信息,
例如串口通讯时,STM32接受信号
浮空输入
上下拉电阻为关闭状态,没有默认输入
上拉输入
上拉电阻开启,下拉电阻关闭,默认输入为高电平
下拉输入
下拉电阻关闭,下拉电阻开启,默认输入为低电平

2.输出

推挽输出
两个MOS管均有效,可以输出高电平和低电平
开漏输出
上方的P-MOS无效,只可以输出低电平
复用推挽输出,复用开漏输出
STM32的引脚功能不唯一,有的引脚有复用功能,通过程序配置实现复用
此时走的是复用功能输出

GPIO的配置

这里的GPIO配置采用官方的库函数形式(没有HAL库和单纯寄存器配置)
首先这里我们需要打开GPIO端口的时钟APB2,这里以A来举例
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
然后
GPIO_InitTypeDef GPIO_InitStructure; ●1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;●2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;●3
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;●4
GPIO_Init(GPIOA, &GPIO_InitStructure);●5
这里采用的结构体来初始化GPIO,先定义结构体 ●1,然后引出结构体变量,查找库函数,选择相对的端口模式●2,端口●3,和频率●4,最后将其填入GPIO初始化函数中,完成GPIO的初始化●5

GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);GPIO初始化函数

typedef enum
{ GPIO_Mode_AIN = 0x0,
GPIO_Mode_IN_FLOATING = 0x04,
GPIO_Mode_IPD = 0x28,
GPIO_Mode_IPU = 0x48,
GPIO_Mode_Out_OD = 0x14,
GPIO_Mode_Out_PP = 0x10,
GPIO_Mode_AF_OD = 0x1C,
GPIO_Mode_AF_PP = 0x18
}GPIOMode_TypeDef;
端口模式

typedef enum
{
GPIO_Speed_10MHz = 1,
GPIO_Speed_2MHz,
GPIO_Speed_50MHz
}GPIOSpeed_TypeDef;
端口频率

#define GPIO_Pin_0 ((uint16_t)0x0001)
#define GPIO_Pin_1 ((uint16_t)0x0002)
#define GPIO_Pin_2 ((uint16_t)0x0004)
#define GPIO_Pin_3 ((uint16_t)0x0008)
#define GPIO_Pin_4 ((uint16_t)0x0010)
#define GPIO_Pin_5 ((uint16_t)0x0020)
#define GPIO_Pin_6 ((uint16_t)0x0040)
#define GPIO_Pin_7 ((uint16_t)0x0080)
#define GPIO_Pin_8 ((uint16_t)0x0100)
#define GPIO_Pin_9 ((uint16_t)0x0200)
#define GPIO_Pin_10 ((uint16_t)0x0400)
#define GPIO_Pin_11 ((uint16_t)0x0800)
#define GPIO_Pin_12 ((uint16_t)0x1000)
#define GPIO_Pin_13 ((uint16_t)0x2000)
#define GPIO_Pin_14 ((uint16_t)0x4000)
#define GPIO_Pin_15 ((uint16_t)0x8000)
#define GPIO_Pin_All ((uint16_t)0xFFFF)
端口

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值