0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

借助i.MXRT10xx系列INIT_VTOR功能缩短程序热重启时间

恩智浦MCU加油站 来源:未知 2023-09-07 08:50 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

最近痞子衡写了篇文章 《i.MXRT从Serial NAND启动时间测量》,这篇文章详细测试了不同长度的 Non-XIP 程序在不同 NAND 访问速度下由 BootROM 加载启动所需要的时间,比如 240KB 的程序在 60MHz NAND 的访问速度下启动时间接近 30ms,这个启动时间对于有些响应时间敏感的应用(比如汽车电子)来说还是比较长的。

对于Non-XIP 程序,经过冷启动后,其程序体本身已经被加载进芯片内部 SRAM 了,除非发生 POR,否则 SRAM 中的程序会一直保持着。假设程序在恶劣的电磁环境中运行,代码里虽然包含异常复位的处理,但是每次程序复位启动时间还是和冷启动时间一样长(每次都需要 BootROM 搬移加载),有点难以接受。那么对于这种热启动的情况,程序启动时间能够缩短吗?答案是可以的,今天痞子衡就介绍下 i.MXRT 上的 INIT_VTOR 特性:

  • 备注1:本文主角是i.MXRT1050,但内容也基本适用其它i.MXRT10xx系列。

  • 备注2:同样的测试在i.MXRT1160/1170下无效,因为CM7_INIT_VTOR所在的IOMUXC_LPSR_GPR->GPR26在软复位下不能保持。

INIT_VTOR功能简介

在介绍INIT_VTOR 功能之前,大家首先要对 ARM Cortex-M 内核的中断向量表偏移寄存器 SCB->VTOR 功能有所了解,具体可以看痞子衡的旧文 《Cortex-M中断向量表原理及其重定向方法》

简单来说,芯片上电启动后内核都是从 SCB->VTOR 指向的地址处获取程序中断向量表里的第二个向量即所谓的复位函数Reset_Handler。有了复位函数,就找到了程序入口。

;摘取自 startup_MIMXRT1052.s


__vector_table
        DCD     sfe(CSTACK)
        DCD     Reset_Handler


        DCD     NMI_Handler
        DCD     HardFault_Handler
        DCD     MemManage_Handler
        DCD     BusFault_Handler
        DCD     UsageFault_Handler
        ...

对于i.MXRT1050,我们知道芯片上电复位都是执行 BootROM 代码,BootROM 中断向量表固定放在了 0x0020_0000 地址处。那么这个 0x0020_0000 地址是怎么被赋给 SCB->VTOR 寄存器的呢?这就引出了本文主角 IOMUXC_GPR->GPR16[32:7] - CM7_INIT_VTOR 位,这 25bits 的 CM7_INIT_VTOR 值每次复位都会被芯片系统自动加载进 SCB->VTOR[32:7] 中,其默认值即对应 BootROM 中断向量表地址。

wKgaomT5H2aAdRDcAAHCJimzT7I824.png

正如痞子衡旧文 《妙用i.MXRT1xxx里SystemReset不复位的GPR寄存器》 提及的那样,IOMUXC_GPR 寄存器仅在 POR 复位或者整体重新上电时才会被置位,这就意味着我们在应用程序中只需要设置一次 CM7_INIT_VTOR 值,其后不管发生多少次类似NVIC_SystemReset() 的复位,CM7_INIT_VTOR 值都不会改变。

使用INIT_VTOR缩短程序热重启有了上一节的理论基础,我们来做个实验。痞子衡找了一块MIMXRT1050-EVK12(Rev.A)板卡,将其启动设备换成串行 NAND 启动(电阻切换到使能 U33,并将 U33 替换成华邦 W25N01GV)。

然后按照串行 NAND 启动时间测试方法那样修改SDK_2_13_0_EVKB-IMXRT1050oardsevkbimxrt1050demo_appsled_blinkyiar 例程(debug build,即代码在 ITCM 运行,注意修改链接文件中的 m_interrupts_start = 0x00002000),并在SystemInit() 函数里调用如下测试函数,根据是否设置 IOMUXC_GPR->GPR16 寄存器编译出两个不同镜像文件(直接编辑 bin 文件将其均填充至 120KB)。

void set_led_gpio(void)
{
  CLOCK_EnableClock(kCLOCK_Iomuxc);
  gpio_pin_config_t USER_LED_config = {
      .direction = kGPIO_DigitalOutput,
      .outputLogic = 0U,
      .interruptMode = kGPIO_NoIntmode
  };
  GPIO_PinInit(GPIO1, 9U, &USER_LED_config);
  IOMUXC_SetPinMux(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0U); 
  IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, 0x10B0U); 


  SystemCoreClockUpdate();
  GPIO_PinWrite(GPIO1, 9U, 0U);
  SDK_DelayAtLeastUs(5000, SystemCoreClock);
  // 根据是否设置 CM7_INIT_VTOR 分别编译两个不同镜像文件
  // 设置 CM7_INIT_VTOR 指向地址 0x00002000,即用户应用程序中断向量表
  IOMUXC_GPR->GPR16 = (IOMUXC_GPR->GPR16 & (~IOMUXC_GPR_GPR16_CM7_INIT_VTOR_MASK)) | IOMUXC_GPR_GPR16_CM7_INIT_VTOR(0x2000 >> 7);
  NVIC_SystemReset();
  while (1);
}

