打印

关于GD32的GPIO的学习与讨论

[复制链接]
4210|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangbo1985|  楼主 | 2015-6-19 19:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这里我还是根据STM32的关于GPIO的一些知识介绍开始跟大家讨论GD32的GPIO的相关知识的吧。。欢迎大家参与讨论的。
沙发
zhangbo1985|  楼主 | 2015-6-19 19:27 | 只看该作者
GPIO 管脚可以被配置为多种工作模式,其中有 3 种比较常用:高阻输入、推挽输出、开漏输出。

使用特权

评论回复
板凳
zhangbo1985|  楼主 | 2015-6-19 19:28 | 只看该作者
1. 高阻输入(Input)
为防止信息相互干扰,要求凡挂到总线上的寄存器或存储器等,它的输入输出端不仅能呈现 0、1 两个信息状态,而且还应能呈现第三个状态----高阻抗状态,即此时好像它们的输出被开关断开,对总线状态不起作用,此时总线可由其他器件占用。三态缓冲器即可实现上述功能,它除具有输入输出端之外,还有一控制端。

使用特权

评论回复
地板
zhangbo1985|  楼主 | 2015-6-19 19:30 | 只看该作者
输入模式的结构比较简单,就是一个带有施密特触发输入(Schmitt-triggeredinput)的三态缓冲器(U1),并具有很高的输入等效阻抗。施密特触发输入的作用是能将缓慢变化的或者是畸变的输入脉冲信号整形成比较理想的矩形脉冲信号。执行 GPIO 管脚读操作时,在读脉冲(Read Pulse)的作用下会把管脚(Pin)的当前电平状态读到内部总线上(Internal Bus)。在不执行读操作时,外部管脚与内部总线之间是隔离的。

使用特权

评论回复
5
zhangbo1985|  楼主 | 2015-6-19 19:31 | 只看该作者
2. 推挽输出(Output)
推挽输出原理:在功率放大器电路中大量采用推挽放大器电路,这种电路中用两只三极管构成一级放大器电路,两只三极管分别放大输入信号的正半周和负半周,即用一只三极管放大信号的正半周,用另一只三极管放大信号的负半周,两只三极管输出的半周信号在放大器负载上合并后得到一个完整周期的输出信号。

使用特权

评论回复
6
zhangbo1985|  楼主 | 2015-6-19 19:32 | 只看该作者
推挽放大器电路中,一只三极管工作在导通、放大状态时,另一只三极管处于截止状态,当输入信号变化到另一个半周后,原先导通、放大的三极管进入截止,而原先截止的三极管进入导通、放大状态,两只三极管在不断地交替导通放大和截止变化,所以称为推挽放大器。

推挽放大器的在这里介绍的非常清楚了。

使用特权

评论回复
7
zhangbo1985|  楼主 | 2015-6-19 19:33 | 只看该作者
U1 是输出锁存器,执行 GPIO 管脚写操作时,在写脉冲(Write Pulse)的作用下,数据被锁存到 Q 和/Q。T1 和 T2 构成 CMOS反相器,T1 导通或 T2 导通时都表现出较低的阻抗,但 T1 和 T2 不会同时导通或同时关闭,最后形成的是推挽输出。在推挽输出模式下,GPIO 还具有回读功能,实现回读功能的是一个简单的三态门 U2。注意:执行回读功能时,读到的是管脚的输出锁存状态,而不是外部管脚 Pin 的状态。

使用特权

评论回复
8
zhangbo1985|  楼主 | 2015-6-19 19:35 | 只看该作者
3. 开漏输出(OutputOD)
开漏输出和推挽输出相比结构基本相同,但只有下拉晶体管T1 而没有上拉晶体管。同样,T1 实际上也是多组可编程选择的晶体管。开漏输出的实际作用就是一个开关,输出“1”时断开、输出“0”时连接到 GND(有一定内阻)。回读功能:读到的仍是输出锁存器的状态,而不是外部管脚 Pin 的状态。因此开漏输出模式是不能用来输入的。

使用特权

评论回复
9
zhangbo1985|  楼主 | 2015-6-19 19:35 | 只看该作者
开漏输出结构没有内部上拉,因此在实际应用时通常都要外接合适的上拉电阻(通常采用 4.7~10kΩ)。开漏输出能够方便地实现“线与”逻辑功能,即多个开漏的管脚可以直接并在一起(不需要缓冲隔离)使用,并统一外接一个合适的上拉电阻,就自然形成“逻辑与”关系。开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如 3.3V 到 5V 之间),只需外接一个上拉电阻,而不需要额外的转换电路。典型的应用例子就是基于开漏电气连接的 I2C 总线。

使用特权

评论回复
10
zhangbo1985|  楼主 | 2015-6-19 19:37 | 只看该作者
4. 钳位二极管
GPIO 内部具有钳位保护二极管,其作用是防止从外部管脚 Pin 输入的电压过高或者过低。VDD 正常供电是 3.3V,如果从 Pin 输入的信号(假设任何输入信号都有一定的内阻)电压超过 VDD 加上二极管 D1 的导通压降(假定在 0.6V 左右),则二极管D1 导通,会把多于的电流引到 VDD,而真正输入到内部的信号电压不会超过 3.9V。同理,如果从 Pin 输入的信号电压比 GND 还低,则由于二极管 D2 的作用,会把实际输入内部的信号电压钳制在-0.6V 左右。

