6.jpg
( |3 K2 C7 _7 |, ~6 ]" z. L8 E, `% R5 l' b
8 G5 w4 a, @9 H# B: h9 w
* V! Y1 b2 `; o5 A& A4 A( O
+ U O/ s- p- c/ a0 d# X从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
( V3 x% h4 o( `% ?# u
们可以看到改寄存器按照位划分成了几种功能设置,如下:
8 k, @/ c) U/ [1 [4 G7 L' {! @ kHYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
6 b. p/ r8 p: ^& ~ 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
3 o4 h% y9 C& U 时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
H& v; L0 _1 p: c& W. r1 N! OPUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
( D3 E3 n7 V, \" B% v9 V
为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
- u p8 ~$ z6 R; TPKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
* S* K7 i' C9 y8 I2 K, c5 [, u* s4 k
ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
2 K5 Y: n& q7 c1 R! nSPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
5 K, d ]& d( ]; u9 v: \; ~: t
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
0 K7 y( L: D9 [% ~: v. R3 uSRE(bit0)设置压摆率。
* D( w" }& z& \
9 93 .3 GPIO 配置 配置
% o; ^. p/ P% v4 _: A
在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
( O3 ^9 y5 L4 E9 C- w0 x, ~
用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
& d# l$ Q: M; i7 b9 w
GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
( e: w8 ]; q$ s2 |
GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
2 q; }3 H h5 q) {0 L7 f 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
9 _7 e6 R8 F, ?. c8 \% L5 Q
然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
5 ?+ l; X1 n" a/ u
(GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我
3 h& D4 {3 b5 `- b. K/ o' f: [9 _ 们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的
) n3 Z# F# u7 ^, a 寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、0 U' K# U! F. Y# f
GPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存. f# m6 d" [# t/ W9 v
器,下面我们分别看下这些寄存器:7 K; U' f" Y0 P) a6 J# b7 \
首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO
' b' \9 z/ r; G& r就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
7 w" v/ j+ |* H( e% j$ n7 V. B6 q 以获取到对应 GPIO 的状态(0 或 1)。& z9 {$ ?: L$ t1 I$ m& I, u: S7 [8 t' `! j
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应' W; T9 C9 ]* g/ F% ~/ `
的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。% g3 @6 T; F+ ?: ^. }6 x" Q% i
然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。
0 o- H2 T* v7 z" t9 Q& c, Y" l( W 然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存
, s% r3 }# T! C3 x9 s 器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式: z- W6 k- q5 d
00 低电平出发, I3 N" x+ E2 x8 S, @& r
01 高电平触发
3 V: G9 v2 i# p8 X: O10 上升沿触发) |8 X* H6 J# Z9 ]6 P' R- I
11 下降沿触发
* {1 Z" X( O' H7 S+ w# Q" T' L 以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。
% e" ?- J7 L9 X4 N 然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄9 b2 H) X1 D$ w
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:3 k3 d% g& E- z6 s6 f
00 低电平出发
2 O( P# a6 r9 c- Q' T: a01 高电平触发; X$ w9 j d3 t/ d' T
10 上升沿触发
i/ L' y" M" u5 k ]11 下降沿触发
5 n, q$ ~$ `% T+ a l 以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。
0 p% A2 |- V# w3 [. j 然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器* S5 l7 `, d4 U; Y
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。# ~# F1 }% _) V( j# @ g
然后是 GPIOx_ISR 寄存器,如下图所示:
( Z2 `) V+ G' r0 R; u3 G该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应
/ G ?4 j" g7 [; V* a' s0 U# z 的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须
7 }4 v7 G2 a1 j, p" N 要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。# F, l0 G5 b, ` y
然后是 GPIOx_EDGE_SEL,如下图所示:
. x8 x, i) {0 w/ G8 a0 K: D: B
该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应% \2 a: s8 i% \* i- t7 q' J
的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。 z$ ]8 F9 Z/ A/ ]! U* ^
至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子