6.jpg
" f: h) t0 v3 x y& V% x- e* b; z6 b; v3 W+ d% u, c
. q% B1 l; |$ f8 E$ A1 H, O. U, z8 S
. v/ m$ t. v( }/ A9 t9 E' V$ B& B: S- H4 R+ j. Z+ T
从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
3 N* ~/ a2 i; U/ Z& ^" f/ k 们可以看到改寄存器按照位划分成了几种功能设置,如下:
5 ~- a6 V' M& l2 ~3 Z+ fHYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
/ g7 Y- [2 H6 t# @
器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
7 A+ p7 R( z" `% t+ w2 W4 O! Z 时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
0 y+ B2 k2 L7 }3 |! Q4 m# T/ JPUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
) p" I/ \$ k' @% N) d; ~8 P3 V
为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
" W. u9 J# A. H
PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
0 v) y! S5 S: r; K, S2 \
ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
2 r6 i5 e+ z; X4 y/ ~8 E( _* TSPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
5 N1 [. p6 E" h+ Z
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
; k ^" v! _: _+ f: j, xSRE(bit0)设置压摆率。
* E# i1 s* c, u
9 93 .3 GPIO 配置 配置
?5 r/ ?( J8 m- W7 O& w1 i5 @/ P 在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
: ^( n% s* e. f5 B8 o% y6 X用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
" l% w6 ~- @/ G- R$ y- ?
GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
( |; B/ p3 j- P, C, P, B9 g0 JGPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
% Y1 F$ s2 s: V/ T! Q 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
$ l2 e$ Y$ h2 ?" I# w" G
然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
% R( R# z" @& c9 M% D (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我
' ^ x j( y& t+ W+ U 们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的
& b& U }$ n( u$ f: @3 F) _ 寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、
) S4 N2 l" O! qGPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存
+ P7 i$ D) E) ]( F7 K8 f 器,下面我们分别看下这些寄存器:: }4 |0 v& S, w
首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO, F! F. r) R9 H) Q, p
就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可" n0 n* f* R2 r, @2 q) y7 [/ H
以获取到对应 GPIO 的状态(0 或 1)。' r" v: q# r. f* y" y/ R0 v0 C
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应0 v- D, I3 C9 M+ r* `
的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。$ w( u/ S" |! W0 F) q
然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。( k7 F/ ?9 _8 [
然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存
+ j( X! }) W! T7 d' n. p6 s0 T& Q 器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
O$ A! x8 r$ `5 h: E00 低电平出发
! [7 h$ M: g4 H01 高电平触发
/ t- t( |4 \5 v: l$ E* v4 U10 上升沿触发) N+ L7 P/ v9 ?# w
11 下降沿触发
2 C/ E9 R& }3 c, s$ Z1 O- P$ c- ` 以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。
! P3 N8 h$ {' l* V9 p 然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄4 {7 @8 Y* f5 |0 D8 ~
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
W' ~! X* e7 \; B* U3 Q00 低电平出发
( R7 d! I; C: v V& b01 高电平触发
% G u6 H/ _' u# P/ `) \7 t# }10 上升沿触发
' w3 W! \: X) W11 下降沿触发6 r, U. N' E* {3 I( i+ u* Y
以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。' Z! N" j' @) C
然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器 b$ Z* D- u' Q% `7 k( m' C5 |, b) J
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。
8 g, }% P1 L) z4 i2 [# K, [, P) o7 ^ 然后是 GPIOx_ISR 寄存器,如下图所示:
4 a- s& s- {' ^8 l0 X5 _5 t该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应
7 B, ?1 c" u$ W+ g8 A S4 { 的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须
0 e8 h! h! l! G) ` r) u 要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。 I6 F2 |* `- n# W" n
然后是 GPIOx_EDGE_SEL,如下图所示:
' r- r m2 R, C9 C9 i3 k/ d7 t该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应
- t+ g; @) M0 e 的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。
) @7 B4 C+ p J6 X. S 至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子