6.jpg
! Q* N3 J: B- [" i$ K
3 U+ T/ G! C- y+ I4 P4 ?
& c- R. _8 r E1 s( e& f
2 V8 I8 V6 j& l/ t/ U! k6 l6 L$ \ |
从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
, D, p i+ W# b l
们可以看到改寄存器按照位划分成了几种功能设置,如下:
: p x& w( _8 B2 b8 w
HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
7 I2 M. X8 R5 h* N. y8 f' h 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
% I/ y9 ^- Q8 }4 \0 I 时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
2 i) u3 [! X$ H; E
PUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
3 ?4 F8 K' G c) |% I) L$ \) P 为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
4 H: X; c5 q, R, S- N1 m6 k2 ZPKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
1 p- c( ^* B$ T
ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
1 N9 |& w- ~8 W8 c* L9 Q+ |; S
SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
: b8 i7 d: N! I- r* m% uDSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
# O4 L2 E: d" k8 U( m8 A
SRE(bit0)设置压摆率。
0 R/ U2 [4 |+ k8 L6 P
9 93 .3 GPIO 配置 配置
* p# r& Y% E, ^5 r8 B8 n) F; S0 | 在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
+ ]1 ~( x% j7 K' U* x" a3 }4 `用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
8 @# m$ g/ f- ^+ n) R/ ]; uGPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
b6 W5 Q3 v8 W2 k0 l3 X, jGPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
6 }! x, I+ f% j9 i2 Q7 m9 G2 U# y# R 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
+ d- U! `, U4 y4 _8 K8 r
然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
- O9 m1 A( _( d! i1 t
(GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我/ l6 y, E+ X9 f1 L
们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的6 f5 G0 q N- o8 ^
寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、
0 @. l4 @+ d# M3 CGPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存% i, k- K1 C M7 w; G6 s
器,下面我们分别看下这些寄存器:
7 B) q9 R i* |7 _: p 首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO) h# d" ]3 P j% i( B" ~7 v1 i
就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
; X8 D$ k. [# ^ 以获取到对应 GPIO 的状态(0 或 1)。
" |5 C, r8 v# G/ }9 s1 F 然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应
6 X Q8 C9 @ Z% a( g @# g0 D) K 的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。
& B$ \ a/ w- u 然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。* c% H2 n$ z9 [9 Q
然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存' M, j" A5 A7 f/ Y/ S
器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:+ N$ ]# f' h- E4 s& }- A
00 低电平出发
1 |" E; x$ k0 P; m4 A5 {01 高电平触发
& m$ C; ]( R( \! e/ z6 Q10 上升沿触发8 W1 s0 G! _2 l' B. E0 e6 n
11 下降沿触发6 N- Q5 w- e% f1 Q# f9 [2 b
以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。, F( j$ Q: V# ]& J, C f
然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄0 D1 `6 T; K% D" p, H" x
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:3 X1 v9 s: r2 W3 A: O
00 低电平出发
' U0 i2 P. H* M* l01 高电平触发
8 C7 n3 Z0 e6 U) |, b* T10 上升沿触发) u# N, s% Q! t+ ~
11 下降沿触发
$ j0 b9 X- t3 r8 U9 L$ A1 e 以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。% C4 K/ ~ O" G/ k" L- G$ q
然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器% z+ c" q2 C( J; U3 \7 |5 b5 l
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。
( {' I& u b C) H P, A0 B$ G 然后是 GPIOx_ISR 寄存器,如下图所示:
, F x/ h5 z; ~2 V该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应
: p5 U# T$ a& M& C$ k5 ~7 w0 s 的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须
6 W! Q3 w( _+ @ |1 x5 M- _ 要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。6 q7 s7 I% c0 K w( k
然后是 GPIOx_EDGE_SEL,如下图所示:
) Y* D2 C6 z3 b: B& o该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应4 z" R( ?8 g5 s# f4 C
的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。
. H# a! }) J9 e& {; E 至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子