发新帖我要提问
12
返回列表
打印
[应用相关]

分享一个关于使用“开漏输出”的惨痛经验教训

[复制链接]
楼主: feilusia
手机看帖
扫描二维码
随时随地手机跟帖
21
feilusia|  楼主 | 2013-12-6 10:45 | 只看该作者 回帖奖励 |倒序浏览
戈卫东 发表于 2013-12-6 10:31
你的理解有误.
读IDR不会影响端口配置,不会影响ODR,不会影响ODR在管脚上的输出. ...

我测试了下,确实不会改变,是我理解错了。
谢谢指出错误,原因我再找找。

使用特权

评论回复
22
feilusia|  楼主 | 2013-12-6 10:52 | 只看该作者
戈卫东 发表于 2013-12-6 10:38
你的中文DATASHEET也有可能误导你.
他说"在推挽模式时,对输出寄存器的读访问得到最后一次写的值". 其实任何 ...

读IDR与ODR是不是只是读输入和输出的缓冲区里的值?那IDR是如何刷新IO口引脚状态呢,此时是输出状态,应该不会刷新输入缓冲区吧。

使用特权

评论回复
23
戈卫东| | 2013-12-6 11:04 | 只看该作者
输入没有寄存器.
读的只是管脚电平. 管脚的变化, 对IDR来说, 随时都可见.

使用特权

评论回复
24
feilusia|  楼主 | 2013-12-6 11:59 | 只看该作者
戈卫东 发表于 2013-12-6 11:04
输入没有寄存器.
读的只是管脚电平. 管脚的变化, 对IDR来说, 随时都可见.

我发的图上不就有个输入寄存器么

使用特权

评论回复
25
戈卫东| | 2013-12-6 13:38 | 只看该作者
单纯作为简单GPIO来看的话,这个寄存器应该不是必须的,但有些IO会用到噪音滤波或边沿检测之类的功能,这个时候可能就需要寄存器.
详情不是很清楚. 这样看来这个寄存器应该是在每个APB时钟进行更新,我们可以看成没有寄存器,读到的就是管脚的电平(只延迟一个时钟).

使用特权

评论回复
26
feilusia|  楼主 | 2013-12-6 16:52 | 只看该作者
戈卫东 发表于 2013-12-6 13:38
单纯作为简单GPIO来看的话,这个寄存器应该不是必须的,但有些IO会用到噪音滤波或边沿检测之类的功能,这个时 ...

在参考文档的输出部分里我看到两句话:
1)施密特触发输入被激活
2)在开漏模式时,对输入数据寄存器的读访问可得到I/O 状态

这是不是意味着输出与输入是同时的呢?

使用特权

评论回复
27
戈卫东| | 2013-12-6 17:20 | 只看该作者
简单一点说吧, 就是输出可以关闭,或用OD模式,而输入总是可读,不管什么配置.

使用特权

评论回复
28
m__dd| | 2013-12-6 19:12 | 只看该作者
本帖最后由 m__dd 于 2013-12-6 19:14 编辑

GPIO的几个好处:
一、共有8种模式,可以通过编程选择:
  1. 浮空输入
  2. 带上拉输入
  3. 带下拉输入
  4. 模拟输入
  5. 开漏输出——(此模式可实现hotpower说的真双向IO)
  6. 推挽输出
  7. 复用功能的推挽输出
  8. 复用功能的开漏输出
模式7和模式8需根据具体的复用功能决定。

二、专门的寄存器(GPIOx_BSRR和GPIOx_BRR)实现对GPIO口的原子操作,即回避了设置或清除I/O端口时的“读-修改-写”操作,使得设置或清除I/O端口的操作不会被中断处理打断而造成误动作。

三、每个GPIO口都可以作为外部中断的输入,便于系统灵活设计。

四、I/O口的输出模式下,有3种输出速度可选(2MHz、10MHz和50MHz),这有利于噪声控制。

五、所有I/O口兼容CMOS和TTL,多数I/O口兼容5V电平。

六、大电流驱动能力:GPIO口在高低电平分别为0.4V和VDD-0.4V时,可以提供或吸收8mA电流;如果把输入输出电平分别放宽到1.3V和VDD-1.3V时,可以提供或吸收20mA电流。

七、具有独立的唤醒I/O口。

八、很多I/O口的复用功能可以重新映射,见:你知道吗?STM32上很多管脚功能可以重新映射。

九、GPIO口的配置具有上锁功能,当配置好GPIO口后,可以通过程序锁住配置组合,直到下次芯片复位才能解锁。此功能非常有利于在程序跑飞的情况下保护系统中其他的设备,不会因为某些I/O口的配置被改变而损坏——如一个输入口变成输出口并输出电流。

十、输出模式下输入寄存器依然有效,在开漏配置模式下实现真正的双向I/O功能。
顺便问个问题:开漏模式,IO内部下拉电阻多大?(输入电阻)

使用特权

评论回复
29
feilusia|  楼主 | 2013-12-7 08:48 | 只看该作者
m__dd 发表于 2013-12-6 19:12
GPIO的几个好处:
一、共有8种模式,可以通过编程选择:
  1. 浮空输入

1)开漏输出并不是真正的双向IO口,而是准双向IO口。推挽输出才是双向IO口。
双向IO口:输入输出口具有三态,即输出高,输出低,和输入高阻态。不需要任何预操作可直接读入读出。
准双向IO口:需要上拉电阻存在,所以是准双向IO口。读入的时候要先向IO上写1,再读。
2)IO口设置为输出时,内部的弱上拉、弱下拉被禁止,这个文档里有写。

使用特权

评论回复
30
自信d面对| | 2013-12-7 09:25 | 只看该作者
经验好贴

使用特权

评论回复
31
ahuzjh| | 2013-12-7 18:32 | 只看该作者
学习了,以免以后出现类似的问题

使用特权

评论回复
32
fxhsz| | 2014-11-3 13:48 | 只看该作者
确实 这样 的 吗

使用特权

评论回复
33
our单片机| | 2014-11-3 22:33 | 只看该作者
我想问一个问题,就是说,除了使用开漏输出模式+上拉电阻的形式,使用推挽输出的时候,例如跟液晶通信,使用的是双向IO口,我能否使用ODR = data,data = IDR,直接实现双向通信呢,还是说需要对管脚属性预处理后才能进行读写?

使用特权

评论回复
34
bear1| | 2014-11-4 10:08 | 只看该作者
十、输出模式下输入寄存器依然有效,在开漏配置模式下实现真正的双向I/O功能。

使用特权

评论回复
35
bear1| | 2014-11-4 10:09 | 只看该作者
feilusia 发表于 2013-12-6 10:45
我测试了下,确实不会改变,是我理解错了。
谢谢指出错误,原因我再找找。 ...

楼主,找到最终正确的原因了吗?

使用特权

评论回复
36
jun000jun| | 2014-11-4 10:12 | 只看该作者
IDR应该是在任意时刻都可以读的,而且读到的都是引脚上的电平吧,其值变化应该是以AHB的时钟为参考。

使用特权

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

本版积分规则