This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] RM46L852:从 CAN 引导加载程序引导主应用程序会导致预取入口系统中断

Guru**** 2391415 points
Other Parts Discussed in Thread: UNIFLASH, HALCOGEN

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1218850/rm46l852-booting-main-application-from-can-bootloader-results-in-prefetchentry-system-interrupt

器件型号:RM46L852
主题中讨论的其他器件:UNIFLASHHALCOGEN

我正在实施引导加载程序、以通过 CAN 更新 RM46。 我已根据项目确定 TI 提供的示例 CAN 引导加载程序、已经相当成功。  现在我处于成功将接收到的映像写入闪存的阶段、我正在尝试引导至映像。 但是、当我执行此操作时、会受到预取系统中断(地址0x1002C)的影响。

一些背景信息:

  • 引导加载程序启用了 ECC (RAM)、但我目前为主应用程序禁用了 ECC (RAM 和闪存)。
  • 主应用程序是 与 CCS 编程时工作的现有应用程序
    • 我没有在 CCS 中启用自动 ECC 生成功能
    • I 仅擦除必要扇区(用于程序加载)
  • 当我通过 Uniflash 加载引导加载程序和主应用程序时、我无法引导主应用程序(强制启动到应用程序)
  • 我已经调整了主应用程序的链接器文件、以指向我认为是正确位置的内容。
  • 我让引导加载程序的 sys_intvecs.asm 重定向至闪存中主应用程序的矢量位置。

下面您将找到两个链接器文件的副本、并附有 HALCoGen 项目文件。

主应用链接器 cmd 文件:

/*----------------------------------------------------------------------------*/
/* sys_link.cmd                                                               */
/*                                                                            */
/*
* Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com
*
*
*  Redistribution and use in source and binary forms, with or without
*  modification, are permitted provided that the following conditions
*  are met:
*
*    Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*
*    Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the
*    distribution.
*
*    Neither the name of Texas Instruments Incorporated nor the names of
*    its contributors may be used to endorse or promote products derived
*    from this software without specific prior written permission.
*
*  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
*  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
*  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
*  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
*  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
*  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
*  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
*  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
*  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
*  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
*  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/

/*                                                                            */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN (0) */
/* USER CODE END */


/*----------------------------------------------------------------------------*/
/* Linker Settings                                                            */

--retain="*(.intvecs)"

/* USER CODE BEGIN (1) */
/* IGNORE the generated Memory code, overridden below */
#if 0
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Memory Map                                                                 */

