在编写GPIO模拟i2c时,下面两个初始化有不同 ?& b! \- }. B# j" K! J t
第一种方法:
* V& V( u7 q6 D8 b- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;# v; w- p, J9 e- w
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;1 e( l L; c4 V- g2 x
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
) F# u. ?- j! s. I) i! r - GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;! p( z; ^0 o* @0 _& r9 ^& K" ^. c
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;( c5 L8 ]5 a7 }; G% z7 Z
- GPIO_Init(GPIOC, &GPIO_InitStructure);; D. {3 Z! R! @# p8 ^
- ( G- z6 P" }1 x
- GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); //zyboy
复制代码
3 ]5 c* J6 s7 L& k第二种方法:: Y0 \8 r. n$ e& G) n
- GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); //zyboy
/ M4 ~3 U6 {9 K1 X3 E* ? - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
9 n. ^( \4 h+ G3 |9 K/ C. h - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/ S. j) v+ `/ w- q. k - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;! V3 z: n9 G( o
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;" N; O2 R& m; n; R8 p5 t; y
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
% f2 i r& e( n* h0 u, Y - GPIO_Init(GPIOC, &GPIO_InitStructure);
复制代码 1 c- y6 W* P; v. w9 Z
& f {% b! ~9 \, {% b+ e6 ~通过示波器观察 第一种方法:会出现GPIO瞬间有个低电平,之后变成高电平,第二种方法:一直为高电平
. s5 m, {) @0 U+ k4 R4 j) N, B) G8 H4 e7 ^9 s8 t
原因:GPIO上电默认输入模式,GPIO寄存器值为0,高阻悬浮状态,GPIO电平由外围电路决定。
d, p0 o0 T1 `# _; W$ w/ F$ X/ T8 H; X3 t& w, G& S9 ?* O
由于i2c总线,GPIO外接上拉电阻,故上电时GPIO表现为高电平。如果程序初始化开始设置GPIO为输出,再设置GPIO为高,由于GPIO寄存器值默认上电是0,故GPIO会是有个瞬间的低电平然后变高。如果事先把GPIO 寄存器设置为1,再设置GPIO为输出,则GPIO一直为高。
6 k" m* \8 ]% m: g! d- R+ _9 `1 B6 E$ [ Z# Q. X
0 l$ K' h& [9 E* N |