i.MX RT1052 GPIO 寄存器操作

关键字 :GPIO寄存器NXP
一、前言

上一篇文里面讲解了 i.MX RT1052 GPIO 的寄存器的配置,这一次就来看看如何实际操作它实现一些基本的功能。仍然是以 GPIO_AD_B0_02 为例,先操作一个翻转 IO。步骤如下。

  • 使能时钟
  • 配置 IOMUX
  • 配置 GPIO
  • 翻转 GPIO

 
二、实际操作

1、定义 IOMUXC 相关寄存器指针

首先在数据手册找到 GPIO_AD_B0_02 这个 IO 的 IOMUX 寄存器地址。首先是 MUX 的。

将其用宏定义的方式定义成指针。方便后续操作。

#define IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_02 *((volatile uint32_t *)0x401F80C4U)

然后是 Pad Settings 的。

同样将其用宏定义的方式定义成指针。

#define IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_02 *((volatile uint32_t *)0x401F82B4U)

2、使能 GPIO 和 IOMUXC 时钟

另外在配置的时候,需要先打开 GPIO1 和 IOMUXC 的时钟,所以把这两个相关时钟寄存器也定义成为指针。

GPIO1 的时钟,由下面 CCM_CCGR1 的第 26、27 位控制

#define CCM_CCGR1 *((volatile uint32_t *)0x400FC06CU)

IOMUXC 的时钟,由下面 CCM_CCGR4 的第 2、3 位控制

#define CCM_CCGR4 *((volatile uint32_t *)0x400FC078U)

寄存器关于这两位控制相应时钟的描述如下。


00 代表关闭,01 代表使能,但是 RT1052 处于 WAIT、STOP 模式的时候关闭,10 无效,11 代表使能,但是 RT1052 处于 STOP 模式的时候关闭。

在这次操作中,只需让 GPIO1 和 IOMUXC 的时钟都处于 01 这种使能状态就好。

代码如下。

CCM_CCGR4 &= ~(3<<2);  // 使能之前先清零寄存器相应的两位

CCM_CCGR1 |= (1<<2); // 打开 GPIO1 时钟

CCM_CCGR1 &= ~(3<<26); // 使能之前先清零寄存器相应的两位

CCM_CCGR1 |= (1<<26); // 打开 IOMUXC 时钟

3、配置 IOMUXC

先配置 MUX,即前面定义成指针的 GPIO_AD_B0_02 的 MUX 这个寄存器

IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_02

这个主要配置引脚复用和 SION,SION 这个不需要,直接配成 0 即可。

复用为普通 GPIO 就选 ALT5。

IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_02 = 0x05;

再配置 PadSettings

在上一篇文章中,已经详细介绍过这个寄存器每一位的作用,这里不再做展开讲解。这里我们用作普通 IO 口,配置如下。

配置

说明

0

SRE

0

用作 GPIO,压摆率快慢都可以满足,这里选择慢的压摆率

2-1

-

0

 

5-3

DSE

110

外面硬件电路有加电阻,所以这里的也是可以任选一档即可,这里选 6,串联电阻的阻值为 43 欧姆

7-6

SPEED

10

简单翻转 IO,不用太高的频率,设定 100M-150M

10-8

-

0

 

11

ODE

0

不开漏,选 0,不使能

12

PKE

0

不使能上下拉和保持器,因为 IO 口处于输出模式上下拉和保持器都失效

13

PUE

0

IO 口处于输出模式,失效,默认 0 即可

15-14

PUS

0

IO 口处于输出模式,失效,默认 0 即可

16

HYS

0

IO 处于输出模式,这个主要处理输入的,所以默认 0 即可

31-17

-

0

 


可以得到。

IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_02 = 0x000B0;

 

4、配置 GPIO

接下来配置 GPIO,要做的也很简单,把 IO 口方向配置成输出,不中断即可。具体的寄存器介绍也在上一篇文章有介绍了,配置 IO 中断的寄存器是 IMR,配置 IO 输入输出方向的寄存器是 GDIR。

GPIO1->IMR &= ~(1<<2);
GPIO1->GDIR &= ~(1<<2);
GPIO1->GDIR |= (1<<2);

5、翻转 IO

然后就可以在循环里面直接翻转 IO 口了,翻转 IO 用的是 DR_TOGGLE 这个寄存器。

for(i=0;i<3000000;i++);
GPIO1->DR_TOGGLE |= (1<<2);

6、抓取实际波形

然后用逻辑分析仪抓出来的波形如下。




三、总结

这一次结合上一篇文章介绍的关于 GPIO 配置的寄存器实际操作了一下,翻转了 GPIO。有需要配置 GPIO 做其他用途的,根据需要设置寄存器即可。参考的资料是 RT1052 的数据手册,代码参考 RT1052 的 SDK,可以自行到 NXP 的官网进行下载,NXP 官网链接放在下面参考资料中。代码也放在参考资料中。


四、参考资料


1、官网链接:https://www.nxp.com.cn/
2、参考代码:

#define IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_02 *((volatile uint32_t *)0x401F80C4U)
#define IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_02 *((volatile uint32_t *)0x401F82B4U)

#define CCM_CCGR1 *((volatile uint32_t *)0x400FC06CU)
#define CCM_CCGR4 *((volatile uint32_t *)0x400FC078U)

volatile uint32_t i=0;
int main(void)
{
BOARD_ConfigMPU();
BOARD_InitBootClocks();

// 使能 IOMUXC 时钟
CCM_CCGR4 &= ~(3<<2);
CCM_CCGR1 |= (1<<2);
IOMUXC_SW_MUX_CTL_PAD_GPIO_AD_B0_02 = 0x05;
IOMUXC_SW_PAD_CTL_PAD_GPIO_AD_B0_02 = 0x000B0;

// 使能 GPIO1 时钟
CCM_CCGR1 &= ~(3<<26);
CCM_CCGR1 |= (1<<26);
// 不使能中断
GPIO1->IMR &= ~(1<<2);
// 配置为输出
GPIO1->GDIR &= ~(1<<2);
GPIO1->GDIR |= (1<<2);

while (1)
{
for(i=0;i<3000000;i++);
// 写 GPIO 翻转寄存器
GPIO1->DR_TOGGLE |= (1<<2);
}
}

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论