6.jpg4 T/ G' @' q8 O* N3 N# |
8 B. C2 D; y: J' ~5 l9 }* o
3 D, ~! k+ c$ G% L1 V4 P t! ]! N6 n$ G& F6 T8 M1 U% ^9 M
Q' }( O$ j+ z: H从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
- e* h; m3 E+ ^9 ]. k
们可以看到改寄存器按照位划分成了几种功能设置,如下:
9 \% C$ H1 I8 u- {& P# ~: }HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
6 p: P4 P3 d6 G5 A0 g 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
! m# e: X* N0 j2 l7 |
时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
- ]% f* j" r! w
PUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
, Q. F( l$ O* n( d9 R8 J6 H 为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
. }; v7 H9 j3 _7 O3 oPKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
; V w, l5 \8 x' NODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
) C: }, v1 ]6 f5 @, zSPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
' k8 ^ C1 i9 b5 n+ t
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
( A1 }% y9 q' E/ g' T0 k# K" L$ X @SRE(bit0)设置压摆率。
4 u8 a3 |9 B/ s: f% `9 93 .3 GPIO 配置 配置
! q. J* O2 }9 B# p5 z! Q 在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
0 x, @7 p4 k5 v/ ?. B* K L5 a用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
. R* x8 ^- c( M! V, WGPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
* c' {# ?/ _+ F; G5 V7 ]+ MGPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
+ C+ W/ [5 O x. r$ J9 V
能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
. ]- B$ c t6 z. V; I
然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
/ S( i9 h- [2 |7 D
(GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我
7 E# t5 r; }* i 们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的# j i ~/ B L3 a
寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、" x1 Q$ q; {, X. M# o7 e
GPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存$ I n" @$ z3 ?$ L
器,下面我们分别看下这些寄存器:9 [; R. Q/ g4 F( o# T, Z
首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO: `) y8 y" U# }2 k, V6 T' x
就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
" E, r; [0 J7 y1 m6 e( n. {2 l 以获取到对应 GPIO 的状态(0 或 1)。3 z5 y+ } f4 Z L0 J
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应
( x4 s% ]3 ]4 ~! G5 k/ | 的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。
7 S) s6 W' U8 Z; O, _ 然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。
, T/ Z; E6 N# U, U8 R$ L 然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存9 T9 H" ?' R) F- ^. ~
器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
- X4 E/ I- i( Z6 p+ b1 [00 低电平出发
{9 Y/ I5 k( ~" |01 高电平触发2 t1 B" C1 G# @' |, e
10 上升沿触发% [% K% n2 G O2 {7 Y( |
11 下降沿触发. a$ p8 p$ c/ W" Q7 V
以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。. Y& F, u4 M; g& d) C. E
然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄( d, {- g. i4 S' f" n) {5 ^' I
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
4 z! R0 l+ W- ^$ O+ F00 低电平出发7 v* S6 \0 e( W
01 高电平触发( s M, O* x ^
10 上升沿触发6 ]% a# L( ?4 ~7 B' i2 |. |
11 下降沿触发
8 p9 @* Q+ C" n$ J7 {; x 以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。
6 z7 H& y# ?% A; V/ @2 A! L 然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器
9 ^+ \+ l2 a/ E' g1 o# L+ P 对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。
( i) `0 I, ]! p$ e1 D3 A: P 然后是 GPIOx_ISR 寄存器,如下图所示:
* S& K' l! i, n3 W3 r. v" d% p) }
该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应
( T. H) Y: s7 B! _; J 的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须$ H& F; g5 P# S: d: u
要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。
0 T* \3 A% ^1 Q- S9 w9 D 然后是 GPIOx_EDGE_SEL,如下图所示:
/ u) |2 J9 G& ^9 Z* S
该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应7 n$ @3 e4 S/ B" U- J8 k8 O
的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。) l* D- p( E+ f/ `7 \0 C* X8 K
至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子