最近学习,发现需要总结一下模拟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- void IIC_Init(void)# | E+ l: [: L" f( n# c
- { e' n+ n, d2 u: B" F: j1 ^
- GPIO_InitTypeDef GPIO_InitStructure;, c- `7 t" Z! D* ~
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟: c1 ?0 r0 ^! b2 `
- ; J" H7 e) [; N2 L$ ]! l$ A J
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;2 n4 E ]% D; b. L6 R) ]4 o
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/
7 p1 ?+ v- h! e4 K% Z - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;0 Q/ l& M9 s4 P$ s
- GPIO_Init(GPIOB, &GPIO_InitStructure);
# d/ a0 K: n! p; |: ]! { - GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
8 u" q8 E# {! D2 q8 Z) T - }
复制代码
! T0 G& b6 p7 _3 F' v6 [% t5 m. _2.IIC的io口方向设置 }; y$ Y2 ^2 @
- //IO方向设置
5 H- ^- x! v: U O) {; Z8 A7 K - #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}
! g$ F# G' `% }& F0 l+ T8 x - #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, `
! 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
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 - #define IIC_SCL PBout(6) //SCL
$ f5 H. O* y% M - #define IIC_SDA PBout(7) //SDA
3 H2 H$ \6 L) M& o- q - #define READ_SDA PBin(7) //输入SDA
复制代码- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 ,内容取自正点原子的sys.h文件,0<n<16
& E* X( K6 [. p) }! ?: n* }4 H - #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。
, {+ w: }' ~* W3 Z9 q+ x# | - 6 V, X9 W. d# ?
- ; X" _* y5 q5 T! C& R
- * ?" j: w, `4 N/ K, ~
- #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
, [. K5 D0 b$ L$ x; G& v3 p/ Y - #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
* Y1 A, a1 i$ }9 G
8 k9 M7 `: o5 RIDR寄存器相关介绍:
, o+ c! A' P; ^) _, }. }$ f% v4 s z( M3 _9 p, j# v
; 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
|