最近学习,发现需要总结一下模拟iic的gpio配置,相信你懂得,但是最好还是需要理解清楚。# ~1 L6 O4 Z( L: [& B1 g* I+ L; U
; @# l" {% h m x
对于HAL库的使用者来说,配置只需要选中使用的io口就行了,以下主要是针对标准库写的。
c& I' k5 a g4 P' b* g, h: d
5 ]5 z! J1 J" o- m8 j( I7 z! Y1.初始化GPIO
# e2 M6 h8 W' Y$ K" e; E. }- void IIC_Init(void): b4 ]/ F' `6 P0 ]
- {
6 L) q r u9 s. S/ @ - GPIO_InitTypeDef GPIO_InitStructure; z/ r# B M# c
- RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟
) {; v. F) s( y$ S -
' S- w4 w# ?2 X1 x$ J - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
+ w$ h. ?; {2 b5 I0 ?: e9 \9 f - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/
% y. a- y7 j% p. \ - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;1 U$ X1 m8 F0 `3 s
- GPIO_Init(GPIOB, &GPIO_InitStructure);. c' C" _. n9 h3 p# F
- GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高& J! E7 s+ ^. H& l' l4 @3 S3 E5 D
- }
复制代码
- ?1 ?0 q6 _7 J7 @, \' J+ b2 ~5 c2.IIC的io口方向设置
! k" o7 w) ]! e" Z2 I9 T- //IO方向设置
% \2 P1 A' R/ x( ~7 k+ F! e0 c - #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}3 Y7 J; s- S1 q8 B$ ]) G( j1 A
- #define SDA_OUT() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)3<<28;}
复制代码 & K- X" U, v0 s; g9 m; P
% H! X b4 ?5 I$ y# h% {
数据手册中CRL寄存器的内容:& c! D4 P z2 l: J K
) T$ Z' u+ f9 s
% R) B0 t, S+ b& Y9 a4 P% ~! q g R
2 Z. A- }6 p4 r# ~9 v0 |$ }a.输入设置
& ]# F) e2 t- q% A5 T+ y! m我们把8(8000B)左移28位,即是将PB7配置为上拉输入模式。
# _7 H8 _1 t$ X+ Z/ a, ~! W1 w7 Z6 |
b.输出设置, D" g+ o: L5 @; [! T8 O
我们把3(0011B)左移28位,即是将PB7配置为通用推挽输出模式且输出速度为50MHZ;笔者圈出相关内容:
- j/ z, m; d# J6 c$ M" {$ x c2 K' n$ q" X" s# _' @- z
7 Q# f" s; |# c' ?
' O, ]' j. S. n! f. s! T
! z8 r2 @% B5 a- y9 I3.IO操作函数 , F; p7 e6 h6 L4 V
- #define IIC_SCL PBout(6) //SCL
% W" ` }7 w5 G7 \, c6 q9 W - #define IIC_SDA PBout(7) //SDA - h9 W8 y' f/ J: o6 |
- #define READ_SDA PBin(7) //输入SDA
复制代码- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 ,内容取自正点原子的sys.h文件,0<n<16. p0 x8 `$ b' |4 E; a+ R$ W
- #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。4 L* v m2 I8 }' ~
-
c) l3 Y1 d0 p" z- @5 H% y - 1 L8 y. Q7 f. H+ |
-
! H, x5 \9 w8 l' h3 d% z% |/ A& Y - #define MEM_ADDR(addr) *((volatile unsigned long *)(addr)) , m, J U, q+ e7 u# x
- #define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
复制代码
" p/ J; {* M& b5 [5 GODR寄存器相关介绍:
& M6 z4 m6 a3 V- z0 a0 U0 l" `: a
e7 q+ s# c( p" c" r# g" I |
* L. X5 E% B0 f8 U, c+ s
% N. `# g5 A3 N( A8 a
IDR寄存器相关介绍:0 v1 J2 w- `$ N7 G. [8 L9 A7 D
; I3 \- R, M$ E2 Y8 Z. D/ t# |
6 A( d, N. q$ T* {! Q$ p+ |
# ~; [; Y9 x$ t0 D
& b6 j, A9 b) ?/ f————————————————
( o2 H) f1 ]6 `6 j. J8 E版权声明:陈俊帆Linux
2 s( ~/ e. Y: R$ M- n& W# K如有侵权请联系删除
: _: h9 A8 V. d- `/ m G. w. _
1 C. G# ~$ f `( r
! P. }9 s! V/ E: O* V4 U3 R4 U( b2 B+ V4 ^4 [! T
|