6.jpg/ W0 @' l0 J5 T; @( f+ B6 ?
' S' q, C5 O p; B/ `- i
0 B. g9 i2 e# G. Y. O3 U1 r% g2 w
' K# [ |, L# p3 r3 ?) a/ d: |* ^) C; p2 y* E9 @
从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
1 l! ~; ^; E) L: ^, S
们可以看到改寄存器按照位划分成了几种功能设置,如下:
+ x* v+ C8 d) r" m. ] C" zHYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
2 \. H: i+ P: m3 n, s
器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
# m' Q2 U& H% n0 W# t
时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
# T# A6 d2 n6 b; @/ Y, Q k1 tPUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
4 f( a9 H9 ?% S 为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
. p4 E0 S N, z
PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
, j6 L& y: q% U; Z6 k4 u$ B7 |, hODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
4 y! v& R) d5 q- t& \+ T1 |SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
* X5 M+ R1 _8 N( }5 U; \- v
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
) g, b0 p7 B9 m$ k
SRE(bit0)设置压摆率。
0 p2 p" q, t6 J% W
9 93 .3 GPIO 配置 配置
5 v+ S7 F9 h, @- K1 s 在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
1 f( Q0 O( j5 x6 j. }. {" F4 I
用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
6 c- |# s4 t% w Z% e( J
GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
6 K1 y; b& n7 C6 i( u" iGPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
, x) d6 w% ^6 X1 O2 [6 }
能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
7 O& L O9 t. ?* M6 y
然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
) u$ q% w+ S, p" B (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我
* H6 ~4 v0 s8 X$ v: E, ~ 们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的( V- ]- ?# e7 D7 E5 B
寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、
' W) m+ j7 B) c: n1 I) O, B& oGPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存
/ b% I4 l% {1 `. W5 `) L 器,下面我们分别看下这些寄存器:
) ~" Z) z8 O' f/ A5 @ 首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO/ i0 R. z9 D: J" c
就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可
4 i% a, K* z1 Y" q+ r9 ~ i 以获取到对应 GPIO 的状态(0 或 1)。+ M4 M2 p9 \9 B" }9 `' \- P, b5 e
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应8 R) V* E- }$ \( x
的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。
0 N% w+ K' G6 K6 }0 v+ A5 ?* L, M* q 然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。
& x( k8 @* Q; E* M/ Y 然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存/ T- |1 K3 T' F8 @; \" B5 C
器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:9 }2 e) p+ }; a
00 低电平出发" C8 A) m( \% R9 Q4 g
01 高电平触发
: M) s1 z% c; W, M& K* z% K4 T10 上升沿触发
7 f* `0 I: z5 `+ S% Y- ^+ }* D11 下降沿触发: [4 E' [% C$ t& ?0 e3 V+ {
以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。$ Y' }. R! h) ]" y
然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄5 R* E$ U, v& e- B
存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:
6 h% T) x" e3 Y; r% X00 低电平出发: w: x# ~/ H- ], J* x
01 高电平触发1 O4 E+ }5 r( `0 M' t k' ~% h. {
10 上升沿触发' O+ L- c+ W! J6 l' W! H# a
11 下降沿触发& ~5 P* Y2 a3 r) T6 x
以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。
8 W3 p6 n0 q" }! `# Z% j 然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器6 c% Y9 a9 d% E" ]# \/ Q; J' _; m' G2 Q
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。; {$ v+ t( ?5 t, Z$ G8 X6 w
然后是 GPIOx_ISR 寄存器,如下图所示:
7 U; G4 ~& j3 u2 ]) r( e该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应
8 Q" R: L" Y: Y( g- t 的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须
! R! A5 R1 j# N' d% T* j 要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。
! |9 v9 ^$ f! {5 \" z [7 R 然后是 GPIOx_EDGE_SEL,如下图所示:
- o( B4 ~1 N9 x6 V0 M0 M该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应
2 c5 l+ }0 `, T1 I9 U! k# z3 Z/ b 的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。
1 L' [5 @* ~9 |7 b+ G. d 至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子