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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-17 17:12
最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。9 u6 S0 b: f% T. K% c+ `) n* ~5 }

' c9 f5 J! f: r& y2 |/ M$ Y' M对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。
( _$ y* H# ^" c: {: l3 V3 y

8 f3 m# n( o( Q9 t1.初始化GPIO
8 f" Z2 s5 c6 {9 f. C
  1. void IIC_Init(void)# X$ `: L% [% X, O% |
  2. {                                             
    6 I- |8 z" A5 I& o4 V& @
  3.         GPIO_InitTypeDef GPIO_InitStructure;
    5 L' g; ]: V! t) l( w
  4.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
      ?( F7 \0 \9 c- K% ?- e7 ?& z
  5.           
    0 |  J4 H6 o6 j& x3 j- _
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
    6 c1 Q) {: N" r8 e" j" h3 Z& A
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/* l, G, _( w& E$ y3 q& @( J
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    # i8 j( l2 J$ A
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    4 y; z, m$ f" X; I/ C9 \/ a
  10.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高
    1 A9 S: e  _1 V
  11. }
复制代码
; P2 E: E! V8 V$ k% ^
2.IIC的io口方向设置1 \( `( K5 Q4 C( B7 Y. A1 @/ l
  1. //IO方向设置
    . r  N  A; k* d% w! U2 X
  2. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}2 l  p* |7 p. X& p! w6 b% ~5 Z0 A5 M
  3. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码

& L) A0 x( }4 B" v; I1 O  d
- ?. }- A2 B3 N% X数据手册中CRL寄存器的内容:: [  E) X! Q# {; r+ G8 F  J

8 Y: |; F* Z' Q
c0159619a0c94b8582dbcafc84d73720.png
& }' j2 r" a5 K" f& s
! g! Y& h' U( i( @, J. Oa.输入设置$ b& w+ \' ]. M$ [7 ?
我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。, y* E/ a8 }9 R$ }

7 S) c+ c8 t' I7 X) T6 Pb.输出设置, u( E: ~/ N( `! f, Y
我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:
# ~- n! L; Q# u- j/ D3 n5 l
9 X0 Z6 L" V) j6 Y  v+ s; Z) Z: y
2cc259929bbb4cc9a2a6f8ca23ed6d1d.png
' T+ f4 N6 V* t( B( K
4 R! `; _4 G, d2 g9 \4 |
8 `; l2 z$ _" @+ Z$ m
3.IO操作函数     # ~# e7 A3 b- y7 P
  1. #define IIC_SCL    PBout(6) //SCL  d, v% p! J* j# i- D8 U0 ?
  2. #define IIC_SDA    PBout(7) //SDA     
    * h& \7 E+ H2 |' I; X9 S+ f! x
  3. #define READ_SDA   PBin(7)  //输入SDA
复制代码
  1. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 ,内容取自正点原子的sys.h文件,0<n<16: b# y% h% X" r- _
  2. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。- W( m) K6 b. w$ L2 g  [

  3. . `; m+ \4 ?; X% z% D

  4. 3 E3 ^' Z9 G5 b1 S* B- L4 V% Q  E& j
  5. 1 k2 |$ f/ w9 u- ]: x- z
  6. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
      O+ u/ z* C- q, x+ k) a
  7. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
复制代码
1 o: r( P5 R% X, G# ~: l4 Q
ODR寄存器相关介绍:
8 h1 I1 D- |4 n! A0 H: _- C/ a8 Z5 H6 X+ S2 w7 ~5 W
e52926e004e34eb9a0c582947a9b6fe6.png
# X: l: y4 j. J! @3 z; L- Y7 U9 F
/ H% T7 L; E% x  ?IDR寄存器相关介绍:
/ I8 [5 G+ L, X4 J0 r" \$ Z6 _4 a2 q( b8 I" U5 T8 P( z
d7b5b43db0bd47c689f75896f43b92d1.png * H7 L2 `  c" p/ ?. z

! t9 c, o# ~; B9 L9 P/ ~

* O$ x- j/ h* \& E————————————————0 k% m- M  E& x# S8 N0 }
版权声明:陈俊帆Linux
* e+ {% k1 r; x( u+ U, r" P/ s如有侵权请联系删除/ U% g. j% v. Z: g$ q$ G

$ I$ u% Q9 q% b8 M
+ h2 M8 K% w3 m7 ~: f- q* M. \% @/ @
, t. U, I# \/ E0 C: [( J
赞 收藏 评论0 发布时间:2023-5-17 17:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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