然后借助 MCUBootUtility 工具将这两个不同镜像文件下载进串行 NAND flash,并测试相应启动时间。这里 Flash 运行速度就选择 60MHz:

wKgaomT5H2aAKAn5AAMJ690cG2E305.png

下面是不设置 IOMUXC_GPR->GPR16 的程序启动时间测试结果,无论是一开始的POR 冷启动还是后面 NVIC_SystemReset() 引起的热启动,启动时间都需要约 18.66ms

wKgaomT5H2eAW0UdAAKPtJnjHj4659.png

下面是设置了 IOMUXC_GPR->GPR16 指向 0x2000 之后的程序启动时间测试结果,只有一开始的 POR 冷启动时间是 18.66ms,后面 NVIC_SystemReset() 引起的热启动时间仅需要约 5.26ms。

wKgaomT5H2eAboIyAAK8a9zvM1Y368.png

上述实验结果证明,设置 IOMUXC_GPR->GPR16 指向应用程序中断向量表之后确实能缩短程序热启动时间。有朋友可能会疑问,设置了从 ITCM 直接热启动后为何还是有 5.26ms 的启动时间?这其实主要是从进入应用程序 Reset_Handler 到执行到测试 GPIO 拉低时的代码所消耗的时间,并且需要注意的是由 BootROM 加载执行的程序默认是在 ROM 配置后的 396MHz 主频下执行的(主频够快,测试代码消耗时间可以忽略不计),而直接复位从ITCM 里执行的程序是在默认主频 12MHz 下执行的(主频较慢,测试代码消耗时间不得不计)。

最后再提一下,除了直接在应用程序里设置 IOMUXC_GPR->GPR16 之外,也可以借助 BootROM 的 DCD 功能来设置,同样可以借助 MCUBootUtility 直接完成(详细步骤可参考《利用i.MXRT1xxx系列ROM集成的DCD功能可轻松配置指定外设》),痞子衡实测是有效的。

wKgaomT5H2eAIOHQAAFKKSIpWPg547.png

翻看i.MXRT1050 参考手册 System Boot 章节,IOMUXC_GPR寄存器地址空间也确实在有效的 DCD 设置范围。

wKgaomT5H2eAPPLeAAH_DYTe6kY727.png

END

更多恩智浦AI-IoT市场和产品信息,邀您同时关注“NXP客栈”微信公众号

wKgaomT5H2eAUoESAABCdkRE230504.jpg      

NXP客栈


恩智浦致力于打造安全的连接和基础设施解决方案,为智慧生活保驾护航。

长按二维码,关注我们

恩智浦MCU加油站


这是由恩智浦官方运营的公众号,着重为您推荐恩智浦MCU的产品信息、开发技巧、教程文档、培训课程等内容。

wKgaomT5H2eAIENNAAATNlPH08Y631.jpg  

长按二维码,关注我们


原文标题:借助i.MXRT10xx系列INIT_VTOR功能缩短程序热重启时间

文章出处:【微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • mcu
    mcu
    +关注

    关注

    147

    文章

    19122

    浏览量

    403659
  • 恩智浦
    +关注

    关注

    14

    文章

    6122

    浏览量

    153876

原文标题:借助i.MXRT10xx系列INIT_VTOR功能缩短程序热重启时间

