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.

[参考译文] TMS570LC4357:F021 API 在将数据从闪存复制到 RAM 时出现问题

Guru**** 2455800 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1211847/tms570lc4357-f021-api-problem-in-copying-data-from-flash-to-ram

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

您好!

我正在尝试擦除和写入 bank0中的一个扇区 、因此根据"F021闪存 API 库无法从与 为 API 命令操作所选择的活动存储体相同的存储体中执行。 F021闪存 API  必须从 RAM 执行。"   为此、我正在尝试将 API 复制到 RAM 中。 但我得到一个警告说没有匹配段 Fapi_UserDefinedFunctions.obj 这是很奇怪,并在 DataEntry 挂起。 我用于复制到 RAM 的链接器脚本和汇编代码如下所示。 这里我需要一些支持

此致

Usha.

MEMORY
{
/* USER CODE BEGIN (2) */
/* USER CODE END */
    VECTORS   (X)  : origin=0x00000000 length=0x00000020
    FLASH_API (RX) : origin=0x00000020 length=0x000014E0
    FLASH0    (RX) : origin=0x00001500 length=0x001FEB00
    STACKS    (RW) : origin=0x08000000 length=0x00001500
    RAM       (RW) : origin=0x08001500 length=0x00006B00

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

SECTIONS
{
/* USER CODE BEGIN (5) */
/* USER CODE END */
    .intvecs : {} > VECTORS

   flashAPI :
   {
     ../Debug/source/Fapi_UserDefinedFunctions.obj (.text)
     ../Debug/source/ra_f021.obj (.text)
     --library= F021_API_CortexR4_BE_L2FMC_V3D16.lib (.text)
   } load = FLASH_API, run = RAM, LOAD_START(api_load), RUN_START(api_run), SIZE(api_size)

    .text    : {} > FLASH0
    .const   : {} > FLASH0
    .cinit   : {} > FLASH0
    .pinit   : {} > FLASH0
    .bss     : {} > RAM
    .data    : {} > RAM
    .sysmem  : {} > RAM
    FEE_TEXT_SECTION  : {} > FLASH0
    FEE_CONST_SECTION : {} > FLASH0
    FEE_DATA_SECTION  : {} > RAM

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

;-------------------------------------------------------------------------------
;
; Copy the Flash API from flash to SRAM.
;

    .def     _copyAPI2RAM_
    .asmfunc

_copyAPI2RAM_

   .ref    api_load
flash_load   .word api_load
   .ref    api_run
flash_run   .word api_run
    .ref    api_size
flash_size  .word api_size

     ldr    r0, flash_load
     ldr    r1, flash_run
     ldr    r2, flash_size
     add    r2, r1, r2
copy_loop1:
     ldr     r3, [r0], #4
     str     r3, [r1], #4
     cmp     r1, r2
     blt     copy_loop1
      bx     lr

    .endasmfunc

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

    您可以尝试以下方式吗:

    extern unsigned int api_load;
    extern unsigned int api_size;
    extern unsigned int api_run;

    /*用户代码结束*/

    int main (空)

    /*用户代码开始(3)*/
    uint32_t 状态;

    /*将闪存 API 复制到 SRAM*/
      memcpy (&API_run、&API_load、(uint32)&API_size);

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

    您好、Wang、

    感谢您的答复。 我尝试了你提到的方式,我仍然有相同的警告  '没有匹配部分 Fapi_UserDefinedFunctions.obj '

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

    我可以修复警告问题。 但我在调用闪存 API 函数时进入"prefetchEntry"错误状态。 有没有我失踪的东西?

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

    尊敬的 Usha:

    您能否检查&API_LOAD I FLASH 上的内容是否已复制到&API_run 的 RAM?

    如果 memcpy (...) 则  不应调用_copyAPI2RAM_()。  

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

     Fapi_UserDefinedFunctions.c 文件位于何处?

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

    我仅使用 memcpy、并且看到数据被复制到 RAM 中

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

    如果您的意思是路径它在源文件夹(halcogen 生成的文件)中。 添加这样的 main 函数  

    int main(void)
    {
    /* USER CODE BEGIN (3) */
    
        /* Copy the flash APIs to SRAM*/
        memcpy(&apiRunStart, &apiLoadStart, (uint32)&apiLoadSize);
    
        _enable_IRQ_interrupt_();
        sciInit();
        sciSetBaudrate(sciREG3,460800);
        ra_stdio_init(RA_DEBUG_PORT);
    
        ra_fapi();
    
        while(1) ;
    /* USER CODE END */
    }
    

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

    尊敬的 Usha:

    请将 SRAM 配置为可执行文件:

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

    您好、Wang、

    我负责 IT SRAM 执行权限。  也许我不是那么清楚. 在调试模式下、 当我步入时、具有闪存 API 函数的行(在我的情况下为" Fapi_initializeFlashBanks ")进入"prefetchEntry"错误状态。 看起来我在执行闪存 API 时遇到了一些权限问题。 你能评论一下吗?

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

    闪存 API 必须在特权模式下运行以允许访问闪存控制器寄存器。

    必须在  Fapi_initializeFlashBanks ()调用中使用系统时钟频率(HCLK)。

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

    是 API_initializeFlashBanks() 包括 HCLK,即150

    if ((Fapi_initializeFlashBanks((uint32_t)SYS_CLK_FREQ)) == Fapi_Status_Success)
        {
            Fapi_setActiveFlashBank(Fapi_FlashBank0);                       
            Fapi_enableMainBankSectors(0xFFFF);                           
    
            while( FAPI_CHECK_FSM_READY_BUSY != Fapi_Status_FsmReady );
            while( FAPI_GET_FSM_STATUS != Fapi_Status_Success );
        }

    我正在使用 halcogen 生成的代码,在启动代码初始特权模式设置后,它切换到用户模式. 请分享一些示例、例如如何 从用户模式切换到特权模式。

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

    当我单步执行在 RAM 中运行的 F021函数时、一切都将完美运行。  当我运行代码时、它会失败并显示预取中止。  那么为什么软件在单步运行中运行并且在自由运行时崩溃呢?   

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

    我通过在调用闪存 API 之前禁用中断来使它正常工作