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

基于STM32F1模拟iic的GPIO配置经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-17 17:12
最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。
5 x/ D# p* |. t( c/ Z3 g' f# u* x6 T  p, R8 U
对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。& e% D& b3 P: ]. }: \7 A
1 T# n) G: ~. {4 h
1.初始化GPIO
3 w- _9 r+ F* ^' G1 _5 t
  1. void IIC_Init(void)
    , t+ z& A9 ]. E/ |6 U
  2. {                                             
    1 u6 s4 ^- G/ f2 U4 n
  3.         GPIO_InitTypeDef GPIO_InitStructure;, |- a5 }* X1 x" y
  4.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟# Y. b. M) N+ k  X
  5.            ; h: U, G: }8 _: @& E  C* n
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;) f( e2 S( c- D
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*// m" E! k8 E* Q/ c6 k/ _
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;. @+ Z- ~1 K. O
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);- E0 H0 _3 M0 l) G
  10.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高
      A/ g, z- D' O( {0 t# z0 C/ p
  11. }
复制代码

' Y  t$ c! s: _: R. g( v2 q2.IIC的io口方向设置
  @7 h* v; D/ ?% B7 T2 y& B8 P$ i
  1. //IO方向设置
    % z& ~  c3 j! a/ W
  2. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}) K' T+ f, w5 @7 r8 G
  3. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码

1 X0 H) W1 v& c; K+ A, d6 E! t9 O' D4 n
数据手册中CRL寄存器的内容:
& o  F) }/ Z' A" g: x" `
  u% ]# l: P# u) X5 F# i
c0159619a0c94b8582dbcafc84d73720.png 2 q, c4 Q# u" H3 |' I
& t  E: N9 W* Z
a.输入设置: m' v' Z6 Y; v, y
我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。" k% Z! M7 `# S, g- z% k

6 e2 [2 I8 K1 v( T- v) nb.输出设置8 x! ]) Q; r) u  s7 |
我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:
8 U" l- [+ g4 I' {: y! j/ C: X' l
/ m8 @) f/ i1 {( m9 b8 P" M' k
2cc259929bbb4cc9a2a6f8ca23ed6d1d.png
4 O, H9 R. i4 C  D: L! j- l% k# a" b, v/ x
) x. h2 x- a4 z! w1 q/ V
3.IO操作函数     
- a/ i/ K6 u6 q3 K
  1. #define IIC_SCL    PBout(6) //SCL) l4 @/ ~2 j* F! D/ g2 c$ y  n
  2. #define IIC_SDA    PBout(7) //SDA     
    9 p# J& _/ |1 @+ J/ [& B
  3. #define READ_SDA   PBin(7)  //输入SDA
复制代码
  1. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 ,内容取自正点原子的sys.h文件,0<n<16  ~" W* j* `- \' \6 i6 n
  2. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。
    ; V# e' ~* ?8 }3 N
  3. 7 W  F. z4 _, _; `0 l1 x

  4. 2 u  a% h0 E, |/ ~4 D
  5. 4 s6 C+ T- ^. g8 R
  6. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) & p5 }8 H7 j5 j& w, n: L
  7. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
复制代码

7 U1 |8 Y) z( b  k3 ^ODR寄存器相关介绍:
: i7 Y% C7 C" r8 }9 ?4 R
- y, V% q( J: ^0 a0 K" d
e52926e004e34eb9a0c582947a9b6fe6.png
/ ~( u: S$ r; k$ s0 K) p
  ^+ Q0 m: K) x. S9 R$ ]2 c8 IIDR寄存器相关介绍:
- A# q5 H. C2 `* E6 i  m% Z/ L( O, f( s, K8 j0 W
d7b5b43db0bd47c689f75896f43b92d1.png
8 ~  q6 ]  \7 G* S
* q/ J* ]! R; ^4 N9 W

& j. P/ @  Q$ P" u! {————————————————6 B7 u' H- E7 l
版权声明:陈俊帆Linux& T, b( N1 \( p' l% u$ I& i! R" X, A$ I
如有侵权请联系删除
. G) z! ^7 y. S- y8 q' U
! f) O1 Q1 a7 v  [: b) c
5 U! r+ R( `/ k% |5 n% M) I! I$ _* r
8 W/ E2 L( Q% s+ H8 H
赞 收藏 评论0 发布时间:2023-5-17 17:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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