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

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

[复制链接]
攻城狮Melo 发布时间:2023-5-17 17:12
最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。+ l0 V5 \) B, u2 q. @/ `
9 l6 Z6 q5 X# z1 e% S1 o
对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。+ e- G: Z6 F# n8 r( R

# U- W0 E( S1 C/ d1.初始化GPIO
( ?% Z; T; M; B6 o9 S! o( h0 Y; S
  1. void IIC_Init(void)1 R2 m6 V5 Q, {
  2. {                                             & [% R2 o" l  _7 G# I. y8 w
  3.         GPIO_InitTypeDef GPIO_InitStructure;
    + v5 F& _0 D5 U6 n
  4.         RCC_APB2PeriphClockCmd(        RCC_APB2Periph_GPIOB, ENABLE );        //使能GPIOB时钟
    & }9 E" \* d. e; J
  5.           
    ! k" s0 Z0 K' M8 j' V  c
  6.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;+ }/ _1 k$ f- e- T1 K" R) G% d- _
  7.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ;   /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/
    # A/ |# g. P1 t
  8.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    7 }4 s5 e; Z- q; D2 R* s$ Y
  9.         GPIO_Init(GPIOB, &GPIO_InitStructure);
    : J$ F2 t$ e, j5 ~+ p
  10.         GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7);         //PB6,PB7 输出高5 \- g4 s$ o+ ?- n) W
  11. }
复制代码
. ?6 \3 w2 p' i& {! ]7 d
2.IIC的io口方向设置
( ?( e" m$ [7 c/ R4 E
  1. //IO方向设置  b1 q7 F  n) z, n, p# }4 C# G% T
  2. #define SDA_IN()  {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}8 c. |, G) u2 |! k& e! J  C  t
  3. #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码

$ g/ k& Y& M  v' E" I& V6 o! e, d' D. h. z8 a7 f
数据手册中CRL寄存器的内容:
' s, Q# ]" ]  R* X. A, v% `7 S. h% ~0 T( I& e5 c) h
c0159619a0c94b8582dbcafc84d73720.png 3 R9 G/ ?% ~6 U
, o4 m* d% p; b
a.输入设置+ _; S  y2 \& t* ~- i
我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。4 A4 y' X2 e  d

; R$ B6 T& T: [% Xb.输出设置
+ X; e- L# `! o& O. `我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:
0 k- E7 s1 j' R6 o  K' `+ n! t9 q. e
2cc259929bbb4cc9a2a6f8ca23ed6d1d.png / ^! b9 q  V/ l+ G0 _* f2 Q/ I

+ O- j3 Z, O2 v% H: e% m) e

' J4 s. `" o6 [; c) c3.IO操作函数     
+ b. h) r2 v9 p" Y' }6 g) N5 u
  1. #define IIC_SCL    PBout(6) //SCL
    7 @: _* v0 y8 a! i% T. A+ {" j
  2. #define IIC_SDA    PBout(7) //SDA     7 d# F2 R. V- B( ]8 \. R
  3. #define READ_SDA   PBin(7)  //输入SDA
复制代码
  1. #define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 ,内容取自正点原子的sys.h文件,0<n<16! a+ ~0 Y8 B* @$ U8 t8 o
  2. #define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。7 {& M9 B+ I* r- r  l

  3. # e% v- K; U' h, E/ e

  4. ; J& A+ N7 R) K: [2 C+ x6 F" _' h
  5. + P: n5 y' d& r! Z
  6. #define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr))
    / W" Q% y8 w) w# X, W
  7. #define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum))
复制代码
7 p9 s3 {: [5 P. c& b# b7 x5 b
ODR寄存器相关介绍:
& f, C5 P* s5 R! G
" S/ B8 x9 d* m: A; g% o" x
e52926e004e34eb9a0c582947a9b6fe6.png
5 F) X9 u$ j9 _+ M! k, ]% t; x" m4 D5 ~5 L
IDR寄存器相关介绍:
" C. H; j3 L) r% H& I! ~* V# c- t) I
d7b5b43db0bd47c689f75896f43b92d1.png
; K- b$ d% C# \
4 E5 J4 p- R" e: O, q! d2 H
* p; i" x( w0 H/ E* t2 P
————————————————
% f5 Y7 \3 l0 `7 ^6 ~$ {版权声明:陈俊帆Linux
7 Q( [* i2 Q- q- S' ~( t# E如有侵权请联系删除
( c) @5 X1 d: D3 }  @  ?
4 O8 P; L3 A& `8 Q; I& P$ H. X& [9 q+ R5 G+ T. k/ p3 k) i  I
  l3 A! E0 z) P" X) I3 f
收藏 评论0 发布时间:2023-5-17 17:12

举报

0个回答

所属标签

相似技术帖

官网相关资源

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