上一篇文里面讲解了 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);
}
}
评论