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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-17 17:12
最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。
, T- m/ N& o( k# h) F' J; X( ?1 B8 a0 N$ ]! j6 g/ p
对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。
( {! {. @: k* Z) g

" I; S  J* U+ e' r1.初始化GPIO
2 c. s! I# s5 \8 l8 D, N6 `/ y& p
  1. void IIC_Init(void)# |  E+ l: [: L" f( n# c
  2. {                                               e' n+ n, d2 u: B" F: j1 ^
  3.         GPIO_InitTypeDef GPIO_InitStructure;, c- `7 t" Z! D* ~
  4.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟: c1 ?0 r0 ^! b2 `
  5.            ; J" H7 e) [; N2 L$ ]! l$ A  J
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;2 n4 E  ]% D; b. L6 R) ]4 o
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/
    7 p1 ?+ v- h! e4 K% Z
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;0 Q/ l& M9 s4 P$ s
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    # d/ a0 K: n! p; |: ]! {
  10.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高
    8 u" q8 E# {! D2 q8 Z) T
  11. }
复制代码

! T0 G& b6 p7 _3 F' v6 [% t5 m. _2.IIC的io口方向设置  }; y$ Y2 ^2 @
  1. //IO方向设置
    5 H- ^- x! v: U  O) {; Z8 A7 K
  2. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
    ! g$ F# G' `% }& F0 l+ T8 x
  3. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码

' _1 e& M4 g; c
4 c% m6 a( ~1 t# R/ |" k数据手册中CRL寄存器的内容:
0 n1 j. v7 n. H" ~) L
+ l, i) o. M/ O, `
c0159619a0c94b8582dbcafc84d73720.png
! k6 l5 n' _/ F) O3 T0 w5 n- i' v4 _2 c' I$ Z+ X
a.输入设置
9 i3 o  W4 ]3 q  e我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。
3 Q. b; s1 H  p( E6 l1 d2 N* @
! N0 y4 F7 u8 Q! @, k
b.输出设置& u, m' ]7 g  S8 x
我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:2 i8 W3 L, V" P) s

7 d3 y6 ^  I. W3 `+ i9 w
2cc259929bbb4cc9a2a6f8ca23ed6d1d.png 4 R! J5 G( X8 K5 m3 z8 P* e

$ p4 Z3 d2 f' L# A5 X" C

3 U0 H" k  ]% L6 k' X) x3.IO操作函数     
- D  S: `' o- \2 Z
  1. #define IIC_SCL    PBout(6) //SCL
    $ f5 H. O* y% M
  2. #define IIC_SDA    PBout(7) //SDA     
    3 H2 H$ \6 L) M& o- q
  3. #define READ_SDA   PBin(7)  //输入SDA
复制代码
  1. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 ,内容取自正点原子的sys.h文件,0<n<16
    & E* X( K6 [. p) }! ?: n* }4 H
  2. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。
    , {+ w: }' ~* W3 Z9 q+ x# |
  3. 6 V, X9 W. d# ?
  4. ; X" _* y5 q5 T! C& R
  5. * ?" j: w, `4 N/ K, ~
  6. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
    , [. K5 D0 b$ L$ x; G& v3 p/ Y
  7. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
复制代码

5 D& J8 k2 o6 P5 S+ o* jODR寄存器相关介绍:
; v/ H0 B8 Z% s) h8 `1 `* e0 w* G6 m0 j9 C9 I
e52926e004e34eb9a0c582947a9b6fe6.png
* Y1 A, a1 i$ }9 G
8 k9 M7 `: o5 RIDR寄存器相关介绍:
, o+ c! A' P; ^) _, }. }$ f% v4 s  z( M3 _9 p, j# v
d7b5b43db0bd47c689f75896f43b92d1.png
; m1 A; u3 `/ }  }* ?2 o$ ^. X/ G( M: M

7 o2 ?$ O. n) D3 @/ R" G————————————————
6 a9 N( C6 C* ?/ @; c版权声明:陈俊帆Linux+ x$ K8 D1 Y; ~% x2 I
如有侵权请联系删除
6 y* Q) G6 Q$ p: j, J& g' _
# l( }: b! }- j7 l0 C+ X3 A, d0 m: o$ Q! L/ V
9 Y7 g/ ~. U, \  b
赞 收藏 评论0 发布时间:2023-5-17 17:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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