6.jpg+ C. K4 E: O# a5 g" P0 K
# N' J/ v; p. A9 X5 k& Y' r
( |& T8 Q8 C9 v T* l" k3 [$ I" S" b! u# v# Z9 r$ g: n3 u- g: l+ |
- s& f1 Y& K5 R" l& R. b从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
- M6 C/ u, n4 s/ _# g5 U
们可以看到改寄存器按照位划分成了几种功能设置,如下:
% p4 N4 i8 Q2 z% r8 a6 z$ ]HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
' \6 J/ `; A2 l/ s! R" Q, O 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
7 X. q. y/ K6 ^ |
时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
% ^6 m, r# {! F- Y' T
PUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
# }2 ]0 _% b9 u7 M
为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
* a0 ~( P/ P! g; L, uPKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
0 C& ^; n0 H- I' I4 Y# a
ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
- P# }2 C, e! S' t5 P5 ]SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
' |0 C& o P, V4 i7 L
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
- S$ z. ~" t% ?* i b) M0 _SRE(bit0)设置压摆率。
' O* O8 J( o3 s# k- F9 93 .3 GPIO 配置 配置
1 b; k- H" Z7 q- d
在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
" ?* j1 q+ `; d7 E5 m. v1 X X用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
# p9 \% S7 d8 G9 o d
GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
) M' P9 w7 u7 b
GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
0 S0 R, {' o# [; V
能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
8 j* j: A2 h# |( b- e4 I+ G
然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
' o" g- a( L+ L& J5 c* U' x1 ^2 } (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我
! U' _4 ?- s' F 们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的
* }8 A4 ?6 C6 I# m 寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、! g0 e& d) I- E7 Z0 w! z+ O
GPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存8 I! M+ W: |. }
器,下面我们分别看下这些寄存器:* Q* w5 x+ [7 e# }: P: ?
首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO! s7 F; G+ c. D" ?
就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
5 d" m- r5 e5 n! P* o 以获取到对应 GPIO 的状态(0 或 1)。% |3 l ], M& P, t1 c2 B0 ]
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应# O9 Q: ?, I, J* @ I7 R
的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。
' z# }; O$ _1 V& j4 ?9 @ 然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。
4 ?$ o) D+ A2 o0 {. [/ P1 V2 H* [ 然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存& {' H( q6 U( m" ? R8 A& z
器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
i3 Z: f A8 @' } [6 {00 低电平出发
4 F- H; }% F0 r- A01 高电平触发8 x* Q1 Q5 [$ W2 \4 s9 X7 C0 y
10 上升沿触发4 d/ R9 c; e! T
11 下降沿触发% x. `* R+ ?6 N9 |2 K8 I0 P
以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。
. f0 z+ Q- |+ r T 然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄* c: X2 |2 ~/ _; z
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:; O6 @( h! H: q3 E0 |
00 低电平出发9 K. D1 j" {- C0 A4 Z3 u
01 高电平触发+ L& {$ H' i0 ~
10 上升沿触发$ w+ p' o" @7 }" a( L" e+ t; r
11 下降沿触发
7 j$ ?4 W/ p7 u! ]& U 以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。& E. r; G6 G* e$ A1 n
然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器( B1 w7 I" [# P7 `
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。% Y7 h% W e" F. H8 G
然后是 GPIOx_ISR 寄存器,如下图所示:
l, a/ b8 a# N% J# G
该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应, d) H; E7 A% b$ [
的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须- D- D; X" i9 t; ^8 V
要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。
% C Y! c$ {1 O 然后是 GPIOx_EDGE_SEL,如下图所示:
7 W" w" E& ]' L, @6 l2 R$ ?2 ?该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应
6 R w5 I5 _; U8 B! B/ s 的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。
/ @ b3 z% \$ U( e3 e8 a. w( S 至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子