6.jpg
' f& Q6 v0 J, C# z+ o y& m
* `) `. H( i% b$ B- W
$ P+ x% `& M/ e/ M. Y' T% l$ t3 ~4 j5 }- |* g& m8 d( m' q
/ _: P( B d) w1 {- c+ o/ v. E从上图可以看到 SW_PAD_CTL_PAD_GPIO1_IO00 寄存器的地址是 0X20E02E8,他也是一个 32 位的寄存器,我
" v0 g) `9 s! ^ b* d2 F k
们可以看到改寄存器按照位划分成了几种功能设置,如下:
+ c1 Y7 O/ I) [7 Q2 _HYS(bit16):用来使能迟滞比较器,当 IO 作为输入功能的时候有效,用于设置输入接收器的施密特触发
9 v$ n: } h- F* D
器是否使能。如果需要对输入波形进行整形的话可以使能此位。此位为 0 的时候禁止迟滞比较器,为 1 的
+ v& N6 y. ?, |# x
时候使能迟滞比较器。PUS(bit15-bit14)用来设置上下拉电阻的。
% ~; u4 s! i0 Q/ Q' E
PUE(bit13)当 IO 作为输入的时候,这个位用来设置 IO 使用上下拉还是状态保持器。状态保持器在 IO 作
% h' ]3 K& d6 c 为输入的时候才有用,当外部电路断电以后此 IO 口可以保持住以前的状态。
+ h( d1 D0 x/ M5 a! V. g
PKE(bit12)用来使能或者禁止上下拉/状态保持器功能。
. F+ T1 g- W/ M/ T7 x
ODE(bit11)IO 作为输出的时候,此位用来禁止或者使能开路输出。
% B- w9 e& K% f$ s Q9 U' D
SPEED(bit7-bit6)当 IO 用作输出的时候,此位用来设置 IO 速度。
! H# s. m% \0 W1 H; ]9 B
DSE(bit5-bit3)当 IO 用作输出的时候用来设置 IO 的驱动能力。
5 w% B# d% e1 i/ t f" X3 t: LSRE(bit0)设置压摆率。
: R' Q6 }7 n m. {0 G: ^
9 93 .3 GPIO 配置 配置
4 z# q& e: u! E! ]' x& |/ n) I/ G 在 9.1 和 9.2 章节我们介绍了这两个寄存器“SW_MUX_CTL_PAD_XX_XX”和“SW_PAD_CTL_PAD_XX_XX”
, M# Y* t. \. H- I/ o |0 f9 O6 Q用来配置 IO 引脚,在本章我们来学习一下 GPIO 功能的配置(GPIO 属于 IO 引脚中的一种复用功能)。比如
% Z/ ~3 x$ O- m5 n
GPIO1_IO00 这个 IO 可以复用为 I2C2_SCL、ENET1_REF_CLK1、GPIO1_IO00、WDOG3_WDOG_B 等 9 种复用功能,
) ?( g6 o7 S. s5 a8 G; {
GPIO1_IO00 只是其中的一种,具体配置成哪种复用功能,需要看下我们的
硬件设计中这个 IO 是作为哪种功
% D8 B5 f: M% K+ l z( a0 [ 能来设计的。如果我们把该引脚用来控制 LED 发光二极管,那我们的程序就要把这个 IO 配置成 GPIO 模式,
. c$ X7 [4 C4 y' A* d/ u) @3 ~ 然后我们还需要对 GPIO 的功能进行配置,我们可以参考手册的第 28 章“General Purpose Input/Output
9 B! `5 J+ }- _) }1 Q (GPIO)”。在该章节我们可以看到 GPIO 的结构如下图所示所示:
在上图中我们可以看到两个地方用红色方框标注了(1、2),其中 1 处里面有两个寄存器,这就是我0 J2 p2 L3 O$ d1 m. M
们 6.2 章节介绍的配置 IO 复用和 IO 功能属性的寄存器。2 处表示当 IO 作为 GPIO 使用的时候,需要配置的
. l8 O; r& h9 z7 X- Q3 V 寄存器(共有 8 个),分别是:GPIO.DR、GPIO.GDIR、GPIO.PSR、GPIO.ICR1、GPIO.ICR2、GPIO.EDGE_SEL、4 G3 w: r7 q4 I
GPIO.IMR、GPIO.ISR,前面 6.2 章节我们介绍了 i.MX6 ULL 一共有 5 组 GPIO,每组 GPIO 分别有这 8 个寄存
: @1 \- v ?( ]+ x+ Y 器,下面我们分别看下这些寄存器:
: C6 h; N- e% s+ _7 b, } 首先是 GPIOx_DR 寄存器,如下图所示:
此寄存器是数据寄存器,32 位,每一位对应一个 GPIO,当 GPIO 配置成输出以后,向对应的位写 1,GPIO
: }; A" B$ F7 ^就会输出高电平,写 0,GPIO 就会输出低电平。如果 GPIO 设置成输入,那读取这个寄存器对应的位,就可7 `/ u' c0 `6 M8 A5 Q4 r" Y7 ]' c
以获取到对应 GPIO 的状态(0 或 1)。. h9 Y7 r8 O# W- j% t* Q- d
然后是 GPIOx_GDIR 寄存器,如下图所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来设置 GPIO 是输入还是输出的。(对应
7 M# z& U( ~1 h8 G3 o/ D1 B 的位设置成 0,对应的 GPIO 设置成输入模式;对应的位设置成 1,对应的 GPIO 就配置成输出模式了)。
/ Y2 Z* u3 G( R' V) |5 c _ 然后是 GPIOx_PSR 寄存器,如图 6.3.4 所示:
该寄存器也是 32 位的,每一位对应一个 GPIO,该寄存器是用来读取对应 GPIO 的状态(高低电平)。4 Z/ h3 G: j+ n q$ X" ^2 O
然后是 GPIOx_ICR1 寄存器,如下图所示:
该寄存器是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置低 16 个 GPIO,此寄存
, {8 I& i6 ^ O6 b+ v 器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:2 Y- }& G' C5 x
00 低电平出发* Q+ p7 @- k* Q: E6 Q2 @" d V
01 高电平触发0 G. \9 e l1 o: c& d7 _" ~
10 上升沿触发3 I! M! }+ j4 o U& [; B7 a0 D
11 下降沿触发5 N9 U4 B1 M7 ~6 T( Z! g; \
以 GPIO1_IO3 为例,如果设置成高电平触发,GPIO1.ICR1=1<<6。4 ~/ q+ T3 i! ~0 @$ _9 S
然后是 GPIOx_ICR2 寄存器,如下图所示:
该寄存器也是中断控制寄存器,每组 GPIO 最多有 32 个 GPIO,该寄存器用来配置高 16 个 GPIO,此寄
( z- D4 e9 k) D/ W: `( B' k 存器是 32 位的,每两位表示一个 GPIO,这两位用来配置中断的触发方式:+ c' S; ]" n0 ?) I
00 低电平出发
+ Z+ U9 [$ U. M2 w( Q01 高电平触发- E6 \: H! ]- Z6 B
10 上升沿触发
. J$ J/ z4 O2 F& t+ ?6 ]. Q( L11 下降沿触发' s. r- b$ c: ^: |
以 GPIO1_IO7 为例,如果设置成高电平触发,GPIO1.ICR1=1<<2。: o! z% h; i+ b
然后是 GPIOx_IMR 寄存器,如下图所示:
该寄存器是中断屏蔽寄存器,每一位对应一个 GPIO,如果使能某个 GPIO 的中断,那么设置这个寄存器3 p* o( k9 E0 M2 e' a% N. S
对应的位为 1 即可。如果禁止某个 GPIO 的中断,那么设置这个寄存器的对应位为 0。
/ H8 }( f7 |- j. a 然后是 GPIOx_ISR 寄存器,如下图所示:
$ L' p* w5 ~5 ?. V( g( }该寄存器是中断状态寄存器,共有 32 位,每位对应一个 gpio,只要某个 GPIO 的中断产生,那么对应
/ M4 r8 P: y# R. k: g7 A ^0 n 的位就会被置 1,我们可以通过读取该寄存器来判断 GPIO 的中断是否产生了。当我们处理完中断后,必须
: }. t6 \" G& G( S4 ` 要清除对应的中断标志位(像该寄存器相应的位写 1,就是清除中断标志位)。/ J r: T; |6 @) F
然后是 GPIOx_EDGE_SEL,如下图所示:
, w( r6 E1 s4 P# }3 O该寄存器用来设置边沿中断,这个寄存器会覆盖 ICR1 和 ICR2 的设置,同样一个 GPIO 对应一位。相应
4 C2 `- v, x6 k U8 a. Q 的位被置 1,那么就相当于设置了对应的 GPIO 是上升沿和下降沿(双边沿)触发。
. o+ r+ Z6 w5 {. Q 至此关于 GPIO 的所有寄存器我们就介绍完了。
其他部分关注:使用迅为IMX6ULL开发板第一个汇编实验(二)更多内容关注公众号:迅为电子