当前位置:硬件测评 > 批子恒嵌入式:重新测试i.MXRT1060,1170上普通GPIO和高速GPIO的极限翻转频率

批子恒嵌入式:重新测试i.MXRT1060,1170上普通GPIO和高速GPIO的极限翻转频率

  • 发布:2023-10-02 16:07


  大家好,我是皮子恒,一个认真科技的痞子。今天皮子恒给大家介绍一下i.MXRT1060/1170上普通GPIO和高速GPIO的极限翻转频率。

  按照上篇文章《实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率》中的测试流程和方法,皮子恒今天带大家测试一下包含HSGPIO模块的i.MXRT1060和i.MXRT1170系列。从整体芯片性能来看,两者都是i.MXRT1010的老大哥,但老大哥未必在各方面都碾压小弟。有时候系统设计越复杂,细节优化就越困难。今天我们就来对比一下它们在GPIO上的表现:

  • 注1:i.MXRT1064 和 i.MXRT1060 属于同一芯片,GPIO 性能相同; i.MXRT1160 和 i.MXRT1170 也具有类似的 GPIO 性能。
  • 注2:测量所用示波器型号为Tektronix MSO5204,带宽为2GHz,采样率为10GS/s。

1。在 i.MXRT1060 (1064) 上测试

1.1 测试板及测试点

  选用的板卡是NXP官方的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的极致性能,不受其他瓶颈因素的干扰,这里我们选择代码执行性能最高的项目构建(即代码段在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);
    // 快速转换速率,R0/7,200MHz
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_11_GPIO1_IO11, 0x10F9U);
    如果(使用NormalGPIO)
    {
        //GPIO1
        IOMUXC_GPR->GPR26 &= ~(1u << 11);
        GPIO_PinInit(GPIO1, 11, &led_config);
    }
    别的
    {
        //GPIO6
        IOMUXC_GPR->GPR26 |= (1u << 11);
        GPIO_PinInit(GPIO6, 11, &led_config);
    }
}

无效io_test_run(无效)
{
    io_test_init(假);
    而 (1)
    {
        GPIO6->DR_TOGGLE = 0x800;
    }
}

1.3 芯片系统时钟配置

  《普通GPIO与高速GPIO差异及其用法》文中提到,普通GPIO时钟源是IPG总线,而HSGPIO时钟源是AHB总线。因此,测试项目中的AHB/IPG时钟配置将影响最终的I/O翻转极限频率。下图显示了i.MXRT1060核心结构中的HSGPIO通道。

  led_output例程中默认系统时钟配置,AHB/Core时钟来自PLL1,配置该时钟源为1200 MHz,设置ARM_PODF为1(二分频),设置AHB_PODF为0(即不分频) ),IPG总线时钟源固定来自AHB/Core,只能在此基础上进行1/2/3/4分频。我们知道IPG总线最高只支持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,除以2
CCM->CBCMR[PRE_PERIPH_CLK_SEL] = 2'b11,从分频 PLL1 获取时钟
CCM->CBCDR[PERIPH_CLK_SEL] = 1'b0,由 CCM->CBCMR[PRE_PERIPH_CLK_SEL] 选择导出时钟
CCM->CBCDR[AHB_PODF] = 3'b000,除以1
CCM->CBCDR[IPG_PODF] = 2'b11,除以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/核心时钟频率 IPG总线时钟频率 I/O PAD 配置 I/O翻转方式 普通GPIO限制翻转频率 高速GPIO极限翻转频率
600MHz 150MHz 快速转换,200MHz 异或 GPIO->DR 6.289MHz
标准振幅方波
22.99MHz
标准振幅方波
600MHz 150MHz 快速转换,200MHz 设置GPIO->DR_TOGGLE 18.69MHz
标准振幅方波
149.24MHz
标准振幅正弦波

2。在 i.MXRT1170 (1160) 上测试

