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

    文章

    18605

    浏览量

    386930
  • 恩智浦
    +关注

    关注

    14

    文章

    6051

    浏览量

    134362

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

    最近属于i.MXRT11xx阵营的第二代旗舰i.MXRT1180正式发布了,今天咱们就来介绍它的FlexSPI NOR启动连接方式,在阅读本文前最好把FlexSPI NOR启动连接方式(RT1060)先看完,对i.MXRT1xx
    的头像 发表于 11-08 10:20 5676次阅读
    恩智浦<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 1033次阅读
    多个<b class='flag-5'>i.MXRT</b>共享一颗Flash启动的方法与实践(下)

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

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

    国产电压基准源对标REF34XX/ADR34XX的模拟I/O模块替换方案

    国产电压基准源对标REF34XX/ADR34XX的模拟I/O模块替换方案
    的头像 发表于 04-03 09:49 893次阅读
    国产电压基准源对标REF34<b class='flag-5'>XX</b>/ADR34<b class='flag-5'>XX</b>的模拟<b class='flag-5'>I</b>/O模块替换方案

    RT10XX RC24M开启自动校准功能

    RT10XX系列的时钟源主要由外接24M XTAL, 内部的RC24M,外接32K RTC,内部32K时钟,PLL及其PFD构成。在正式开始介绍自动校准功能前,我们先对RT10XX的时
    的头像 发表于 02-20 10:51 1314次阅读
    RT<b class='flag-5'>10XX</b> RC24M开启自动校准<b class='flag-5'>功能</b>

    CKS32F107xx系列USART的LIN模式

    CKS32F107xx系列在支持正常USART功能的同时,亦支持LIN(局域互联网)模式。
    的头像 发表于 02-18 17:18 872次阅读
    CKS32F107<b class='flag-5'>xx</b><b class='flag-5'>系列</b>USART的LIN模式

    AN166 GD32H7xx系列特性设计指南

    电子发烧友网站提供《AN166 GD32H7xx系列特性设计指南.pdf》资料免费下载
    发表于 01-17 14:38 0次下载
    AN166 GD32H7<b class='flag-5'>xx</b><b class='flag-5'>系列</b><b class='flag-5'>热</b>特性设计指南

    AN-950: 校准基于ADE71xx/ADE75xx系列的单相电表

    电子发烧友网站提供《AN-950: 校准基于ADE71xx/ADE75xx系列的单相电表.pdf》资料免费下载
    发表于 01-13 14:27 0次下载
    AN-950: 校准基于ADE71<b class='flag-5'>xx</b>/ADE75<b class='flag-5'>xx</b><b class='flag-5'>系列</b>的单相电表

    MSP430x5xx和MSP430x6xx系列系列用户指南

    电子发烧友网站提供《MSP430x5xx和MSP430x6xx系列系列用户指南.pdf》资料免费下载
    发表于 12-19 15:32 4次下载
    MSP430x5<b class='flag-5'>xx</b>和MSP430x6<b class='flag-5'>xx</b><b class='flag-5'>系列</b><b class='flag-5'>系列</b>用户指南

    适用于THS14xx和THS56xx DAC系列的THS14xx/5691 EVM

    电子发烧友网站提供《适用于THS14xx和THS56xx DAC系列的THS14xx/5691 EVM.pdf》资料免费下载
    发表于 12-16 10:47 0次下载
    适用于THS14<b class='flag-5'>xx</b>和THS56<b class='flag-5'>xx</b> DAC<b class='flag-5'>系列</b>的THS14<b class='flag-5'>xx</b>/5691 EVM

    MSP430FR4xx和MSP430FR2xx系列用户指南

    电子发烧友网站提供《MSP430FR4xx和MSP430FR2xx系列用户指南.pdf》资料免费下载
    发表于 12-10 13:47 35次下载
    MSP430FR4<b class='flag-5'>xx</b>和MSP430FR2<b class='flag-5'>xx</b><b class='flag-5'>系列</b>用户指南