最近学习,发现需要总结一下模拟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- void IIC_Init(void)
) m% m! |3 J# `8 ^7 P( W7 @, B - { 7 y+ ~& n, ~- c0 X5 q( |' D7 L
- GPIO_InitTypeDef GPIO_InitStructure;. o% A: ^) v& x
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟( d) L+ C" J3 q% q
-
* a5 }: t! X: m - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;2 C$ K& j! U% t+ w' L1 \
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/8 ^* ?" c1 H# n' q; ?5 Y
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;+ y' M2 U- p# f4 Q7 J& S ]! W
- GPIO_Init(GPIOB, &GPIO_InitStructure);8 S+ M- {' y& a/ x- t* q% d$ l8 ]
- GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
# v G& l6 A' F |8 J - }
复制代码 9 e, k7 |. F1 R. T7 O" _8 X! H
2.IIC的io口方向设置
! K6 c7 G8 c9 d. g- //IO方向设置
" ^2 `. S W6 L: |1 Z3 R - #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
# j) L( f- J; R# v - #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
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
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 _
- #define IIC_SCL PBout(6) //SCL: _3 [- p9 Z1 t( B) T
- #define IIC_SDA PBout(7) //SDA : r6 m K' U c7 ^4 u* K) L
- #define READ_SDA PBin(7) //输入SDA
复制代码- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 ,内容取自正点原子的sys.h文件,0<n<16 ~* A4 g! L! a' D2 B4 S$ Z
- #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。8 P- c& F% |+ T! ^ t0 b
- # [: O( o# V, v1 h( M# ~* R
- ( g' x3 k, W0 O# X" ?
-
" M O8 \( D4 O5 ^, `& } - #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
- w) p/ S3 h8 ] - #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
( 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; |
% 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
|