本文的作者是milershao 关于STMCU的GPIO的双向使用话题不新鲜了,好像还经常有人在此遇点麻烦。这可能跟总有新人接触STMCU不无关系。
几天前一个研究生MM使用STM32的GPIO模拟I2C通信,读取一时钟芯片的时钟的过程中遇到麻烦。查看其代码,看到其在SDA数据线读写代码时,发现其来回做SDA脚的GPIO模式切换。那样写虽然没有错,但那样写多少有点累或繁琐。 无独有偶,昨天一广州工程师也是用某STM32芯片的GPIO模拟I2C通信。他发现通信程序总是堵塞在代码某地方。后来发现将那2根通信线的GPIO模式由输入改为OD或PP就正常了。程序正是正常了,但有点不知所以然的意味,如鲠在喉。 其实,STMCU的GPIO是支持双向通信的。如果希望某GPIO做双向传输,将其配制为OD输出模式,将相应输出寄存器位写1就可以了,不用在程序代码里往返切换。 至于第二个案例,他用GPIO模拟I2C通信,其SDA应是双向数据口,只是把他定义为输入肯定是不行的,那样的话完全没法做输出了。如果这样,通信自然无法正常。他把SDA口配置为OD才是合理的。 下图是GPIO配置为输入时的情况。 
如果把GPIO配置为PP是否可以做双向口呢,很多人发现有时可行有时不可行。 我们不妨先看看STMCU GPIO配置为输出时的原理框图。 
对于OD配置,结合上拉,输出电平的高低确定。当给端口输出寄存器写1时,端口对外成高阻态。外部电平真实反映在端口上,输入电平不受内部输出控制电路的影响,而且GPIO管脚相对安全。 对于PP配置端口,跟OD配置相比,差别就大了。首先对于PP配置,总有一边管子导通,对外来电平会有些影响。 若给PP配置端口输出寄存器写0,只有下方的N-MOS导通到地,端口不论外部电平如何变化都会锁定在低电平,当外来输入高电平时有管脚烧坏风险。 如果给PP配置端口输出寄存器写1,只让上方P-MOS导通。如果外来电平为高没什么问题,如果外来电平是低,也有可能管脚过流烧掉。当然到底烧不烧还得结合外围电路的配置。整体而言,对于PP配置输出口不合适作输入的读取,所以不建议使用PP做双向口用。关于STMCU的GPIO的双向使用话题不新鲜了,好像还经常有人在此遇点麻烦。这可能跟总有新人接触STMCU不无关系。
几天前一个研究生MM使用STM32的GPIO模拟I2C通信,读取一时钟芯片的时钟的过程中遇到麻烦。查看其代码,看到其在SDA数据线读写代码时,发现其来回做SDA脚的GPIO模式切换。那样写虽然没有错,但那样写多少有点累或繁琐。 无独有偶,昨天一广州工程师也是用某STM32芯片的GPIO模拟I2C通信。他发现通信程序总是堵塞在代码某地方。后来发现将那2根通信线的GPIO模式由输入改为OD或PP就正常了。程序正是正常了,但有点不知所以然的意味,如鲠在喉。 其实,STMCU的GPIO是支持双向通信的。如果希望某GPIO做双向传输,将其配制为OD输出模式,将相应输出寄存器位写1就可以了,不用在程序代码里往返切换。 至于第二个案例,他用GPIO模拟I2C通信,其SDA应是双向数据口,只是把他定义为输入肯定是不行的,那样的话完全没法做输出了。如果这样,通信自然无法正常。他把SDA口配置为OD才是合理的。 下图是GPIO配置为输入时的情况。 
如果把GPIO配置为PP是否可以做双向口呢,很多人发现有时可行有时不可行。 我们不妨先看看STMCU GPIO配置为输出时的原理框图。 
对于OD配置,结合上拉,输出电平的高低确定。当给端口输出寄存器写1时,端口对外成高阻态。外部电平真实反映在端口上,输入电平不受内部输出控制电路的影响,而且GPIO管脚相对安全。 对于PP配置端口,跟OD配置相比,差别就大了。首先对于PP配置,总有一边管子导通,对外来电平会有些影响。 若给PP配置端口输出寄存器写0,只有下方的N-MOS导通到地,端口不论外部电平如何变化都会锁定在低电平,当外来输入高电平时有管脚烧坏风险。 如果给PP配置端口输出寄存器写1,只让上方P-MOS导通。如果外来电平为高没什么问题,如果外来电平是低,也有可能管脚过流烧掉。当然到底烧不烧还得结合外围电路的配置。整体而言,对于PP配置输出口不合适作输入的读取,所以不建议使用PP做双向口用。 |