嵌入式 - i.MX93的GPIO寄存器解读

有四组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

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值