6.jpg$ S6 p3 z/ s7 l4 w6 ?4 M1 t
; n( X9 m+ D; m$ Y! a% q7 o2 e T
. G. c% {6 E& A0 |4 Y- \% i2 c# L, e/ K/ p" c
7 D) @$ O: ~0 q% R' n) _9 y从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
' j8 j! b k, ^& J& e 们可以看到改寄存器按照位划分成了几种功能设置,如下:
4 g! }" e, y9 e8 W) G! X4 C. A* w
HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
0 o; }2 v* _( f 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
7 i; H5 k: o$ C' U
时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
8 t9 {7 C9 v' h( K/ D' _7 _, ^
PUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
% c4 r" Y. x6 G7 j# b6 \ 为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
@" }. { {5 G* O3 w7 DPKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
5 w4 k. B4 U3 Z( G! @ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
0 i1 f% \# C" R) \( o7 bSPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
/ W+ L$ N8 o1 S) `% n8 t
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
3 h" t- P2 G; ~& ESRE(bit0)设置压摆率。
- C e c$ ]# \' @
9 93 .3 GPIO 配置 配置
8 u- y# c$ U" O$ X$ x
在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
) H8 e5 q' X* _5 [ Y @! S用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
$ ~% q0 y+ ]$ }& `0 h
GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
7 ?' {' c0 a/ X, f
GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
$ m! _5 l, ~! Y7 z$ J 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
4 B8 N! b+ z1 I6 H, K8 s6 \# | 然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
3 e1 U7 d6 `/ D8 Q (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我
' k3 ^) p: z5 _: V- X( J 们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的
" W+ G1 V4 H+ x! W5 G9 r 寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、' R% ? }) w6 T
GPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存
h" U6 H7 A. F# b( o+ y& t 器,下面我们分别看下这些寄存器:4 d a9 t# r3 T/ {1 B- W" ?1 Z3 J, H
首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO
6 {( O& c' ~" \' u8 s* r就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可3 _5 Y3 M, Y i( N# G" I
以获取到对应 GPIO 的状态(0 或 1)。
0 ~. Z) d2 K' b/ o) n 然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应& e6 e$ f8 s, |6 w* \
的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。& k2 R+ _. }! G
然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。9 M5 \" W; m* o5 g
然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存
+ o, I2 J3 ~0 v, @ ?6 ?4 b8 E8 e 器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:! o3 j2 W. X3 ?
00 低电平出发
6 n9 H1 F* R3 @$ k01 高电平触发
9 M& r$ N3 c8 o! h4 e8 U10 上升沿触发5 t8 V/ f9 j0 l: E- _
11 下降沿触发
0 W+ h3 h0 x4 `2 K 以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。# E+ y: f# ]1 E, d( _" f4 p5 m) U
然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄5 r; W3 w! g/ n
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:% ]2 V& Q: ~5 S) x6 ^
00 低电平出发
6 L1 g1 s, w6 O7 _0 P _; d01 高电平触发$ m0 |9 W4 s6 |7 N$ e6 U
10 上升沿触发
' A9 L- E: V2 I6 B( G+ F$ p11 下降沿触发
% B! S+ o/ ?# G$ I' ] 以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。
6 t- c1 I, ^! y: C 然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器 c5 w& J0 \9 @2 E: b9 }
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。3 {; S& M. k' v) `2 e! `3 s
然后是 GPIOx_ISR 寄存器,如下图所示:
+ ?9 p4 K$ ?% B该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应4 {% o+ O' ]7 @- j, R e1 t2 U
的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须. e4 @- J5 m* s5 s$ j; ? m
要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。4 Q4 ~0 ]5 v- V2 s% a6 E" F: `7 c
然后是 GPIOx_EDGE_SEL,如下图所示:
( @3 R/ Y8 w T9 A4 k该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应
w" k3 e6 V5 A/ u7 s, i4 O9 G 的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。
: ~% B) \& n1 p$ \! T4 C* t 至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子