文章出处:【微信号:NXP_SMART_HARDWARE,微信公众号:恩智浦MCU加油站】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    i.MXRT1173跨界处理器能支持2GB NOR闪存吗?

    does nxp i.MXRT1173 crossover processor can support 2GB NOR flash.If yes what need to be taken
    发表于 04-23 08:25

    PIC32MX5XX/6XX/7XX 32位微控制器:特性、应用与引脚分析

    丰富的功能和卓越的性能,成为众多工程师的首选。本文将深入探讨该系列微控制器的各项特性、应用场景以及引脚分布,为电子工程师在设计过程中提供全面的参考。 文件下载: PIC32MX564F128L-I
    的头像 发表于 04-22 17:00 288次阅读

    探索UPSD325xx系列:多功能嵌入式控制器的技术剖析

    探索UPSD325xx系列:多功能嵌入式控制器的技术剖析 在当今的电子设计领域,嵌入式控制器的性能和功能直接影响着产品的竞争力。UPSD325xx
    的头像 发表于 04-17 15:55 209次阅读

    dsPIC33EPXXXGM3XX/6XX/7XX数字信号控制器:高性能与多功能的完美结合

    Microchip的dsPIC33EPXXXGM3XX/6XX/7XX系列16位数字信号控制器,看看它有哪些独特的特性和优势。 文件下载: DSPIC33EP128GM304T-
    的头像 发表于 04-07 11:05 185次阅读

    93XX66A/B/C系列EEPROM:特性、功能与应用详解

    93XX66A/B/C系列EEPROM:特性、功能与应用详解 在电子工程师的日常设计中,低功耗、非易失性的存储器是不可或缺的组件。Microchip Technology Inc.的93XX
    的头像 发表于 03-30 15:45 137次阅读

    i.MXRT1064无法通过串行连接到MCU Boot Utility怎么解决?

    我有一个使用 i.MXRT1064 的定制板,我正在尝试使用 SDP 串行下载协议连接到程序。MCU Boot Utility 无法连接到启动模式开关 1:0 设置为 01 的芯片。
    发表于 03-10 06:45

    成功案例 I 35% 生产效率提升,罗德与施瓦茨借助 Celsius EC Solver 缩短仿真周期

    我们希望有一款能够直接处理CAD模型的工具,以提升整体生产效率。CelsiusECSolver所展现的功能让我们感到非常惊喜。基于我们的对比分析,该工具无疑是R&S的最佳仿真解决方案
    的头像 发表于 02-27 17:12 1324次阅读
    成功案例 <b class='flag-5'>I</b> 35% 生产效率提升,罗德与施瓦茨<b class='flag-5'>借助</b> Celsius EC Solver <b class='flag-5'>缩短</b><b class='flag-5'>热</b>仿真周期

    深入解析xx555系列精密定时器:功能、应用与设计要点

    深入解析xx555系列精密定时器:功能、应用与设计要点 在电子工程师的工具箱中,定时器是一种至关重要的组件,它广泛应用于各种电子设备中,用于实现精确的时间控制。今天,我们将深入探讨
    的头像 发表于 02-10 15:40 907次阅读

    恩智浦i.MXRT1180的FlexSPI NOR启动连接方式

    最近属于i.MXRT11xx阵营的第二代旗舰i.MXRT1180正式发布了,今天咱们就来介绍它的FlexSPI NOR启动连接方式,在阅读本文前最好把FlexSPI NOR启动连接方式(RT1060)先看完,对i.MXRT1xx
    的头像 发表于 11-08 10:20 6555次阅读
    恩智浦<b class='flag-5'>i.MXRT</b>1180的FlexSPI NOR启动连接方式

    重新配置SCB-&gt;VTOR = 0x08010000后,再次复位,程序异常的原因?

    SysInit / MX_TIM12_Init(); LL_TIM_EnableCounter(TIM12); SetResetBit(); MX_DMA_Init(); MX_I2C2_Init
    发表于 07-22 06:56

    复旦微低功耗mcuFM33A0xx系列代理供应

    FM33A0xx系列 简介: FM33A0xx系列芯片是ARM Cortex-M0内核的32位低功耗MCU芯片,最大可支持512KB FLASH程序
    发表于 06-12 18:03

    实现IAP功能,使用cubeide生成APP程序的bin文件写入Flash之后,无法跳转到APP程序中,为什么?

    实现IAP功能,使用cubeide生成APP程序的bin文件写入Flash之后,无法跳转到APP程序中。 但是使用KEIL编译生成的bin文件写入FLASH之后,可以正常执行。 在检查栈顶地址是否
    发表于 06-09 07:32

    使用cubeide生成APP程序的bin文件写入Flash之后,无法跳转到APP程序中,怎么解决?

    实现IAP功能,使用cubeide生成APP程序的bin文件写入Flash之后,无法跳转到APP程序中。 但是使用KEIL编译生成的bin文件写入FLASH之后,可以正常执行。 在检查栈顶地址是否
    发表于 06-06 08:04

    多个i.MXRT共享一颗Flash启动的方法与实践(下)

    在 《多个i.MXRT共享一颗Flash启动的方法与实践(上)》 一文里痞子衡给大家从理论上介绍一种多 i.MXRT 共享 Flash 启动的方法,但是理论虽好,如果没有经过实践验证切实可行,不过是纸上谈兵,所以今天痞子衡就找了两个 i
    的头像 发表于 06-05 10:04 1289次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗Flash启动的方法与实践(下)

    多个i.MXRT共享一颗Flash启动的方法与实践(上)

    有些客户应用会采用多颗 i.MXRT 芯片设计一主多从的硬件架构(目的不一,或仿多核 MCU 系统、或拓展 GPIO 数量),因为 i.MXRT 片内无非易失性存储器,这时候为整个系统配置合适的启动设备保证每个 i.MXRT
    的头像 发表于 06-05 10:01 1247次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗Flash启动的方法与实践(上)