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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-17 17:12
最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。! s4 q" `5 o0 W* u/ a* j/ |

5 i  o) F! b, M( ]1 v对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。1 p0 ?' h% Y% S, O' h# B

0 k) f$ q4 l% }, X% t1.初始化GPIO
/ A) a+ J0 Q2 W. H2 m3 @8 e3 k0 N
  1. void IIC_Init(void)
    ) m% m! |3 J# `8 ^7 P( W7 @, B
  2. {                                             7 y+ ~& n, ~- c0 X5 q( |' D7 L
  3.         GPIO_InitTypeDef GPIO_InitStructure;. o% A: ^) v& x
  4.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟( d) L+ C" J3 q% q
  5.           
    * a5 }: t! X: m
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;2 C$ K& j! U% t+ w' L1 \
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/8 ^* ?" c1 H# n' q; ?5 Y
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;+ y' M2 U- p# f4 Q7 J& S  ]! W
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);8 S+ M- {' y& a/ x- t* q% d$ l8 ]
  10.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高
    # v  G& l6 A' F  |8 J
  11. }
复制代码
9 e, k7 |. F1 R. T7 O" _8 X! H
2.IIC的io口方向设置
! K6 c7 G8 c9 d. g
  1. //IO方向设置
    " ^2 `. S  W6 L: |1 Z3 R
  2. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
    # j) L( f- J; R# v
  3. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码

1 K9 D4 _  v: D! N5 d3 Q; j( q, M, W' _4 ?$ z2 |, ]2 n$ w
数据手册中CRL寄存器的内容:
+ z# K$ Y* u2 N) k0 S  K
) }. L* [# |0 L- o2 o% G/ ~. f! t
c0159619a0c94b8582dbcafc84d73720.png 4 ^# h% `0 I" _: R9 f$ J+ l& L: }
$ z: C0 |/ g* W* M. m: k4 S& b2 }, C7 L
a.输入设置8 R2 a7 O: k( c2 u! M4 B2 p- {+ p
我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。
4 L+ t( z) C& }/ n* s

1 u5 u! k. i3 sb.输出设置) {4 k6 i' c' W' a7 F: E
我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:( u. H4 ~. G% U4 S
) [; R* {+ g# K0 ]5 L* Z) b: R
2cc259929bbb4cc9a2a6f8ca23ed6d1d.png 4 I+ @$ K4 {  F. v; x6 C
' Y1 Z; v* L0 M  g+ k

1 @- c- h7 `5 A0 {3 O3.IO操作函数     0 X6 C- S- {5 _
  1. #define IIC_SCL    PBout(6) //SCL: _3 [- p9 Z1 t( B) T
  2. #define IIC_SDA    PBout(7) //SDA     : r6 m  K' U  c7 ^4 u* K) L
  3. #define READ_SDA   PBin(7)  //输入SDA
复制代码
  1. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 ,内容取自正点原子的sys.h文件,0<n<16  ~* A4 g! L! a' D2 B4 S$ Z
  2. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。8 P- c& F% |+ T! ^  t0 b
  3. # [: O( o# V, v1 h( M# ~* R
  4. ( g' x3 k, W0 O# X" ?

  5. " M  O8 \( D4 O5 ^, `& }
  6. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
    - w) p/ S3 h8 ]
  7. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
复制代码

* e6 `' L* n4 w" R8 ?% p# }1 \ODR寄存器相关介绍:4 o& I# B4 A3 B& ?% q

2 z( f8 f) k- y
e52926e004e34eb9a0c582947a9b6fe6.png
( p) ~! Q2 @2 r6 M# `, A7 |$ n2 l3 N3 y  X- j' R0 Q
IDR寄存器相关介绍:
) |% K( B5 m: \; w) L
, o% I$ x4 `3 h! }! p& B; w+ R; |
d7b5b43db0bd47c689f75896f43b92d1.png % D4 m: w* w% g% C5 W$ F
: X+ U8 O. L2 l4 j: s
2 r: K% ?' W5 A2 h$ w# I
————————————————0 X# [  i" j; E6 D! C8 N6 }! m
版权声明:陈俊帆Linux
: B" x/ D. t) B8 X; `3 a2 T1 T2 s9 ?' v如有侵权请联系删除
( ?. K( I1 g) z3 E7 t; @& h: n! b9 C2 B' [' K) `

! [( k* Z' E4 A+ U4 l1 r5 h: d1 L7 b1 p: T" h/ z! D* G4 d
收藏 评论0 发布时间:2023-5-17 17:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版