痞子衡嵌入式:再测i.MXRT1060,1170上的普通GPIO与高速GPIO极限翻转频率
大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1060/1170上的普通GPIO与高速GPIO极限翻转频率。
按照上一篇文章 《实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率》 里的测试流程和方法,痞子衡今天带大家再测试下含有 HSGPIO 模块的 i.MXRT1060 和 i.MXRT1170 系列。从芯片整体性能上来说,它们俩都是 i.MXRT1010 的老大哥,但是老大哥未必是方方面面都碾压小老弟的,有时候系统设计越复杂,细节之处反而越难优化。今天我们就来对比看看它们在 GPIO 上的表现:
- Note1: i.MXRT1064 跟 i.MXRT1060 是同一种 Die, GPIO 性能是一致的;i.MXRT1160 和 i.MXRT1170 在 GPIO 上性能也类似。
- Note2: 测量所用示波器型号是 Tektronix MSO5204,带宽 2GHz, 采样率 10GS/s。
一、i.MXRT1060(1064)上的测试
1.1 测试板卡及测试点
选定的板卡是恩智浦官方 MIMXRT1060-EVK,这次我们选了 Arduino J22 接口的 Pin3,即 GPIO_AD_B0_11,这个 PAD 既可以配到普通 GPIO(GPIO1[11]) 也可以配到 HSGPIO(GPIO6[11]),默认外围可选功能电路上的电阻都是 DNP 状态,因此这个 PAD 是悬空的:
1.2 I/O 翻转测试代码
测试工程我们可以直接在 \SDK_2.11.0_EVK-MIMXRT1060\boards\evkmimxrt1060\driver_examples\gpio\led_output 例程上修改,为了尽力展示 GPIO 极限性能,不受其他瓶颈因素干扰,这里选择代码执行性能最高的工程 build(即代码段在 ITCM 里,数据段在 DTCM 里)。I/O 测试代码很简单:
void io_test_init(bool useNormalGpio)
{
gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_11_GPIO1_IO11, 0U);
// Fast Slew Rate, R0/7, 200MHz
IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_11_GPIO1_IO11, 0x10F9U);
if (useNormalGpio)
{
// GPIO1
IOMUXC_GPR->GPR26 &= ~(1u << 11);
GPIO_PinInit(GPIO1, 11, &led_config);
}
else
{
// GPIO6
IOMUXC_GPR->GPR26 |= (1u << 11);
GPIO_PinInit(GPIO6, 11, &led_config);
}
}
void io_test_run(void)
{
io_test_init(false);
while (1)
{
GPIO6->DR_TOGGLE = 0x800;
}
}
1.3 芯片系统时钟配置
《普通GPIO与高速GPIO差异及其用法》 一文里讲了,普通 GPIO 时钟源是 IPG Bus,而 HSGPIO 时钟源是 AHB Bus,因此测试工程里 AHB/IPG 时钟配置会影响最终 I/O 翻转极限频率。下图是 i.MXRT1060 内核结构里的 HSGPIO 通路。
led_output 例程里的默认系统时钟配置,AHB/Core 时钟来自于 PLL1,将这个源配置为 1200 MHz,ARM_PODF 设 1(两分频),AHB_PODF 设 0 (即不分频),IPG Bus 时钟源固定来自于 AHB/Core,且只能在其基础上做 1/2/3/4 分频,我们知道 IPG Bus 最高仅支持 150MHz,因此在这种情况下 IPG_PODF 只能设 3(四分频),最终 AHB 时钟是 600MHz,IPG 时钟是 150MHz,HSGPIO 和 GPIO 访问可以同时得到最优性能(这点设计上是优于 i.MXRT1010 的)。
PPL1, CCM_ANALOG->PLL_ARM[DIV_SELECT] = 100,即 24MHz*DIV_SELECT/2 = 1200MHz
CCM->CACRR[ARM_PODF] = 3'b001,divide by 2
CCM->CBCMR[PRE_PERIPH_CLK_SEL] = 2'b11,derive clock from divided PLL1
CCM->CBCDR[PERIPH_CLK_SEL] = 1'b0,derive clock selected by CCM->CBCMR[PRE_PERIPH_CLK_SEL]
CCM->CBCDR[AHB_PODF] = 3'b000,divide by 1
CCM->CBCDR[IPG_PODF] = 2'b11,divide by 4
1.4 I/O 翻转测试结果
现在我们来看一下测试结果,根据实测结果,我们得到了如下结论:
- 总结1: PAD配置里的运行频率并不限制最终输出翻转频率,实际输出的波形幅值响应表现跟外围电路关系较大。
- 总结2: 置位 GPIO->DR_TOGGLE 寄存器可获得最佳 I/O 翻转性能
- 总结3: 普通 GPIO 翻转频率约是时钟源 IPG Bus 的 1/8,极限翻转频率是 18.69MHz
- 总结4: HSGPIO 翻转频率约是时钟源 AHB Bus 的 1/4,极限翻转频率是 149.24MHz
- 总结5: i.MXRT1060 的 GPIO 性能跟 i.MXRT1010 差不多,但是 HSGPIO 性能比 i.MXRT1010 差很多。
AHB/Core时钟频率 | IPG总线时钟频率 | I/O PAD配置 | I/O翻转方法 | 普通GPIO极限翻转频率 | 高速GPIO极限翻转频率 |
---|---|---|---|---|---|
600MHz | 150MHz | Fast Slew, 200MHz | 异或GPIO->DR | 6.289MHz 标准幅度方波 |
22.99MHz 标准幅度方波 |
600MHz | 150MHz | Fast Slew, 200MHz | 置位GPIO->DR_TOGGLE | 18.69MHz 标准幅度方波 |
149.24MHz 标准幅度正弦波 |
二、i.MXRT1170(1160)上的测试
2.1 测试板卡及测试点
选定的板卡是恩智浦官方 MIMXRT1170-EVK,板卡上连接 LED 灯的是 GPIO_AD_04,翻看芯片参考手册,这个 PAD 既可以配到普通 GPIO(GPIO9[3] 或者 GPIO3[3]) 也可以配到 HSGPIO(CM7_GPIO3[3]),我们就选择这个 PAD 做测试。此外,最终 I/O 输出波形形态跟外围驱动电路也有关联,所以这里也有必要交待清楚:
2.2 I/O 翻转测试代码
测试工程我们可以直接在 \SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\gpio\led_output\cm7 例程上修改,为了尽力展示 GPIO 极限性能,不受其他瓶颈因素干扰,这里选择代码执行性能最高的工程 build(即代码段在 ITCM 里,数据段在 DTCM 里)。I/O 测试代码很简单:
void io_test_init(bool useNormalGpio)
{
gpio_pin_config_t led_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
CLOCK_EnableClock(kCLOCK_Iomuxc);
IOMUXC_SetPinMux(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03, 0U);
if (useNormalGpio)
{
// GPIO3
IOMUXC_GPR->GPR42 &= ~(1u << 3);
GPIO_PinInit(GPIO3, 3, &led_config);
}
else
{
// CM7_GPIO3
IOMUXC_GPR->GPR42 |= (1u << 3);
GPIO_PinInit(CM7_GPIO3, 3, &led_config);
}
}
void io_test_run(void)
{
io_test_init(false);
while (1)
{
CM7_GPIO3->DR_TOGGLE = 0x8;
}
}
特别提醒的是在 i.MXRT1170 IOMUXC 模块 SW_PAD_CTL 控制寄存器里取消了 SPEED 配置,并且 DSE 配置也从 3bit 减少到 1bit,这点跟 i.MXRT1010/1060 上设计不一样:
2.3 芯片系统时钟配置
《普通GPIO与高速GPIO差异及其用法》 一文里讲了,普通 GPIO 时钟源是 IPG Bus(在 i.MXRT1170 里叫 BUS_CLK),而 HSGPIO 时钟源是 AHB Bus(在 i.MXRT1170 里叫 M7_CLK),因此测试工程里 AHB/IPG 时钟配置会影响最终 I/O 翻转极限频率。下图是 i.MXRT1170 内核结构里的 HSGPIO 通路。
- Note1: GPIO1 - 6 时钟源是 BUS_CLK,该总线最高频率 240MHz
- Note2: GPIO7 - 12 时钟源是 BUS_LPSR_CLK,该总线最高频率 160MHz
- Note3: GPIO13 时钟源是 RCOSC_32K
led_output 例程里的默认系统时钟配置,M7_CLK 时钟来自于 ARM_PLL,将这个源配置为 996 MHz。BUS_CLK 时钟来自于 SYS_PLL3,固定 480MHz,BUS_ROOT 配置里做了两分频,最终 M7_CLK 时钟是 996MHz,BUS_CLK 时钟是 240MHz(相较于 i.MXRT1010/1060 的最大 150MHz 有所提升),HSGPIO 和 GPIO 访问可以同时得到最优性能。此外,i.MXRT1170 的系统时钟设计是最灵活也最简单的。
ARM_PLL, 即 24MHz*DIV_SELECT/2/POST_DIV = 996MHz
ANADIG_PLL->ARM_PLL_CTRL[DIV_SELECT] = 166,
ANADIG_PLL->ARM_PLL_CTRL[POST_DIV_SEL] = 2'b00,Divide by 2
// 0 - CLOCK Root M7
CCM->CLOCK_ROOT[0].CONTROL[MUX] = 3'b100,PLL_ARM_CLK
CCM->CLOCK_ROOT[0].CONTROL[DIV] = 8'h00,Divider selected clock by DIV + 1.
SYS_PLL3, ANADIG_PLL->SYS_PLL3_CTRL[SYS_PLL3_GATE] = 1'b0,固定 480MHz
// 2 - CLOCK Root Bus
CCM->CLOCK_ROOT[2].CONTROL[MUX] = 3'b100,SYS_PLL3_CLK
CCM->CLOCK_ROOT[2].CONTROL[DIV] = 8'h01,Divider selected clock by DIV + 1.
2.4 I/O 翻转测试结果
现在我们来看一下测试结果,根据实测结果,我们得到了如下结论:
- 总结1: PAD配置里的运行频率并不限制最终输出翻转频率,实际输出的波形幅值响应表现跟外围电路关系较大。
- 总结2: 置位 GPIO->DR_TOGGLE 寄存器可获得最佳 I/O 翻转性能
- 总结3: 普通 GPIO 翻转频率约是时钟源 BUS_CLK 的 1/14,极限翻转频率是 17.12MHz
- 总结4: HSGPIO 翻转频率约是时钟源 M7_CLK 的 1/7.5,极限翻转频率是 131.4MHz
- 总结5: i.MXRT1170 的 GPIO 性能跟 i.MXRT1010/1060 差不多,但是 HSGPIO 性能比 i.MXRT1060 要稍差一些。
M7_CLK时钟频率 | BUS_CLK时钟频率 | I/O PAD配置 | I/O翻转方法 | 普通GPIO极限翻转频率 | 高速GPIO极限翻转频率 |
---|---|---|---|---|---|
996MHz | 240MHz | N/A | 异或GPIO->DR | 7.058MHz 标准幅度方波 |
41.24MHz 标准幅度方波 |
996MHz | 240MHz | N/A | 置位GPIO->DR_TOGGLE | 17.12MHz 标准幅度方波 |
131.4MHz 减半幅度正弦波 |
至此,i.MXRT1060/1170上的普通GPIO与高速GPIO极限翻转频率痞子衡便介绍完毕了,掌声在哪里~~~
欢迎订阅
文章会同时发布到我的 博客园主页、CSDN主页、知乎主页、微信公众号 平台上。
微信搜索"痞子衡嵌入式"或者扫描下面二维码,就可以在手机上第一时间看了哦。
痞子衡嵌入式:再测i.MXRT1060,1170上的普通GPIO与高速GPIO极限翻转频率的更多相关文章
- 痞子衡嵌入式:利用i.MXRT1060,1010上新增的FlexSPI地址重映射(Remap)功能可安全OTA
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT部分型号上新增的FlexSPI Remap功能. OTA升级设计几乎是每个量产客户都绕不开的话题,产品发布后免不了要做固件( ...
- 痞子衡嵌入式:揭秘i.MXRT1060,1010上串行NOR Flash冗余程序启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1060,1010上串行NOR Flash冗余程序启动设计. 工业产品设计里经常会有冗余程序/备份程序设计的需求,因为在工业 ...
- 痞子衡嵌入式:测一测i.MXRT1170 Raw NAND启动时间(从POR到进App的Reset_Handler)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RT1170 Raw NAND启动时间. 关于i.MXRT1170这颗划时代的MCU,痞子衡去年10月在其刚发布的时候, ...
- 痞子衡嵌入式:记录i.MXRT1060驱动LCD屏显示横向渐变色有亮点问题解决全过程(提问篇)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060上LCD横向渐变色显示出亮点问题的分析解决经验. 痞子衡前段时间在支持一个i.MXRT1060客户项目时遇到了LCD ...
- 痞子衡嵌入式:了解i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT1060系列ROM中串行NOR Flash启动初始化流程优化点. 前段时间痞子衡写了一篇 <深入i.MXRT1050系 ...
- 痞子衡嵌入式:揭秘i.MXRTxxx系列上串行NOR Flash双程序可交替启动设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT500/600上串行NOR Flash双程序可交替启动设计. 在上一篇文章 <i.MXRT1170上串行NOR Fla ...
- 痞子衡嵌入式:自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是自识别特性(Auto Probe)可以让i.MXRT1060无需FDCB也能从NOR Flash启动. 接着上篇文章 <了解i.M ...
- 痞子衡嵌入式:i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010, 1170型号上不一样的SNVS GPR寄存器读写控制设计. 痞子衡之前两篇文章 <在SBL项目实战中妙用i ...
- 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(5)- 再聊eFUSE及其烧写方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的eFUSE. 在i.MXRT启动系列第二篇文章 Boot配置(BOOT Pin, eFUSE) 里痞子 ...
随机推荐
- 从源码分析node-gyp指定node库文件下载地址
当我们安装node的C/C++原生模块时,涉及到使用node-gyp对C/C++原生模块的编译工作(configure.build).这个过程,需要nodejs的头文件以及静态库参与(后续称库文件)对 ...
- css超出隐藏显示省略号怎么设置?
当我们在进行网页前端开发的时候,一般获取文章标题,然后一行一行的显示.但是当标题过长的时候,就会造成换行显示.还有显示部分文本信息时,如果全部显示就过于繁琐,会带来不会的网页体验感.虽然我们可以使用o ...
- ☕【Java技术指南】「编译器专题」深入分析探究“静态编译器”(JAVA\IDEA\ECJ编译器)是否可以实现代码优化?
技术分析 大家都知道Eclipse已经实现了自己的编译器,命名为 Eclipse编译器for Java (ECJ). ECJ 是 Eclipse Compiler for Java 的缩写,是 Jav ...
- 记一次 .NET 某招聘网后端服务 内存暴涨分析
一:背景 1. 讲故事 前段时间有位朋友wx找到我,说他的程序存在内存阶段性暴涨,寻求如何解决,和朋友沟通下来,他的内存平时大概是5G 左右,在某些时点附近会暴涨到 10G+, 画个图大概就是这样. ...
- 题解 Yet Another Number Sequence
题目传送门 Description 给出 \(n,k\) ,求出: \[\sum_{i=1}^{n} f_i·i^k \] 其中 \(f_i\) 表示斐波拉契第 \(i\) 项.\(n\le 10^{ ...
- 题解 「2017 山东一轮集训 Day5」苹果树
题目传送门 题目大意 给出一个 \(n\) 个点的图,每个点都有一个权值 \(f_i\) ,如果 \(f_i=-1\) 表示 \(i\) 这个点是坏的.定义一个点是有用的当且仅当它不是坏的,并且它连的 ...
- L1-017 到底有多二 (15 分) java解题
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String args[]){ 5 doub ...
- JVM详解(四)——运行时数据区-堆
一.堆 1.介绍 Java运行程序对应一个进程,一个进程就对应一个JVM实例.一个JVM实例就有一个运行时数据区(Runtime),Runtime里面,就只有一个堆,一个方法区.这里也阐述了,方法区和 ...
- fpic 和 fPIC
fpic 和 fPIC 区别 Code Gen Options (Using the GNU Compiler Collection (GCC)) 综下所述,生成适用于共享库的位置无关代码(PIC)时 ...
- Excel一对多查找
很多人在Excel中用函数公式做查询的时候,都必然会遇到的一个大问题,那就是一对多的查找/查询公式应该怎么写?大多数人都是从VLOOKUP.INDEX+MATCH中入门的,纵然你把全部的多条件查找方法 ...