2.1 测试板及测试点

  选用的板卡是NXP官方的MIMXRT1170-EVK。连接到开发板的 LED 灯是 GPIO_AD_04。看芯片参考手册,这个PAD可以分配给普通GPIO(GPIO9[3]或GPIO3[3]),也可以分配给HSGPIO(CM7_GPIO3[3])。我们选择这个PAD进行测试。

  同时,为了进行比较,额外选择了一个GPIO_AD_01引脚作为测量点2。该PAD可以分配给普通GPIO(GPIO9[0]或GPIO3[0])或HSGPIO(CM7_GPIO3[0]] ),外围电路接近浮空。

  另外,最终的I/O输出波形形状也与外围驱动电路有关,所以这里有必要解释清楚:

2.2 I/O翻转测试代码

  我们可以直接在\SDK_2.11.0_MIMXRT1170-EVK\boards\evkmimxrt1170\driver_examples\gpio\led_output\cm7例程上修改测试项目。为了尽最大努力展示GPIO的终极性能,不受其他瓶颈因素的干扰,这里选择代码以最高性能执行项目构建(即代码段在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);
    IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_04_GPIO_MUX3_IO03, 0x000eU);
    如果(使用NormalGPIO)
    {
        //GPIO3
        IOMUXC_GPR->GPR42 &= ~(1u << 3);
        GPIO_PinInit(GPIO3, 3, &led_config);
    }
    别的
    {
        //CM7_GPIO3
        IOMUXC_GPR->GPR42 |= (1u << 3);
        GPIO_PinInit(CM7_GPIO3, 3, &led_config);
    }
}

无效io_test_run(无效)
{
    io_test_init(假);
    而 (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通道。

  • 注1:GPIO1-6时钟源为BUS_CLK,该总线最大频率为240MHz
  • 注2:GPIO7-12时钟源为BUS_LPSR_CLK,该总线最大频率为160MHz
  • 注3: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,除以 2
// 0 - 时钟根 M7CCM->CLOCK_ROOT[0].CONTROL[MUX] = 3'b100,PLL_ARM_CLK
CCM->CLOCK_ROOT[0].CONTROL[DIV] = 8'h00,分频器通过 DIV + 1 选择时钟。

SYS_PLL3、ANADIG_PLL->SYS_PLL3_CTRL[SYS_PLL3_GATE] = 1'b0,固定 480MHz
// 2 - 时钟根总线
CCM->CLOCK_ROOT[2].CONTROL[MUX] = 3'b100,SYS_PLL3_CLK
CCM->CLOCK_ROOT[2].CONTROL[DIV] = 8'h01,分频器通过 DIV + 1 选择时钟。

2.4 I/O 翻转测试结果

  现在我们来看看测试结果。根据实际测试结果,我们得出以下结论:

  • 总结1:设置GPIO->DR_TOGGLE寄存器以获得最佳I/O切换性能
  • 总结2:普通GPIO翻转频率约为时钟源BUS_CLK的1/14,极限翻转频率为17.12MHz
  • 总结3:HSGPIO翻转频率约为时钟源M7_CLK的1/4,极限翻转频率为248.87MHz
  • 总结4:i.MXRT1170的GPIO性能与i.MXRT1010/1060类似,HSGPIO性能与i.MXRT1010类似。
M7_CLK 时钟频率 BUS_CLK时钟频率 I/O PAD 配置 I/O翻转方式普通GPIO限制翻转频率 高速GPIO极限翻转频率
996MHz 240MHz 快速旋转 异或 GPIO->DR 7.058MHz
标准振幅方波
41.24MHz
标准振幅方波
996MHz 240MHz 快速旋转 设置GPIO->DR_TOGGLE 17.12MHz
标准振幅方波
248.87MHz
1/4振幅正弦波

  至此,皮子恒就给大家介绍了i.MXRT1060/1170上普通GPIO和高速GPIO的极限翻转频率。掌声在哪里~~~

欢迎订阅

文章将同时发布到我的博客园主页、CSDN主页、知乎主页、微信公众号平台。

微信搜索“罞子hengembedded”或扫描下方二维码即可在手机上立即观看。

相关文章