在编写GPIO模拟i2c时,下面两个初始化有不同/ R5 w- r0 l& L. e; `5 W
第一种方法:
, r$ i ?3 L1 G" |1 m9 A W# r# z- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
" K0 ?! f. S: f1 f F - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;& d- C& X0 y) t* G" {$ K2 X
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;; G" q; t' {% e6 l) ?) U
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;3 A8 \( j4 c' }8 x; c
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
) y: Q e3 l, p- A/ g6 K - GPIO_Init(GPIOC, &GPIO_InitStructure);
4 K# X( s- r7 N4 r
# c, V5 D+ h7 A+ c D- GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); //zyboy
复制代码 $ r6 k5 V. b, g+ {
第二种方法:
' O) d6 r7 ^. h& j" j- R' O& R1 @$ O- GPIO_WriteBit(GPIOC, GPIO_Pin_9, Bit_SET); //zyboy8 c# M, c3 g0 p2 h$ T9 V" L6 K3 h
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
7 [# F! N/ y0 y+ X# g' A; ] - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
% {; t7 ~! I# g, A - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;3 N* C7 U% u2 q4 b
- GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; P" A$ W- k( R& e& V1 a; N. Q, g/ U
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;$ S3 N: ?; U$ U- t
- GPIO_Init(GPIOC, &GPIO_InitStructure);
复制代码
! p% H. w- R: F" Z& P8 ?% u; k
2 ?6 |5 }2 ~& X \- u通过示波器观察 第一种方法:会出现GPIO瞬间有个低电平,之后变成高电平,第二种方法:一直为高电平
- S0 P$ i4 N ~+ l! H9 I' k
1 V. ]. t$ E/ \3 V. K0 P7 S原因:GPIO上电默认输入模式,GPIO寄存器值为0,高阻悬浮状态,GPIO电平由外围电路决定。
+ _: s" G1 T9 H; v8 `8 ]+ x) O8 q4 q5 |+ L# Y, j" P. U# O
由于i2c总线,GPIO外接上拉电阻,故上电时GPIO表现为高电平。如果程序初始化开始设置GPIO为输出,再设置GPIO为高,由于GPIO寄存器值默认上电是0,故GPIO会是有个瞬间的低电平然后变高。如果事先把GPIO 寄存器设置为1,再设置GPIO为输出,则GPIO一直为高。, W( _9 u6 H$ `" c$ b5 b; ~* A
/ Q. [2 h6 S. ?0 T7 l, }1 H/ K! }2 N4 X" P* [+ I; |
|