MEMORY
{
    VECTORS (X)  : origin=0x00000000 length=0x00000020
    FLASH0  (RX) : origin=0x00000020 length=0x0013FFE0
    STACKS  (RW) : origin=0x08000000 length=0x00005800
    RAM     (RW) : origin=0x08005800 length=0x0002a800

/* USER CODE BEGIN (2) */
#endif
/* Override Memory Segments with CRC here */
#if 1
MEMORY
{
    VECTORS (X)  : origin=0x00010020
                   length=0x00000020
                   vfill = 0xffffffff

    CRCMEM  (RX) : origin=end(VECTORS)
                   length=0x000001E0
                   vfill = 0xffffffff

    FLASH0  (RX) : origin=end(CRCMEM)
                   length=(0x0013FFFF - end(CRCMEM))
                   vfill = 0xffffffff

    STACKS  (RW) : origin=0x08000000
                   length=0x00004c00

    RAM     (RW) : origin=0x08004c00
                   length=0x0002b400
#endif
#if 1
    ECC_VEC  (R) : origin=(0xf0400000 + (start(VECTORS) >> 3))
                   length=(size(VECTORS) >> 3)
                   ECC={algorithm=algoL2R4F021, input_range=VECTORS}

    ECC_CRC  (R) : origin=(0xf0400000 + (start(CRCMEM)  >> 3))
                   length=(size(CRCMEM)  >> 3)
                   ECC={algorithm=algoL2R4F021, input_range=CRCMEM }

    ECC_FLA0 (R) : origin=(0xf0400000 + (start(FLASH0)  >> 3))
                   length=(size(FLASH0)  >> 3)
                   ECC={algorithm=algoL2R4F021, input_range=FLASH0 }
#endif
/* USER CODE END */
}

/* USER CODE BEGIN (3) */
/* IGNORE the generated Sections code, overridden below */
ECC
{
    algoL2R4F021 : address_mask = 0xfffffff8 /* Address Bits 31:3 */
                   hamming_mask = R4         /* Use R4/R5 build in Mask */
                   parity_mask  = 0x0c       /* Set which ECC bits are Even and Odd parity */
                   mirroring    = F021       /* RM57Lx and TMS570LCx are build in F021 */
}
#if 0
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */

SECTIONS
{
    .intvecs : {} > VECTORS
    .text    : {} > FLASH0
    .const   : {} > FLASH0
    .cinit   : {} > FLASH0
    .pinit   : {} > FLASH0
    .bss     : {} > RAM
    .data    : {} > RAM
    .sysmem  : {} > RAM


/* USER CODE BEGIN (4) */
#endif
/* Override Sections with CRCs here */
#if 1
SECTIONS
{
    .intvecs : {} > VECTORS, crc_table( _crc_table, algorithm=CRC32_C )
    .text  align(32) : {} > FLASH0, crc_table( _crc_table, algorithm=CRC32_C )
    .const align(32) : {} > FLASH0, crc_table( _crc_table, algorithm=CRC32_C )
    .cinit align(32) : {} > FLASH0, crc_table( _crc_table, algorithm=CRC32_C )
    .pinit align(32) : {} > FLASH0
    .bss     : {} > RAM
    .data    : {} > RAM
    .sysmem  : {} > RAM

    .TI.crctab : {} > CRCMEM
#endif
/* USER CODE END */
}

/* USER CODE BEGIN (5) */
/* USER CODE END */


/*----------------------------------------------------------------------------*/
/* Misc                                                                       */

/* USER CODE BEGIN (6) */
/* USER CODE END */
/*----------------------------------------------------------------------------*/

Bootloader 链接器 Cmd 文件:

/* Copyright (C) 2013-2019 Texas Instruments Incorporated - http://www.ti.com/
 *
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *    Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 *    Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the
 *    distribution.
 *
 *    Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
/*                                                                            */
/*----------------------------------------------------------------------------*/
/* USER CODE BEGIN (0) */
/* USER CODE END */


/*----------------------------------------------------------------------------*/
/* Linker Settings                                                            */

--retain="*(.intvecs)"

/* USER CODE BEGIN (1) */
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Memory Map                                                                 */

MEMORY
{
/* Bank 0 (384kB) */
    VECTORS (X)  : origin=0x00000000
                   length=0x00000020
                   vfill = 0xFFFFFFFF

    FLASH0  (RX) : origin=end(VECTORS)
                   length=(0x00140000 - size(VECTORS))
                   vfill = 0xFFFFFFFF

    SRAM    (RW) : origin=0x08002000
                   length=0x0002D000

    STACKS  (RW) : origin=0x08000000
                   length=0x00002000

/* USER CODE BEGIN (2) */
#if 1
/* Bank 0 ECC */
    ECC_VEC  (R) : origin=(0xf0400000 + (start(VECTORS) >> 3))
                   length=(size(VECTORS) >> 3)
                   ECC={algorithm=algoL2R4F021, input_range=VECTORS}

    ECC_FLA0 (R) : origin=(0xf0400000 + (start(FLASH0)  >> 3))
                   length=(size(FLASH0)  >> 3)
                   ECC={algorithm=algoL2R4F021, input_range=FLASH0 }

#endif
/* USER CODE END */
}

/* USER CODE BEGIN (3) */
ECC
{
    algoL2R4F021 : address_mask = 0xfffffff8 /* Address Bits 31:3 */
                   hamming_mask = R4         /* Use R4/R5 build in Mask */
                   parity_mask  = 0x0c       /* Set which ECC bits are Even and Odd parity */
                   mirroring    = F021       /* RM57Lx and TMS570LCx are build in F021 */
}
/* USER CODE END */

/*----------------------------------------------------------------------------*/
/* Section Configuration                                                      */


SECTIONS
{
   .intvecs : {} > VECTORS

   flashAPI:
   {
     ./Fapi_UserDefinedFunctions.obj (.text)
     ./bl_flash.obj (.text)
     --library= "/home/fw/fwbl/flashAPI/F021_API_CortexR4_LE.lib" (.text)
   } palign=8 load = FLASH0, run = SRAM, LOAD_START(apiLoadStart), RUN_START(apiRunStart), SIZE(apiLoadSize)

   .text  : {} > FLASH0 /*Initialized executable code and constants*/
   .const : {} palign=8 load=FLASH0, run = SRAM, LOAD_START(constLoadStart), RUN_START(constRunStart), SIZE(constLoadSize)

   .cinit : {} > FLASH0 /*Initialized global and static variables*/
   .pinit : {} > FLASH0
   .data  : {} > SRAM
   .bss   : {} > SRAM   /*Uninitialized Global and static variables */
   .sysmem  : {} > SRAM

/* USER CODE BEGIN (4) */
/* USER CODE END */
}

/* USER CODE BEGIN (5) */
/* USER CODE END */

e2e.ti.com/.../Bootloader-HCG.zip

e2e.ti.com/.../APP-HCG.zip

引导加载程序 sys_intvecs.asm

;-------------------------------------------------------------------------------
; sys_intvecs.asm
;
; Copyright (C) 2009-2018 Texas Instruments Incorporated - www.ti.com
;
;
;  Redistribution and use in source and binary forms, with or without
;  modification, are permitted provided that the following conditions
;  are met:
;
;    Redistributions of source code must retain the above copyright
;    notice, this list of conditions and the following disclaimer.
;
;    Redistributions in binary form must reproduce the above copyright
;    notice, this list of conditions and the following disclaimer in the
;    documentation and/or other materials provided with the
;    distribution.
;
;    Neither the name of Texas Instruments Incorporated nor the names of
;    its contributors may be used to endorse or promote products derived
;    from this software without specific prior written permission.
;
;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
;  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
;  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
;  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
;  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
;  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
;  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
;  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
;  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
;  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;
;
;

    .sect ".intvecs"
    .arm

;-------------------------------------------------------------------------------
; import reference for interrupt routines

    .ref _c_int00

;-------------------------------------------------------------------------------
; interrupt vectors
; Please change the #0x???? for your specified image location defined in bl_config.h - 0x08

        b   _c_int00   ;0x00
        b   #0x10018   ;0x04 UNDEF; 0x10000-0x08
        b   #0x10018   ;0x08 SVC  ; 0x10000-0x08
        b   #0x10018   ;0x0C PABT ; 0x10000-0x08
        b   #0x10018   ;0x10 DABT ; 0x10000-0x08

reservedEntry
        b   reservedEntry      ;0x14, reserved
        b   #0x10018           ;0x18, irqDispatcher
        ldr pc,[pc, #-0x1b0]   ;0x1C, FIQ


;-------------------------------------------------------------------------------

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另一个要注意的是、当我在 HalCoGen 中为引导加载程序启用闪存 ECC 时、在执行 Fapi_BlockErase 命令时获得 UNDEF 中断。 当闪存 ECC 被禁用时、不会发生这种情况。 在执行此操作时、我修改了 LCF 以包含闪存组7。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dana Rich:

    已开始处理您的问题、很快将提供更新。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。

    我还有几项其他观察结果可能会导致某个地方:

    • 如果我在从_c_int00中执行任何操作之前从引导加载程序跳转到主应用程序、似乎可以很好地加载应用程序。  
    • 如果我使引导加载程序的 HAL 与应用程序的 HAL 匹配(减去中断)、那么即使在执行引导加载程序的_c_int00之后、我们似乎也能够从引导加载程序加载应用程序
    • 当我查看 中止寄存器时、我看到 C3C3C3C3C6、它类似于 PBIST 测试值。
    • 我在 HCG 中重新配置了堆栈、而不是使用链接器文件、以便在引导加载程序和主应用程序之间保持相同。 这 无法解决 任何问题。

    我现在想:在跳转到主应用之前、处理器是否需要处于管理员模式? 这是 从重启中执行_c_int00与从那里执行代码之间明显不同的一点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dana:

    附件的 zip 文件仅具有 HALCoGen 配置文件、

    我能获得完整的应用项目文件夹吗?

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    遗憾的是、我不习惯在此设置中提供完整项目、但是、如果您需要特定的文件或函数、我想我可以这样做。 我还可以提供 HALCOGEN 生成的文件(包括我们在用户部分中所做的更改)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dana:

    您的应用是否涉及任何 FreeRTOS、或者它只是裸机代码?

    如果不涉及 FreeRTOS、在使用实际应用程序之前、您是否已将任何基本 LED 闪烁项目作为应用程序进行测试?

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是一个裸机应用程序。 在开始演示时、我首先开发了一个 RM46 Launchpad、然后测试了示例引导加载程序和一个演示闪烁应用程序、不过它的作用范围非常有限、没有在代表性硬件或代表性固件上提供。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dana:

    好的、我最后先尝试使用一些虚拟应用程序来启动加载程序。 我会 在完成测试后分享我的建议。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Dana:

    对于延迟、我们得到了 TI 印度分公司的连续休假。

    我今天有自由时间进行测试和提供更新。

    --

    谢谢。此致、
    Jagadish。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    非常感谢您的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    主应用程序是 使用 CCS 编程时可以工作的现有应用程序

    您是否意味着引导加载程序和应用程序均通过 CCS 进行编程? 它们都能正常工作?

    通过 Uniflash 加载引导加载程序和主应用程序时,我无法引导主应用程序(强制引导至应用程序)

    如果您使用引导加载程序加载应用程序、则可以使用闪存 API 计算应用程序的 ECC 并对其进行编程。

    您是否已检查从0x10020开始的应用程序是否已正确编程?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否意味着引导加载程序和应用程序都是通过 CCS 进行编程? 它们都能正常工作?

    我的意思是、在使用 CCS 时、我可以执行并单步执行在0x00000处编程的引导加载程序。 在单独的操作中、加载并执行在0x10020处编程的主应用程序。

    如果您使用引导加载程序加载应用程序,则可以使用闪存 API 计算和编程应用程序的 ECC。

    在 HAL 中禁用 ECC (RAM 和闪存)后、我能够通过引导加载程序对应用程序进行编程和运行。 检查存储器的地址是否正确、一切看起来都正常。

    如果我要在应用程序中使用 ECC、是否需要在引导加载程序的 HAL 中启用 ECC?  

    我是否能够在启用 ECC 的情况下使用 Uniflash 对两个映像进行编程? 为了实现这一点、是否需要进行特定设置?

    谢谢。

    德纳

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果要在应用程序中使用 ECC,是否需要在引导加载程序的 HAL 中启用 ECC?  [/报价]

    是的、应在引导加载程序和应用程序中启用 ECC。

    是否可以在启用 ECC 的情况下使用 Uniflash 对两个映像进行编程? 是否需要进行特定设置才能实现此目的?

    是的、它可以单独对两个映像进行编程。

    如果要使用链接器 CMD 脚本生成 ECC、则应在加载*。out 文件时禁用"自动 ECC 生成"。

    1.加载引导加载程序并启用"自动 ECC 生成"和"仅限必要扇区"

      

    2.然后以相同的设置加载应用程序。

    3.应用程序从0x10020 (向量)开始、因此引导加载程序中分支指令的目标地址应为0x10020:

    G_ulTransferAddress =(uint32_t) 0x10020;
    ((void (*)(void)) g_ulTransferAddress)();

    ((void (*)(void)) 0x10020)();

    [/quote]
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、谢谢、这与我设置它的方式是一致的。 尝试在引导加载程序中启用 ECC 时、 尝试跳转到  _errata_CORTEXR4_66_()函数时遇到中止。

    我做了一些重新配置并将向量的起始值设置为0x10000、但我不能想象这会是个问题。 我删除了引导标志的存储以及实施中的所有内容。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    抱歉、我想澄清一下、  

    1. 加载启用了"自动 ECC 生成"和"仅必要扇区"[/报价]的引导加载程序

    这应该是  禁用 对吧?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    可以、由于您使用链接器 CMD 生成 ECC、因此应禁用"自动 ECC 生成"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还有一个问题:

    我发现需要将行添加到  

    b   #0xFFF8            ;0x18 irqDispatcher
     引导加载程序的 sys.intvecs.asm 文件以支持主应用程序。 但我还想在代码中加入 SCI DMA 示例工程(spna213)、以便我也能够从引导加载程序更新 FPGA。 我不确定如何配置中断、以便一切能够正常工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    只是跟进我的最后一封邮件。 通过利用 FIQ 中断、我在做了一些小的更改后能够整合上述项目。 然而,最终没有必要这样做,因为投票已经足够了。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我发现需要将行添加到  

    全屏
    1
    b #0xFFF8 ;0x18 irqDispatcher
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
     引导加载程序的 sys.intvecs.asm 文件以支持主应用程序。 [/报价]

    您无需更改此行。  LDR PC [PC,#-0x1b0]的目标位置始终指向 VIM IRQ 矢量寄存器。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在使用 IRQ 调度程序、如果我不添加该行、则 在运行应用程序时出现错误。 我不记得确切的错误是什么、但某种中止。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    RM46x 和 TMS570器件支持三种不同的中断模式:

    1.索引中断模式:  CPU 接收到中断后、CPU 分支到0x18 (IRQ)或0x1C (FIQ)以执行 主 ISR。 主 ISR 例程读取偏移寄存器(IRQINDEX、FIQINDEX)来确定中断源。

      我认为您使用的是此模式。

    2. 寄存器矢量中断: 在启用中断之前,应用程序必须启动中断矢量表。  CPU 收到中断后,将执行放置在0x18或0x1C ( LDR PC,[PC,#-0x1b0])处的指令 ,以便从中断向量寄存器中加载 ISR (中断向量)的地址。

    3. 硬件矢量中断:当 CPU 接收到中断时、 CPU 直接从 VIC 端口读取 ISR 的地址、 而不是分支到0x18。 建议采用此模式、并且在 HAL 生成的启动代码中启用了 VIC。