stm32 GPIO分析讲解

什么是GPIO
GPIO(General Purpose Input& Output)是通用目的的输入/输出,是微控制器中最简单也是最常用到的外设,一般来说,由于资源有限,其他的外设往往要与GPIO端口复用芯片的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。STM32 芯片的 GPIO被分成很多组,每组有 16 个引脚。一般来说最多拥有7组,GPIOA、GPIOB、…、GPIOG,7组端口。可以根据每个GPIO的端口的不同可以设置成不同的工作模式。

GPIO框图
通过 GPIO 硬件结构框图,就可以从整体上深入了解 GPIO 外设及它的各种应用模式。该图从最右端看起,最右端就是代表 STM32 芯片引出的 GPIO 引脚,其余部件都位于芯片内部。
在这里插入图片描述
保护二极管:我们可以从名字上可以看出这个是作用于保护的二极管。引脚的两保护个二级管可以防止引脚外部过高或过低的电压输入,当引脚电压高于 VDD_FT 时,上方的二极管导通,当引脚电压低于 VSS 时,下方的二极管导通,防止不正常电压引入芯片导致芯片烧毁。

上下拉电阻:在名字上可以知道就是将输入信号拉高或者拉低的电阻。我们可以控制引脚默认状态的电压,开启上拉的时候引脚电压为高电平,开启下拉的时候引脚电压为低电平。也可以“即不上拉也不下拉”也就是浮空状态。

P-MOS 管和 N-MOS 管:由P-MOS管和N-MOS管组成的单元电路使得GPIO具有推挽输出和开漏输出的模式。GPIO 引脚线路经过两个保护二极管后,向上流向“输入模式”结构,向下流向“输出模式”结构。

1)推挽输出模式:是根据这两个 MOS 管的工作方式来命名的。在该结构中输入高电平时,经过反向后,上方的 P-MOS 导通,下方的 N-MOS 关闭,对外输出高电平;而在该结构中输入低电平时,经过反向后,N-MOS 管导通,P-MOS 关闭,对外输出低电平。当引脚高低电平切换时,两个管子轮流导通,P 管负责灌电流,N 管负责拉电流,使其负载能力和开关速度都比普通的方式有很大的提高。
在这里插入图片描述

2)开漏输出模式:开漏输出模式时上方的 P-MOS 管完全不工作。如果我们控制输出为 0,低电平,则 P-MOS管关闭,N-MOS 管导通,使输出接地,若控制输出为 1 (它无法直接输出高电平) 时,则 P-MOS管和 N-MOS 管都关闭,所以引脚既不输出高电平,也不输出低电平,为高阻态。为正常使用时必须外部接上拉电阻,参考图开漏电路 中等效电路。它具有“线与”特性,也就是说,若有很多个开漏模式引脚连接到一起时,只有当所有引脚都输出高阻态,才由上拉电阻提供高电平,此高电平的电压为外部上拉电阻所接的电源的电压。若其中一个引脚为低电平,那线路就相当于短路接地,使得整条线路都为低电平,0 伏。
在这里插入图片描述

TTL肖特基触发器:信号经过触发器后,模拟信号转化为0和1的数字信号。但是,当GPIO引脚作为ADC采集电压的输入通道时,用其“模拟输入”功能,此时信号不再经过触发器进行TTL电平转换。ADC外设要采集到的原始的模拟信号。

GPIO工作模式
在这里插入图片描述
1)浮空输入模式:浮空输入模式下,I/O端口的电平信号直接进入输入数据寄存器。也就是说,I/O的电平状态是不确定的,完全由外部输入决定。
在这里插入图片描述
2)上拉输入模式:上拉输入模式下,I/O端口的电平信号直接进入输入数据寄存器。但是在I/O端口悬空(在无信号输入)的情况下,输入端的电平可以保持在高电平;并且在I/O端口输入为低电平的时候,输入端的电平也还是低电平。
在这里插入图片描述
3)下拉输入模式:与上拉输入模式原理相同,不过是信号流入下拉电阻。

4)模拟输入模式:模拟输入模式下,I/O端口的模拟信号直接模拟输入到片上外设模块。例如:ADC等
在这里插入图片描述
5)开漏与推挽输出模式:上面大致已讲解其工作模式。
在这里插入图片描述
6)复用开漏输出模式:开漏复用输出模式,与开漏输出模式很是类似。只是输出的高低电平的来源,不是让CPU直接写输出数据寄存器,取而代之利用片上外设模块的复用功能输出来决定的。
在这里插入图片描述
7)复用推挽输出模式:与复用开漏输出模式原理大致相同。

配置:
配置上主要是void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct),来配置其IO模式,IO口,IO口传输速度。其结构体
在这里插入图片描述
GPIO_Pin:选择IO口引脚
GPIO_Speed:选择IO口传输速度
GPIO_Mode:选择IO模式;

例:

GPIO_InitTypeDef GPIO_InitStruct;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_8;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);

值得注意的是我们选择相对应的IO口的时候要打开与之相对应的时钟:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叶同学要努力呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值