最近学习,发现需要总结一下模拟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- void IIC_Init(void)# X$ `: L% [% X, O% |
- {
6 I- |8 z" A5 I& o4 V& @ - GPIO_InitTypeDef GPIO_InitStructure;
5 L' g; ]: V! t) l( w - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE ); //使能GPIOB时钟
?( F7 \0 \9 c- K% ?- e7 ?& z -
0 | J4 H6 o6 j& x3 j- _ - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
6 c1 Q) {: N" r8 e" j" h3 Z& A - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; /*推挽输出,也可以配置为开漏输出,其实、常用后者,此处配置与后面的IO口方向对应。*/* l, G, _( w& E$ y3 q& @( J
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
# i8 j( l2 J$ A - GPIO_Init(GPIOB, &GPIO_InitStructure);
4 y; z, m$ f" X; I/ C9 \/ a - GPIO_SetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); //PB6,PB7 输出高
1 A9 S: e _1 V - }
复制代码 ; P2 E: E! V8 V$ k% ^
2.IIC的io口方向设置1 \( `( K5 Q4 C( B7 Y. A1 @/ l
- //IO方向设置
. r N A; k* d% w! U2 X - #define SDA_IN() {GPIOB->CRL&=0X0FFFFFFF;GPIOB->CRL|=(u32)8<<28;}2 l p* |7 p. X& p! w6 b% ~5 Z0 A5 M
- #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
& }' 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
' 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
- #define IIC_SCL PBout(6) //SCL d, v% p! J* j# i- D8 U0 ?
- #define IIC_SDA PBout(7) //SDA
* h& \7 E+ H2 |' I; X9 S+ f! x - #define READ_SDA PBin(7) //输入SDA
复制代码- #define PBout(n) BIT_ADDR(GPIOB_ODR_Addr,n) //输出 ,内容取自正点原子的sys.h文件,0<n<16: b# y% h% X" r- _
- #define PBin(n) BIT_ADDR(GPIOB_IDR_Addr,n) //输入 .我们这里就不配置BSRR寄存器了,在别的工程里面看到可以操作BSRR寄存器。在这里,我们对ODR和IDR寄存器配置。- W( m) K6 b. w$ L2 g [
-
. `; m+ \4 ?; X% z% D -
3 E3 ^' Z9 G5 b1 S* B- L4 V% Q E& j - 1 k2 |$ f/ w9 u- ]: x- z
- #define MEM_ADDR(addr) *((volatile unsigned long *)(addr))
O+ u/ z* C- q, x+ k) a - #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
# 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
* 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 |