6.jpg
m3 c) ]% a; m$ C/ n( P Y
$ \8 \( }/ j" ?* g
! j" N8 G2 k( W' j. _
9 }9 C4 u: V9 V+ B7 a3 u
+ y9 W E8 O7 {! {1 }" w6 d从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
0 R8 @) F G! l1 M- A
们可以看到改寄存器按照位划分成了几种功能设置,如下:
" k1 Y+ a6 b5 k8 u! ~9 O! s1 p
HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
4 i7 E+ d9 m: I+ O& J 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
* b/ ?5 B2 H9 Q) q3 t1 C1 _ 时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
* W/ x' P& J% B- N/ KPUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
0 ^* l$ ~- w: f9 a: _
为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
/ i+ O& a4 J- n, a# Q
PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
1 F$ e7 X, z( [- KODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
! w" B' j8 m: T5 w c5 Q6 |2 m
SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
" j$ B7 ?0 D. u- m" Y4 k7 BDSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
1 e9 N w8 h& E3 I8 z4 ~& USRE(bit0)设置压摆率。
4 y* S; o8 h1 H- r, l" R
9 93 .3 GPIO 配置 配置
, }/ o8 @- ? Q) P
在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
. ]6 ~" \0 Z' r& \# f8 V L
用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
6 W) {/ Q( J5 R
GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
- S# _4 Y0 W2 L% R1 ~GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
$ _7 n! K* c( h5 g" _) J: H
能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
1 ^: _5 e* F) S3 }; ^. r; C
然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
5 f8 ]* k6 N6 O+ A! Y- ~ (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我6 L3 M: U, ?5 V$ |+ \' C8 N
们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的& ] P* I; i- \ W: [
寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、/ a) ^) ]; p% M6 Z) y6 {
GPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存
6 Q7 ?, {# t9 t* J& q0 ~. Q4 U0 H# m 器,下面我们分别看下这些寄存器:2 l. n& e& J+ S6 d$ q) _
首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO
3 ]! E% \. L* A# T. _$ A就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
! n& `9 \" n& ^2 E! [" \ 以获取到对应 GPIO 的状态(0 或 1)。
$ ~9 f& J9 D, f 然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应5 {' F8 R n/ Q& k( {
的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。5 W7 R& A& Q' K
然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。" a2 ^+ M" m4 l4 h& {& B
然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存
! T. A8 x/ } Q 器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:! c/ d5 R/ Q8 x; S0 u$ j
00 低电平出发
$ z5 g! T) M' O: ~6 w5 d01 高电平触发
- k" Z$ ?6 H, ]) o" M10 上升沿触发1 ]7 \3 Z, U P0 r9 V6 j1 y7 t; F
11 下降沿触发
! k- Y- x7 G* c2 U8 y 以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。
7 T/ q. M' ]1 R- t- O 然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄
3 m; L. {) r g, S0 Q8 q8 o) `- K 存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
! [ [3 Q; r) D9 v0 J( o00 低电平出发
2 ~. s, `% e- K0 l; r+ d01 高电平触发, e _- l. ?8 W# a: | n0 T
10 上升沿触发
, |( Y% E2 A6 R8 m11 下降沿触发
% X, ^8 b. e! E) Z) ^0 Y, D 以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。" y6 b$ [: c2 C3 T7 W; i
然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器1 J _% Z" C1 U e, H
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。
7 m# |( q$ u6 B3 Z% C5 y" H3 b( G 然后是 GPIOx_ISR 寄存器,如下图所示:
% \$ T/ y+ A, h2 ?7 W该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应5 _; u: v' }8 P+ e7 j* H* r7 e( s) z
的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须
) J( O% V! f! a4 { 要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。5 y" p% o7 E7 y& a6 G
然后是 GPIOx_EDGE_SEL,如下图所示:
" G2 o. f0 U' @! K& C: \% A. Q& t
该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应4 I% s, t0 I; J9 J$ }
的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。. G: A, i; c5 ^( c; [3 ^7 s
至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子