0
点赞
收藏
分享

微信扫一扫

痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间

律楷粑粑 2022-01-05 阅读 75

痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx的系统中断延迟时间

  在 《Cortex-M系统中断延迟及其测量方法简介》 一文里,痞子衡介绍了 Cortex-M 中断延迟的基本概念及一种用 GPIO 模块来测量中断延迟时间的方法,今天我们就在 i.MXRT1xxx 系列芯片上用这种方法实测一下中断延迟:

一、官方指标

  恩智浦 i.MXRT1xxx 系列目前有很多型号,都是基于 Cortex-M7 内核,主频从 500MHz 到 1GHz 不等。拿该系列第一款型号 i.MXRT1050 来说,在其官方主页可以看到其标称中断延迟时间低至 20ns。

  在 《Cortex-M系统中断延迟》 一文第一小节里我们知道 Cortex-M7 的标准中断延迟是 12 - 14 个内核时钟周期,i.MXRT1050 主频是 600MHz ,理论计算可得 (1s / 600MHz) * 12 = 20ns,所以 i.MXRT1050 上这 20ns 的中断延迟是符合 ARM 标准的。

二、测试代码

  现在我们在芯片上实测一下,痞子衡把i.MXRT1011/1021/1052/1062/1176 这五个型号均测了一遍,测试代码可以基于其各自 SDK 包。

  以 i.MXRT1052 为例,选用 \SDK_2.10.0_EVKB-IMXRT1050\boards\evkbimxrt1050\driver_examples\gpio\input_interrupt 例程为模板(注意选择 debug build,即代码链接在 TCM 里,满足零等待内存的测试需求),按 《Cortex-M系统中断延迟》 一文第二小节设计思想修改主函数如下(关于 GPIO 中断使用可以参考 《以i.MXRT1xxx的GPIO模块为例谈谈中断处理函数(IRQHandler)的标准流程》 一文):

uint32_t s_pin_low  = 0x000000;
uint32_t s_pin_high = 0x800000;


// User Button SW8 - Pin4 in RT1050-EVKB
void GPIO5_Combined_0_15_IRQHandler(void)
{
    GPIO2->DR = s_pin_low;
    GPIO2->DR = s_pin_high;
    GPIO_PortClearInterruptFlags(GPIO5, 1U << 0);
    __DSB();
}

void init_gpio5_0(void)
{
    gpio_pin_config_t din_config = {kGPIO_DigitalInput, 0, kGPIO_IntFallingEdge};       
    IOMUXC_SetPinMux(IOMUXC_SNVS_WAKEUP_GPIO5_IO00, 0U); 
    GPIO_PinInit(GPIO5, 0, &din_config);
    NVIC_EnableIRQ(GPIO5_Combined_0_15_IRQn);
    GPIO_PortEnableInterrupts(GPIO5, 1U << 0);    
}


// Arduino Interface, J24-2 in RT1050-EVKB
void GPIO1_Combined_0_15_IRQHandler(void)
{
    GPIO2->DR = s_pin_low;
    GPIO2->DR = s_pin_high;
    GPIO_PortClearInterruptFlags(GPIO1, 1U << 2);
    __DSB();
}

void GPIO1_INT2_IRQHandler(void)
{
    GPIO2->DR = s_pin_low;
    GPIO2->DR = s_pin_high;
    GPIO_PortClearInterruptFlags(GPIO1, 1U << 2);
    __DSB();
}

void init_gpio1_2(void)
{
    gpio_pin_config_t din_config = {kGPIO_DigitalInput, 0, kGPIO_IntFallingEdge};
    IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_02_GPIO1_IO02, 0U); 
    GPIO_PinInit(GPIO1, 2, &din_config);
    NVIC_EnableIRQ(GPIO1_Combined_0_15_IRQn);
    //NVIC_EnableIRQ(GPIO1_INT2_IRQn);
    GPIO_PortEnableInterrupts(GPIO1, 1U << 2);    
}


// TP26
void init_gpio2_23(void)
{
    gpio_pin_config_t dout_config = {kGPIO_DigitalOutput, 0, kGPIO_NoIntmode};
    IOMUXC_SetPinMux(IOMUXC_GPIO_B1_07_GPIO2_IO23, 0U); 
    IOMUXC_SetPinConfig(IOMUXC_GPIO_B1_07_GPIO2_IO23, 0x70F9U); 
    GPIO_PinInit(GPIO2, 23, &dout_config);
    GPIO2->DR |= 0x800000;
}

int main(void)
{
    BOARD_ConfigMPU();
    BOARD_InitBootClocks();
    CLOCK_EnableClock(kCLOCK_Iomuxc);           
    CLOCK_EnableClock(kCLOCK_IomuxcSnvs);     
    
    init_gpio5_0();
    init_gpio1_2();
    init_gpio2_23();

    while (1);
}

三、测试结果

  现在我们来看 5 个 i.MXRT 型号的详细测试结果,根据测试结果,我们得出如下结论:

3.1 实测i.MXRT1011

系统时钟配置PADGPIOIRQt1t2td中断延迟时钟数
Core: 500MHz
IPG: 125MHz
GPIO_01GPIO1[1]GPIO1_Combined_0_15_IRQn74 - 78ns33ns41 - 45ns20 - 23 cycles
GPIO2[1]GPIO2_Combined_0_15_IRQn
GPIO_SD_05GPIO2[5]

3.2 实测i.MXRT102x

系统时钟配置PADGPIOIRQt1t2td中断延迟时钟数
Core: 500MHz
IPG: 125MHz
GPIO_AD_B0_06GPIO1[6]GPIO1_Combined_0_15_IRQn92 - 96ns64ns28 - 32ns14 - 16 cycles
GPIO1_INT6_IRQn
SNVS_WAKEUPGPIO5[0]GPIO5_Combined_0_15_IRQn

3.3 实测i.MXRT105x

系统时钟配置PADGPIOIRQt1t2td中断延迟时钟数
Core: 600MHz
IPG: 150MHz
GPIO_AD_B0_02GPIO1[2]GPIO1_Combined_0_15_IRQn78 - 82ns54ns24 - 28ns14 - 17 cycles
GPIO1_INT2_IRQn
SNVS_WAKEUPGPIO5[0]GPIO5_Combined_0_15_IRQn

3.4 实测i.MXRT106x

系统时钟配置PADGPIOIRQt1t2td中断延迟时钟数
Core: 600MHz
IPG: 150MHz
GPIO_AD_B0_02GPIO1[2]GPIO1_Combined_0_15_IRQn62 - 66ns27ns35 - 39ns21 - 24 cycles
GPIO1_INT2_IRQn
GPIO6[2]GPIO6_7_8_9_IRQn
SNVS_WAKEUPGPIO5[0]GPIO5_Combined_0_15_IRQn

3.5 实测i.MXRT117x

系统时钟配置PADGPIOIRQt1t2td中断延迟时钟数
Core: 996MHz
BUS: 240MHz
GPIO_AD_01GPIO2[31]GPIO2_Combined_16_31_IRQn52 - 54ns29ns23 - 25ns23 - 25 cycles
CM7_GPIO2[31]CM7_GPIO2_3_IRQn
WAKEUP_DIGGPIO13[0]GPIO13_Combined_0_31_IRQn47 - 50ns18 - 21ns18 - 21 cycles

 

举报

相关推荐

0 条评论