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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-17 17:12
最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。# ~1 L6 O4 Z( L: [& B1 g* I+ L; U
; @# l" {% h  m  x
对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。
  c& I' k5 a  g4 P' b* g, h: d

5 ]5 z! J1 J" o- m8 j( I7 z! Y1.初始化GPIO
# e2 M6 h8 W' Y$ K" e; E. }
  1. void IIC_Init(void): b4 ]/ F' `6 P0 ]
  2. {                                             
    6 L) q  r  u9 s. S/ @
  3.         GPIO_InitTypeDef GPIO_InitStructure;  z/ r# B  M# c
  4.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
    ) {; v. F) s( y$ S
  5.           
    ' S- w4 w# ?2 X1 x$ J
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    + w$ h. ?; {2 b5 I0 ?: e9 \9 f
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/
    % y. a- y7 j% p. \
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;1 U$ X1 m8 F0 `3 s
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);. c' C" _. n9 h3 p# F
  10.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高& J! E7 s+ ^. H& l' l4 @3 S3 E5 D
  11. }
复制代码

- ?1 ?0 q6 _7 J7 @, \' J+ b2 ~5 c2.IIC的io口方向设置
! k" o7 w) ]! e" Z2 I9 T
  1. //IO方向设置
    % \2 P1 A' R/ x( ~7 k+ F! e0 c
  2. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}3 Y7 J; s- S1 q8 B$ ]) G( j1 A
  3. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码
& K- X" U, v0 s; g9 m; P
% H! X  b4 ?5 I$ y# h% {
数据手册中CRL寄存器的内容:& c! D4 P  z2 l: J  K
) T$ Z' u+ f9 s
c0159619a0c94b8582dbcafc84d73720.png % R) B0 t, S+ b& Y9 a4 P% ~! q  g  R

2 Z. A- }6 p4 r# ~9 v0 |$ }a.输入设置
& ]# F) e2 t- q% A5 T+ y! m我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。
# _7 H8 _1 t$ X
+ Z/ a, ~! W1 w7 Z6 |
b.输出设置, D" g+ o: L5 @; [! T8 O
我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:
- j/ z, m; d# J6 c$ M" {$ x  c2 K' n$ q" X" s# _' @- z
2cc259929bbb4cc9a2a6f8ca23ed6d1d.png 7 Q# f" s; |# c' ?

' O, ]' j. S. n! f. s! T

! z8 r2 @% B5 a- y9 I3.IO操作函数     , F; p7 e6 h6 L4 V
  1. #define IIC_SCL    PBout(6) //SCL
    % W" `  }7 w5 G7 \, c6 q9 W
  2. #define IIC_SDA    PBout(7) //SDA     - h9 W8 y' f/ J: o6 |
  3. #define READ_SDA   PBin(7)  //输入SDA
复制代码
  1. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 ,内容取自正点原子的sys.h文件,0<n<16. p0 x8 `$ b' |4 E; a+ R$ W
  2. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。4 L* v  m2 I8 }' ~

  3.   c) l3 Y1 d0 p" z- @5 H% y
  4. 1 L8 y. Q7 f. H+ |

  5. ! H, x5 \9 w8 l' h3 d% z% |/ A& Y
  6. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) , m, J  U, q+ e7 u# x
  7. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
复制代码

" p/ J; {* M& b5 [5 GODR寄存器相关介绍:
& M6 z4 m6 a3 V- z0 a0 U0 l" `: a
  e7 q+ s# c( p" c" r# g" I  |
e52926e004e34eb9a0c582947a9b6fe6.png * L. X5 E% B0 f8 U, c+ s
% N. `# g5 A3 N( A8 a
IDR寄存器相关介绍:0 v1 J2 w- `$ N7 G. [8 L9 A7 D
; I3 \- R, M$ E2 Y8 Z. D/ t# |
d7b5b43db0bd47c689f75896f43b92d1.png 6 A( d, N. q$ T* {! Q$ p+ |

# ~; [; Y9 x$ t0 D

& b6 j, A9 b) ?/ f————————————————
( o2 H) f1 ]6 `6 j. J8 E版权声明:陈俊帆Linux
2 s( ~/ e. Y: R$ M- n& W# K如有侵权请联系删除
: _: h9 A8 V. d- `/ m  G. w. _
1 C. G# ~$ f  `( r
! P. }9 s! V/ E: O* V4 U3 R4 U( b2 B+ V4 ^4 [! T
赞 收藏 评论0 发布时间:2023-5-17 17:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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