你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】STM32 USBD VBUS GPIO

[复制链接]
zero99 发布时间:2017-6-29 17:02
STM32 USBD VBUS PA9 as GPIO

: I, E+ V4 G; s) \7 b7 C前言& Z3 j1 \2 J# h( c+ d
某客户准备用STM32F205VCT6做USB FS Device设备时,配置PA9作为普通通用的GPIO口(外部上拉电阻10K到电压3.3V,NO PU/PD),在项目测试的时候发现,该引脚上的电压只有2V。
( a" p7 O6 x# ^7 H0 `; Z/ p" I( [) k
一、现象的复现9 Y7 e5 Q9 Y2 T* L# w; w5 H
硬件:Nucleo-F207ZG board,利用CubeMx生成代码出现同样的问题:  d8 U8 T4 l7 W  T+ H
21.png
8 i0 A# W7 Q3 ]* ]对于硬件,客户的示意图如下:
2 b% |, C9 O7 h, N- K- }
22.png
' G) R+ P) s. d! U. S9 D- `, z
23.png
. D$ K6 O, Z7 ^; v7 T所以参考该nucleo的原理图,修改,移除掉R35电阻,自己添加一个色环电阻至3.3V ;8 g% C3 y$ O1 E3 o7 Z
0 R. g4 l/ G# |! x' y
1.1 PA9为通用输出GPIO,未使用USB FS模块
" j% _; X8 w9 R5 x$ N) U# F/ G( N1 [  \配置 PA9为通用GPIO输出引脚Open Drain模式,没有其他的MCU外设IP被使用,PA9被 10Kohm的色环上拉电阻拉到Vdd电压3V3,利用示波器测试,PA9为3V3输出;
. }$ F; M: z1 P$ P' Q5 h
24.png : W" P; C, q% D, G" {
8 p. Z( \  L* |9 e/ S
1.2 PA9为输出GPIO,开漏模式,使用USB FS模块
3 M6 N0 p/ {" w  |+ I使用该MCU的USB FS 设备IP,并且配置PA9为输出,Open Drain mode模式,PA9被 10Kohm的色环上拉电阻拉到Vdd电压3V3。+ d( j( L" P" W( U, P. P" K* F
测试发现,如果配置:, s! g3 L8 S# c1 n& C/ ~
如果OTG_FS_GCCFG(offset_0x038) = 0xXX2DXXXX,那么PA9 只有2V 输出;
0 B9 I8 d! ~3 {6 k) L; O8 {2 A如果OTG_FS_GCCFG(offset_0x038) = 0xXX25XXXX,那么PA9 会有 3V3 输出;! R! p& N8 Z% B  ~8 M
客户的问题被发现。" i# R+ j" C0 k% C1 U) [/ S
25.png # U) Y% l( x: Y3 P0 l% Y7 A5 o, K9 f

; q& Q% N/ ?+ k) A  l1.3 PA9为输出GPIO,推挽模式,使用USB FS模块
) t5 S8 O# ^: L+ R( o使用该MCU的USB FS 设备IP,并且配置PA9为输出,push-pull推挽模式,PA9被 10Kohm的色环上拉电阻拉到Vdd电压3V3。 测试发现:只需要设置NOVBUSSENS setting(bit21)为1,那么PA9 就会被输出为 3V3,而不论OTG_FS_GCCFG(offset_0x038)寄存器的内容是0xXX25XXXX还是 0xXX2DXXXX;/ l6 a# C% @$ N$ m' o8 E) N2 x  _$ ?2 [  l

) t3 A! F7 J4 p, d1.4 PA9为输入GPIO,NO PU/PD,未使用USB FS模块
' S. @/ K! R! D8 Q2 F+ [配置MCU的PA9为通用的GPIO引脚,输入模式,no PU/PD,没有使用MCU的其他外设IP,PA9被 10Kohm的色环上拉电阻拉到Vdd电压3V3。 测试发现PA9为3V3输入。$ u# B- }% b1 U

+ F- D4 |( T3 f" A2 y( C* x; P. B0 X1. 5 PA9为输入GPIO,NO PU/PD,使用USB FS模块* F: @3 l* ]% D1 n- U: I8 _
配置MCU的PA9为通用的GPIO引脚,输入模式,no PU/PD,使用了MCU的USBD FS外设IP,PA9被 10Kohm的色环上拉电阻拉到Vdd电压3V3。 测试发现:
% F- b+ e% `, _. Z7 k如果OTG_FS_GCCFG(offset_0x038) = 0xXX2DXXXX,PA9 输入为2V;
* C3 Q9 G8 \! y6 {0 @" e如果OTG_FS_GCCFG(offset_0x038) = 0xXX25XXXX,PA9输入为3V3;
9 I# r6 c# l2 h! o客户的现象也被发现了。
0 S5 T" k7 K/ w! z% v4 g
3 i* N! W0 L4 M, o二、解决及总结8 l8 W' D8 Z+ i+ r! \8 S
在使用USB模块的情况下,正常的话PA9是作为OTG_FS_VBUS功能使用的,但是也可以作为通用的GPIO口。5 \6 V, I# m: q, f! K8 s$ C
如果配置成为通用的GPIO,在该芯片参考手册中,我们发现:
1 n& j0 T+ Y1 \3 Y1 F" [% ]  a+ A
26.png
7 V+ b' q& ?& l5 e( _
$ R2 F, \, d, W) m在以往的印象中,我们一直认为PA9用以监测VBUS的供电,在取消该监控时(NOVBUSSENS),PA9可用作普通I/O口,此时,VBUS默认永远存在。, t: I3 ^7 q# L8 J) h. M) o
通过具体的上述的操作,可以知道,如果想让USBD模块下的PA9作为GPIO口使用,那么需要满足下面两个条件:
' f/ G9 c, k+ `: Q1/由于使用到了PA9作为通用的GPIO口,我们需要关闭VBUS sensing(bit 21)功能.
3 _3 X/ B9 |3 p. h2/Bit 19 VBUSBSEN and Bit 18 VBUSASEN 这两个比特位也需要被复位。% v8 I# }4 \# S
客户按照上述重新配置后,问题不再出现。( O5 f2 V. L0 o; |2 X

9 \/ h1 |- B  }7 @2 k2 ]8 Z' v( c
4 A0 d5 N5 j; j6 l3 v" |$ W1 E$ U/ G1 X+ O0 h1 O6 z. B( g0 ?7 I
文档下载
! i, M, J& y  v* n& M4 k% B
; e( r% g3 N! v' {# l4 L. y更多实战经验( |# E9 L8 R# N" g" {" H
赞 收藏 评论5 发布时间:2017-6-29 17:02

举报

5个回答
ruigewei5 回答时间:2017-6-29 17:09:52
谢谢楼主
arenas 回答时间:2017-6-29 18:14:12
感谢分享
Paderboy 回答时间:2017-6-29 21:16:51
多谢分享。
weigr 回答时间:2017-6-29 22:19:18
参考
) O* |* a. Z7 H1 R% h1 F/ F7 m7 G
MrJiu 回答时间:2017-6-30 10:12:46
看一看!!!!!!11

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版