6.jpg
" v7 W1 u; k' b% u1 V+ x5 a* t- u5 {: V; E9 Q% H, @
- v' s" G6 O7 t$ N
$ v/ F" s: q# \" @7 S& L; Y/ i7 Q' q4 ~, {0 J0 K5 W3 K
从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
% J1 C- _/ g# G) e+ k' f/ Q 们可以看到改寄存器按照位划分成了几种功能设置,如下:
* W! J+ O$ K- M o3 q
HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
! b. e9 _% k7 M. i 器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
& z" w; F3 w# Q7 I M
时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
0 u& `3 C o! t; H3 E0 cPUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
! E0 c" p; W" M2 h3 X 为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
& W k6 f* t: X+ {
PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
( D" n5 u; T y! u5 }# g) F; t1 Z( OODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
+ n* G- a9 {' G" L3 y6 @
SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
7 |# ^7 K# p1 i) \) p: Z7 b, G5 ^: C
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
% C' U: P6 Q8 v! [, h2 z7 n
SRE(bit0)设置压摆率。
5 _5 U4 _2 T; E4 ]9 93 .3 GPIO 配置 配置
W2 {% ^+ ?5 Q$ G7 _; }/ ]9 |6 Z
在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
2 f. d! a2 N; j% `
用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
" [. |# u) p8 qGPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
* A+ a4 n4 _$ h8 [1 sGPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
# H) M1 P5 z) q- g4 x& l 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
. M- ^$ l5 N5 Y3 Z7 G5 J 然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
* p8 Y$ f4 ?4 j1 C% C2 @ (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我, [& n& @, v' G, p7 K/ o# i: v
们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的
) f! R4 a9 z2 |- H: Y: J 寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、
7 u& M. L; D W5 v1 E! X& s' w# x3 OGPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存
' L8 p. B. i- K! Q# i) ?7 v 器,下面我们分别看下这些寄存器:
3 R4 y7 \2 W, K/ k$ t+ J 首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO
Y$ b, `6 P0 c8 m就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
, i% G: m5 o" T6 \ 以获取到对应 GPIO 的状态(0 或 1)。9 ?1 l0 W. P3 X3 n
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应# s) a* \' j8 }7 \; m
的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。! L( j4 m k) _7 x( j$ p
然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。
# ]1 z4 ]; E8 _, v) E% ?- P& p 然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存
, Z' y3 F2 k" ] 器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
0 S& p6 D4 j* K) k. u" w+ g8 Z00 低电平出发: _1 h1 _4 J/ \- }4 q; _
01 高电平触发
, Y$ J- L$ @* T10 上升沿触发; O- p# G% u& o, ?; ^6 W- U( X
11 下降沿触发8 [( _' G9 G: x7 H$ |+ w
以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。
/ R# S& P, ~4 @/ Z* c% o' {2 c' E* H8 w 然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄. ~( j% F; w* g( {5 q. t. B/ ^" N8 S
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:! n7 l' h( X: D& B, S
00 低电平出发
3 B0 w9 ?: f* L0 ]01 高电平触发. m9 L( G% J$ [$ m, e' O! t
10 上升沿触发
- n" O- Q- a' v11 下降沿触发% v) N) J+ ]* w* q( W* W
以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。+ O4 j; ? m- U$ b6 g
然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器
s$ A3 k: ]8 r+ [4 ^2 k4 O: ^, m 对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。
6 y+ H' J4 n8 c8 ]2 x 然后是 GPIOx_ISR 寄存器,如下图所示:
1 N: }9 p$ {0 z, `* i' T N
该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应; l7 c3 L/ d6 [* r
的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须% H$ F/ x$ x- z6 l$ K0 O
要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。+ [+ l9 f& T# |* ^
然后是 GPIOx_EDGE_SEL,如下图所示:
C' m K" R p$ l该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应
5 p8 a7 q( U5 s 的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。$ I& n/ f% k# ~7 G: V" S
至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子