6.jpg
0 D1 z/ I: M1 H5 }* P3 T1 J$ B) r* V% W7 Q J
- ~( ~ n; R3 A: m j: q8 F2 b; i
! x5 O9 v3 |. E7 m: G2 ~# b2 [+ h; o
从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
9 Z1 ^7 }5 G6 j' s% {1 W) T$ t: @3 a 们可以看到改寄存器按照位划分成了几种功能设置,如下:
/ z! X' ?0 e, u, aHYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
: \7 D- \ c2 `
器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
1 f% q! b e3 |/ s0 I 时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
3 ~/ s/ n% ?5 u& w
PUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
I9 L# Y1 M: k$ F
为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
: c, W' C5 f- F8 `; y
PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
b' o4 _2 E+ j& r0 x. w) s5 a7 V
ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
* D Q) j* h. _* R# L, s0 ?2 ]( E
SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
. G, p1 F' Q- KDSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
/ w4 D' X; C0 h2 a2 MSRE(bit0)设置压摆率。
. F3 h* w8 i I7 }& y- _
9 93 .3 GPIO 配置 配置
# ^) o' x0 m7 Q; i 在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
2 e# J( K% K' ]; d- a8 @1 \% u- U用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
& Z7 S; B( S; X, yGPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
3 D1 z! ~, l8 v. c! X ^. B
GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
% @( N3 @4 N! X4 s9 J& v& v& _ 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
: K$ c: i- h7 N+ X 然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
% ~) O8 Q* [ A# {& O
(GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我/ N: T: Y! K2 x$ t5 @2 O
们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的7 |1 I$ c" ]* j
寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、4 e. q! D% g1 t+ z; D. B
GPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存* m2 ~8 O, W$ u, S
器,下面我们分别看下这些寄存器:+ v2 O) H5 I* A2 H
首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO
" L5 x+ n5 ~2 y) z+ c1 m) _/ Z就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
; v# _" k5 c3 \( b5 t' Y1 B. l z 以获取到对应 GPIO 的状态(0 或 1)。1 n+ @! g" \& W! f9 p, V
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应
$ c, v* H4 t2 |0 E5 u 的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。4 p+ w2 x, {& Z0 [9 c. y \
然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。) {2 m1 ]3 e8 W% g3 D7 W" L0 l+ S2 [
然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存
$ [, N8 Q+ `: E 器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:8 [- P* V+ g; j. P$ Z- X) Y2 g
00 低电平出发2 P. E3 n" Z' k$ ~; I
01 高电平触发
! C% T, s2 ]( v x+ Z10 上升沿触发: F9 q' t6 X0 w9 x
11 下降沿触发
9 ?5 d/ i! [- q6 K 以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。
" E& Q7 S. X1 l3 ~3 a 然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄' f9 J! r# V$ X3 F6 Q
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:, q$ _, J ~2 y8 w; J/ N
00 低电平出发
5 Z7 S/ L# X% j, q- S* `2 a01 高电平触发
7 _- J# _0 O. q* ?% U% A3 H10 上升沿触发; H. l& i' S1 P) Z% ?2 R2 a
11 下降沿触发
( w$ s% O N5 U* j9 _9 Y; _ 以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。3 G5 m! y% k6 Y, B+ e, X
然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器
3 q$ Y5 N3 p, C* D0 I6 p4 Q 对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。
: J6 l( m- X, w% b% M 然后是 GPIOx_ISR 寄存器,如下图所示:
# I4 `4 G7 K& m0 }, u& |+ D该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应
: i5 c7 i7 ]* L _+ w- {/ X 的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须
( b( D ^; K9 N9 w: ]. G 要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。
4 I) K6 X; B n% q s. E 然后是 GPIOx_EDGE_SEL,如下图所示:
8 u" U0 T, j0 C3 z
该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应
0 |( d0 _ t3 A6 R 的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。4 o: ~" S& G1 R3 B+ T. A! c
至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子