使用特权

评论回复
11
zhangbo1985|  楼主 | 2015-6-19 19:39 | 只看该作者
如果确实想进一步提高输出电压,一种简单的做法是先在GPIO 管脚上串联一只二极管(如 1N4148),然后再接上拉电阻。向管脚写“1”时,T1 关闭,在 Pin处得到的电压是 3.3+VD1+VD3=4.5V,电压提升效果明显;向管脚写“0”时,T1 导通,在 Pin 处得到的电压是 VD3=0.6V,仍属低电平。

使用特权

评论回复
12
zhangbo1985|  楼主 | 2015-6-19 19:40 | 只看该作者
GPIO  配置
(1)GPIO_Mode_AIN 模拟输入
(2)GPIO_Mode_IN_FLOATING 浮空输入
(3)GPIO_Mode_IPD 下拉输入
(4)GPIO_Mode_IPU 上拉输入
这三种输入电路是用那一种,要根据外围电路来决定。

使用特权

评论回复
13
zhangbo1985|  楼主 | 2015-6-19 19:41 | 只看该作者
所谓高阻,可以简单理解为输出端处于浮空状态(没有电流流动),其电平随外部电平高低而定,即门电路放弃对输出端电路的控制。而上拉就是将不确定的信号通过一个电阻嵌位在高电平,电阻同时起限流作用。下拉同理,只不过上拉是对器件注入电流,下拉是输出电流。至于弱上拉和强上拉,只是上拉电阻的阻值不同,没有什么严格区分。简言之,上拉就是在端口没有输入的情况下,将端口的电平稳定在高电平。

使用特权

评论回复
14
zhangbo1985|  楼主 | 2015-6-19 19:41 | 只看该作者
(5)GPIO_Mode_Out_OD 开漏输出
(6)GPIO_Mode_Out_PP 推挽输出
(7)GPIO_Mode_AF_OD 复用开漏输出
(8)GPIO_Mode_AF_PP 复用推挽输出
GPIO_Speed_10MHz 最高输出速率 10MHz
GPIO_Speed_2MHz 最高输出速率 2MHz
GPIO_Speed_50MHz 最高输出速率 50MHz

使用特权

评论回复
15
zhangbo1985|  楼主 | 2015-6-19 19:42 | 只看该作者
I/O 口的输出模式下,有 3 种输出速度可选(2MHz、10MHz和 50MHz),这个速度是指 I/O 口驱动电路的响应速度而不是输出信号的速度,输出信号的速度与程序有关(芯片内部在 I/O 口 的输出部分安排了多个响应速度不同的输出驱动电路,用户可以根据自己的需要选择合适的驱动电路)。通过选择速度来选择不同的输出驱动模块,达到最佳的噪声 控制和降低功耗的目的。高频的驱动电路,噪声也高,当不需要高的输出频率时,请选用低频驱动电路,这样非常有利于提高系统的 EMI 性能。当然如果要输出较高频率的信号,但却选用了较低频率的驱动模块,很可能会得到失真的输出信号。

使用特权

评论回复
16
zhangbo1985|  楼主 | 2015-6-19 19:44 | 只看该作者
对于串口,假如最大波特率只需115.2k,那么用2M的GPIO的引脚速度就够了,既省电也噪声小。
对于 I2C 接口,假如使用 400k 波特率,若想把余量留大些,那么用 2M 的 GPIO 的引脚速度或许不够,这时可以选用 10M 的 GPIO 引脚速度。
对于 SPI 接口,假如使用 18M 或 9M 波特率,用 10M 的 GPIO的引脚速度显然不够了,需要选用 50M 的 GPIO 的引脚速度。

使用特权

评论回复
17
zhangbo1985|  楼主 | 2015-6-19 19:45 | 只看该作者
在复位期间和刚复位后,复用功能未开启,I/O 端口被配置成浮空输入模式。
所有端口都有外部中断能力。为了使用外部中断线,端口必须配置成输入模式。
GPIO 口的配置具有上锁功能,当配置好 GPIO 口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。

使用特权

评论回复
18
zhangbo1985|  楼主 | 2015-6-19 19:46 | 只看该作者
IO 低功耗:
关于模拟输入&低功耗,根据 STM32 的低功耗 AN(AN2629)及其源文件,在 STOP 模式下,为了得到尽量低的功耗,确实把所有的 IO(包括非 A/D 输入的 GPIO)都设置为模拟输入。

这一点是非常重要的。

使用特权

评论回复
19
蜕变吧| | 2015-6-21 09:06 | 只看该作者
不是GD32么,怎么变成STM32啦?

使用特权

评论回复
20
tongbu2015| | 2015-6-21 21:36 | 只看该作者
开漏输出的另一种用途是能够方便地实现不同逻辑电平之间的转换(如 3.3V 到 5V 之间),只需外接一个上拉电阻,而不需要额外的转换电路

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

29

主题

1886

帖子

2

粉丝