有四组GPIO,gpio1 ~ gpio4,每组32个端子,序号从0~31。例如,GPIO1_IO00 ~ GPIO1_IO31。
表示GPIO状态时,一组寄存器的32个端子用32bit表示,正好四个字节。
每组GPIO都有各自的寄存器,基地址空间不同,但其布局和偏移是一致的。
1,偏移0x54寄存器PDDR用来设置整组GPIO的输入输出方向,1表示输出,0表示输入。
reset后值为0。
2,偏移0x50寄存器PDIR用来读取整组GPIO的输入电平,1表示高电平(Logic 1),0表示低电平(Logic 0)。
reset后值为0。
3,偏移0x40寄存器PDOR用来设置整组GPIO的输出电平,1表示高电平(Logic 1),0表示低电平(Logic 0)。
reset后值为0。
4,偏移0x44,0x48,0x4C寄存器(PSOR, PCOR, PTOR)用来对整组GPIO或部分GPIO进行操作,避免影响其他不需要操作的GPIO。
0x44设置高电平(set),0x48设置低电平(clear),0x4C反转电平(toggle)。
对需要操作的GPIO,相应的bit位写入1,表示需要操作。
5,偏移0x58寄存器PIDR用来设置整组GPIO的输入功能是否关闭。1表示禁止输入功能的digital function,0表示输入功能可用。
reset后值为0。
6,偏移0x60 ~ 0x7F(P0DR ~ P31DR),每个字节表示单独pin编号的数据,32个字节表示32个pin编号。
读取相应编号对应地址的字节,相当于读取PDIR的相应编号的数据位,值为1表示高电平,值为0表示低电平。
写入相应编号对应地址的字节,相当与设置PDOR的相应编号的数据位,值为1表示高电平,值为0表示低电平。
如果没有实现的pin,或者其设置的功能不是digital function,则读取值为0。
使用字节形式来操作相应编号pin的状态,也不会影响其他pin,只不过效率低一些。
7,偏移0x80 ~ 0xFC的寄存器(ICR0 ~ ICR31),32个单位,每个单位4字节,用来设置相应编号pin的中断,Interrupt Control:ICR0 ~ ICR31。
-
中断状态位,用来读取是否检测到中断,1 - detected, 0 - Not detected。写入1表示clear the flag,写入0无效。
中断配置在所有的数字pin复用模式中都可用。和后面的ISFR0、ISFR1功能一样,若清除ISFR0或1,则此位也被清除。
如果相应pin用来作为DMA请求,在数据传输完成后会自动清除此标志。其他情况下,此标志位将维持logic 1,直到写入1来执行清除操作。
如果是高低电平触发的中断,执行清除操作后,电平没有发生变化,则此标志位会被立刻再设置。
-
锁定位:1表示锁定,0表示不锁定。锁定此中断配置寄存器的0~23bit,直到系统复位才能更新锁定区数据。reset后值位0。
-
中断源选择:
-
0 - 选择此GPIO组可用中断通道的序号0 (可作为中断或用于DMA请求源)
-
1 - 选择此GPIO组可用中断通道的序号1 (可作为中断或用于DMA请求源)
-
-
中断模式设置:
-
0000 - 中断功能disable
-
0001 - 上升沿触发中断标志位或DMA请求
-
0010 - 下降沿触发中断标志位或DMA请求
-
0011 - 上升或下降沿都触发中断标志位或DMA请求
-
0100 - 保留
-
0101 - 上升沿触发中断标志位
-
0110 - 下降沿触发中断标志位
-
0111 - 上升或下降沿都触发中断标志位
-
1000 - 逻辑0的电平触发中断标志位和中断事件
-
1001 - 上升沿触发中断标志位和中断事件
-
1010 - 下降沿触发中断标志位和中断事件
-
1011 - 上升或下降沿都触发中断标志位和中断事件
-
1100 - 逻辑1的电平触发中断标志位和中断事件
-
1101 - Reserved 保留
-
1110 - Reserved 保留
-
1111 - Reserved 保留
-
8,偏移0x100的寄存器,GICLR, 用来设置0~15的pin编号的中断控制寄存器ICR。
16~31bit是用来设置中断控制寄存器CIR的高16位数据。0~15bit用来指定需要设置的pin编号。
可以用来批量修改ICR寄存器,不用单独访问ICR寄存器,通过统一的间接方式设置ICR寄存器内容,更加方便。
每个pin编号的ICR寄存器,只有高16位数据是有效,低16位数据是没用的。
9,偏移0x104的寄存器,GICHR, 用来设置16~31的pin编号的中断控制寄存器ICR。
注意GICLR和GICHR这两个寄存器,只支持32位的写入操作,如果是8位或16位的写入操作会忽略。
10, 偏移120和124的寄存器,ISFR0-ISFR1。用来表示中断源0和中断源1的中断状态标志位。4个字节,每位表示相应标号pin的中断标志位。
读取数值来判断中断是否被检测到,写入则会清除中断触发标志。
清除ICR中的中断标志位,也会自动清除ISFR的标志位,清除操作是互相的。
使用这两个寄存器,可以方便的统一管理所有的中断状态位,而不用使用不同的寄存器ICR0~ICR31。
注意:
1,虽然四组GPIO,有128个pin编号,但不要使用芯片中不存在的GPIO编号。为了降低功耗,这些unbonded的pin,默认情况下设置为Disable state。
2,直接使用寄存器操作,尤其是整组的GPIO状态,要注意互斥,否则会出现难以调查的问题。不容易复现,不知道原因,别问我是怎么知道的。
3,上述寄存器都是32位寄存器,读取和写入时,也要使用32位数据。
参考:
i.MX93 reference manual PDF