野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7546|回复: 7

一站式启动配套工具NXP-MCUBootUtility全新v2.0.0,RT1011/RT117x/RT5xx/RT6xx来助阵

[复制链接]
发表于 2019-7-19 15:41:41 | 显示全部楼层 |阅读模式
不知道这个工具的朋友先看下之前发过的帖子
一站式启动配套工具NXP-MCUBootUtility v1.0.0正式发布
一站式启动配套工具NXP-MCUBootUtility已更新到v1.2.0,可生成.sb文件
一站式启动配套工具NXP-MCUBootUtility已更新到v1.4.0,支持SD/eMMC卡

目前这个工具最新版本是 v2.0.0,更新记录如下:
注:RT系列分为2大阵营,三位数字为Cortex-M33内核(即RTxxx),四位数字为Cortex-M7内核(即RTyyyy)

【v2.0.0】
特性:
  1. 支持i.MXRT5xx A0, i.MXRT6xx A0
  2. 支持i.MXRT1011, i.MXRT117x A0
  3. [RTyyyy] 支持基于OTFAD实现的安全加密启动(唯一SNVS key,用户自定义key)
  4. [RTxxx] 支持UART和USB-HID两种串行编程方式(COM端口/USB设备自动识别)
  5. [RTxxx] 支持将裸源image文件自动转换成i.MXRT能启动的Bootable image
  6. [RTxxx] 用户输入的源程序文件可以包含i.MXRT启动头 (FDCB)
  7. [RTxxx] 支持下载Bootable image进主动启动设备 - FlexSPI/QuadSPI NOR接口Flash
  8. [RTxxx] 支持用于开发阶段的非安全加密启动(未签名,CRC校验)
  9. 在通用Flash编程器模式下增加执行(跳转)操作
  10. [RTyyyy] 支持在device status里显示当前FlexRAM配置情况
改进:
  1. [RTyyyy] 提高i.MXRT105x目标板USB连接稳定性
  2. 通用Flash编程器里也支持读写RAM
  3. [RTyyyy] 提供Flashloader执行空间选项以适应不同的FlexRAM配置
缺陷修复:
  1. [RTyyyy] 有时候生成证书时会提示bat文件无法找到,导致证书无法生成
  2. [RTyyyy] 可视化方式去编辑混合eFuse区域并没有生效
  3. [RTyyyy] 无法支持32MB及以上容量的LPSPI NOR/EEPROM设备
  4. 在通用Flash编程器模式下无法擦除/读取外部启动设备的最后两个Page

NXP-MCUBootUtility_v2.0.0.PNG

下载地址: https://github.com/JayHeng/NXP-MCUBootUtility/releases



回复

使用道具 举报

发表于 2019-7-19 19:51:12 | 显示全部楼层
回复

使用道具 举报

发表于 2019-7-25 22:36:46 | 显示全部楼层
谁能提供一下其他地方的下载链接呀?我从github上没有下载成功过一次东西
回复 支持 反对

使用道具 举报

发表于 2019-9-24 10:31:37 | 显示全部楼层
你好,请问有没有rt系列内置的rom_loader的具体资料?或者手册类似的东西
回复 支持 反对

使用道具 举报

发表于 2019-9-26 09:01:08 | 显示全部楼层
生成裸程序时出现 “该程序起始链接地址时无效的” 的提示,是什么原因?程序的链接map如图


Capture.PNG
回复 支持 反对

使用道具 举报

发表于 2019-9-26 09:10:21 | 显示全部楼层
即使增加了IVT部分也不行
Capture.PNG
回复 支持 反对

使用道具 举报

发表于 2019-9-26 18:05:47 | 显示全部楼层
[mw_shl_code=c,true]/* Entry Point */
ENTRY(Reset_Handler)

HEAP_SIZE  = DEFINED(__heap_size__)  ? __heap_size__  : 0x0400;
STACK_SIZE = DEFINED(__stack_size__) ? __stack_size__ : 0x0400;

