在编写GPIO模拟i2c时,下面两个初始化有不同
3 Y# U1 J3 G$ G$ a第一种方法:; m" _* S7 h o8 k
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;: K6 G0 H( w; g+ Y* ~" X
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
% H% f, B, i6 e2 t- F# E - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;6 k. ]2 k p3 k
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;! A8 Y9 \* P4 O3 i o
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
) _9 U2 S. ]; U - GPIO_Init(GPIOC, &GPIO_InitStructure);( Z5 Q) u$ p' O/ j5 r& X x( V
; t3 B9 b L' e& n6 k) y- GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); //zyboy
复制代码
% J* P" S4 d! g( |" t8 _第二种方法:
& n8 [" z- v9 V7 I, R- GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); //zyboy
4 R, ~1 o9 Y3 v; T6 r' K - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
, a' S6 K4 q+ ?, t3 k! t - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;- J: I# {! m; Y! f
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;( c/ P9 s+ b. m; S$ |! T
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;7 ]" v( d( R2 x# H/ }' A
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;; N0 e( }1 d# [' v6 E8 @
- GPIO_Init(GPIOC, &GPIO_InitStructure);
复制代码 ! W8 c) H5 n3 i' N* m0 \( v$ h2 ^1 X
( g& n0 r' S% S
通过示波器观察 第一种方法:会出现GPIO瞬间有个低电平,之后变成高电平,第二种方法:一直为高电平
! d% I1 Q! Z9 }' p1 t. e+ O' {! n8 ?4 l2 {* z1 b% w- }
原因:GPIO上电默认输入模式,GPIO寄存器值为0,高阻悬浮状态,GPIO电平由外围电路决定。8 b* M$ d6 H3 `& x1 e% e
; I& c9 c2 j2 C0 f$ \% ~3 w1 h
由于i2c总线,GPIO外接上拉电阻,故上电时GPIO表现为高电平。如果程序初始化开始设置GPIO为输出,再设置GPIO为高,由于GPIO寄存器值默认上电是0,故GPIO会是有个瞬间的低电平然后变高。如果事先把GPIO 寄存器设置为1,再设置GPIO为输出,则GPIO一直为高。- I% C7 H# h. ?) Z& t3 k- r8 K
( e2 [: B. C6 W: |/ Z# y6 ^+ E2 g3 d5 b8 z
|