/* Specify the memory areas */
MEMORY
{
  m_flash_config        (RX)  : ORIGIN = 0x60000000, LENGTH = 0x00001000
  m_ivt                 (RX)  : ORIGIN = 0x60001000, LENGTH = 0x00001000
  m_interrupts          (RX)  : ORIGIN = 0x60002000, LENGTH = 0x00000400
  m_text                (RX)  : ORIGIN = 0x60002400, LENGTH = 0x00040000
  m_itcm                                (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00020000
  m_dtcm                (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00020000
  m_ocram               (RW)  : ORIGIN = 0x20200000, LENGTH = 0x00040000
  m_sdram                                (RW)  : ORIGIN = 0x80000000, LENGTH = 0x00A00000
  m_sdram_ncache                 (RW)  : ORIGIN = 0x80A00000, LENGTH = 0x00600000
}

/* Define output sections */
SECTIONS
{
  .flash_config :
  {
    . = ALIGN(4);
    __FLASH_BASE = .;
    KEEP(* (.boot_hdr.conf))     /* flash config section */
    . = ALIGN(4);
  } > m_flash_config

  ivt_begin= ORIGIN(m_flash_config) + LENGTH(m_flash_config);

  .ivt : AT(ivt_begin)
  {
    . = ALIGN(4);
        KEEP(* (.boot_hdr.ivt))           /* ivt section */
        KEEP(* (.boot_hdr.boot_data))     /* boot section */
        KEEP(* (.boot_hdr.dcd_data))      /* dcd section */
    . = ALIGN(4);
  } > m_ivt

  /* The startup code goes first into internal RAM */
  __flash_vector = ORIGIN(m_interrupts);
  .interrupts : AT(__flash_vector)
  {
          . = 0x00002000;
    __VECTOR_TABLE = .;
    . = ALIGN(4);
    KEEP(*(.isr_vector))     /* Startup code */
    . = ALIGN(4);
  } > m_itcm

/*   __VECTOR_RAM = __VECTOR_TABLE;*/
/*   __RAM_VECTOR_TABLE_SIZE_BYTES = 0x0;*/

  . = ALIGN(4);
  __flash_text = .;
  /* The program code and other data goes into internal RAM */
  .text : AT(__flash_text)
  {
    . = ALIGN(4);
    *(.text)                 /* .text sections (code) */
    *(.text*)                /* .text* sections (code) */
    *(.rodata)               /* .rodata sections (constants, strings, etc.) */
    *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */
    *(.glue_7)               /* glue arm to thumb code */
    *(.glue_7t)              /* glue thumb to arm code */
    *(.eh_frame)
    KEEP (*(.init))
    KEEP (*(.fini))
    . = ALIGN(4);

    /* section information for finsh shell */
    . = ALIGN(4);
    __fsymtab_start = .;
    KEEP(*(FSymTab))
    __fsymtab_end = .;
    . = ALIGN(4);
    __vsymtab_start = .;
    KEEP(*(VSymTab))
    __vsymtab_end = .;
    . = ALIGN(4);

    /* section information for initial. */
    . = ALIGN(4);
    __rt_init_start = .;
    KEEP(*(SORT(.rti_fn*)))
    __rt_init_end = .;
  } > m_itcm

  . = ALIGN(4);
  __flash_arm_extab = .;
  .ARM.extab : AT(__flash_arm_extab)
  {
    *(.ARM.extab* .gnu.linkonce.armextab.*)
  } > m_itcm

  . = ALIGN(4);
  __flash_arm = .;
  .ARM : AT(__flash_arm)
  {
    __exidx_start = .;
    *(.ARM.exidx*)
    __exidx_end = .;
  } > m_itcm
  
  . = ALIGN(4);
  __flash_ctors = .;
.ctors : AT(__flash_ctors)
  {
    __CTOR_LIST__ = .;
        __ctors_start__ = .;
    /* gcc uses crtbegin.o to find the start of
       the constructors, so we make sure it is
       first.  Because this is a wildcard, it
       doesn't matter if the user does not
       actually link against crtbegin.o; the
       linker won't look for a file to match a
       wildcard.  The wildcard also means that it
       doesn't matter which directory crtbegin.o
       is in.  */
    KEEP (*crtbegin.o(.ctors))
    KEEP (*crtbegin?.o(.ctors))
    /* We don't want to include the .ctor section from
       from the crtend.o file until after the sorted ctors.
       The .ctor section from the crtend file contains the
       end of ctors marker and it must be last */
    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors))
    KEEP (*(SORT(.ctors.*)))
    KEEP (*(.ctors))
    __CTOR_END__ = .;
        __ctors_end__ = .;
  } > m_itcm

  
  . = ALIGN(4);
  __flash_dtors = .;
  .dtors : AT(__flash_dtors)
  {
    __DTOR_LIST__ = .;
    KEEP (*crtbegin.o(.dtors))
    KEEP (*crtbegin?.o(.dtors))
    KEEP (*(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors))
    KEEP (*(SORT(.dtors.*)))
    KEEP (*(.dtors))
    __DTOR_END__ = .;
  } > m_itcm


  __flash_preinit = .;
  .preinit_array : AT(__flash_preinit)
  {
    PROVIDE_HIDDEN (__preinit_array_start = .);
    KEEP (*(.preinit_array*))
    PROVIDE_HIDDEN (__preinit_array_end = .);
  } > m_itcm


  __flash_init = .;
  .init_array : AT(__flash_init)
  {
    PROVIDE_HIDDEN (__init_array_start = .);
    KEEP (*(SORT(.init_array.*)))
    KEEP (*(.init_array*))
    PROVIDE_HIDDEN (__init_array_end = .);
  } > m_itcm


  __flash_fini = .;
  .fini_array : AT(__flash_fini)
  {
    PROVIDE_HIDDEN (__fini_array_start = .);
    KEEP (*(SORT(.fini_array.*)))
    KEEP (*(.fini_array*))
    PROVIDE_HIDDEN (__fini_array_end = .);
  } > m_itcm

  PROVIDE(__flash_text_end = ORIGIN(m_dtcm) + LENGTH(m_dtcm));
  __etext = .;    /* define a global symbol at end of code */
  __DATA_ROM = .; /* Symbol is used by startup for data initialization */

  .data : AT(__DATA_ROM)
  {
    . = ALIGN(4);
    __DATA_RAM = .;
    __data_start__ = .;      /* create a global symbol at data start */
    *(m_usb_dma_init_data)
    *(.data)                 /* .data sections */
    *(.data*)                /* .data* sections */
    KEEP(*(.jcr*))
    . = ALIGN(4);
    __data_end__ = .;        /* define a global symbol at data end */
  } > m_dtcm

  __NDATA_ROM = __DATA_ROM + (__data_end__ - __data_start__);
  .ncache.init : AT(__NDATA_ROM)
  {
    __noncachedata_start__ = .;   /* create a global symbol at ncache data start */
    *(NonCacheable.init)
    . = ALIGN(4);
    __noncachedata_init_end__ = .;   /* create a global symbol at initialized ncache data end */
  } > m_sdram_ncache
  . = __noncachedata_init_end__;
  .ncache (NOLOAD) :
  {
    *(NonCacheable)
    . = ALIGN(4);
    __noncachedata_end__ = .;     /* define a global symbol at ncache data end */
  } > m_sdram_ncache

  __DATA_END = __NDATA_ROM + (__noncachedata_init_end__ - __noncachedata_start__);
  text_end = ORIGIN(m_itcm) + LENGTH(m_itcm);
  ASSERT(__DATA_END <= text_end, "region m_text overflowed with text and data")

  /* Uninitialized data section */
  .bss :
  {
    /* This is used by the startup in order to initialize the .bss section */
    . = ALIGN(4);
    __START_BSS = .;
    __bss_start__ = .;
    *(m_usb_dma_noninit_data)
    *(.bss)
    *(.bss*)
    *(COMMON)
    . = ALIGN(4);
    __bss_end__ = .;
    __END_BSS = .;
  } > m_dtcm

  .heap :
  {
    . = ALIGN(8);
    __end__ = .;
    PROVIDE(end = .);
    __HeapBase = .;
    . += HEAP_SIZE;
    __HeapLimit = .;
    __heap_limit = .; /* Add for _sbrk */
  } > m_dtcm

  .stack :
  {
    . = ALIGN(8);
    stack_start = .;
    . += STACK_SIZE;
    stack_end = .;
    __StackTop = .;
  } > m_dtcm
  
  .RTT_HEAP :
  {
    heap_start = .;
    . = ALIGN(8);
  } > m_dtcm

  PROVIDE(heap_end = ORIGIN(m_dtcm) + LENGTH(m_dtcm));

  /* Initializes stack on the end of block */
  __StackLimit = __StackTop - STACK_SIZE;
  PROVIDE(__stack = __StackTop);

  .ARM.attributes 0 : { *(.ARM.attributes) }

  ASSERT(__StackLimit >= __HeapLimit, "region m_data overflowed with stack and heap")
}[/mw_shl_code]
如果我需要把程序下到FlexSPI Nor里,然后拷贝到itcm里运行,链接脚本应该如何写,
上面是我的链接脚本,但是这个工具每次打开编译好的axf文件都说“ 起始链接地址是无效的”
回复 支持 反对

使用道具 举报

发表于 2019-9-27 06:45:43 | 显示全部楼层
搞定了,链接文件写的问题
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-4-19 16:31 , Processed in 0.049379 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表