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.

[参考译文] TMS570LS0914:TMS570LS0914PGE 上的 F021 API

Guru**** 2455560 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1490340/tms570ls0914-f021-api-on-tms570ls0914pge

器件型号:TMS570LS0914

工具与软件:

大家好!  

我尝试在 TMS570LS0914PGE 上使用 F021 API、但使用时遇到问题。 系统初始化后、我调用:


Fapi_Status 状态= Fapi_initializeFlashBanks (HCLK_FREQ);
状态= Fapi_setActiveFlashBank((((52Type)307; Fapi_Flash Fapi_Flash


Fapi_setActiveFlashBank()导致未定义指令异常。  

在 CCS 12中、我包含了以下 F021文件:
- F021_API_CortexR4_BE_V3D16.lib // 闪存模块控制器、大端字节序、FPU
- CGT.CCS.h
- Registers_FMC_BE.h

根据 F021指南(第3.3.4章)中的注释、我有点困惑:

注意:F021闪存 API 库无法从与为 API 命令操作所选的活动组所在的组相同的组中执行。
在单组器件上、必须从 RAM 执行 F021闪存 API。

问题出在哪里呢? 我不知道该怎么办。

此致、
Juergen

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

    尊敬的 Juergen:

    是的、这是一个问题。

    请参阅以下主题、我在此处详细说明了此问题:

    (+) TMS570LS3137:TMS570LS3137:在运行时编写闪存-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    ——

    谢谢、此致、
    Jagadish。

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

    尊敬的 Jagadish:

    感谢您的答复、我认为仍需要一些指导才能使其生效。

    我 根据您建议和添加的链接修改了我的链接器脚本  
    extern unsigned int api_load;
    extern unsigned int api_size;
    extern unsigned int api_run;
    memcpy (&API_run、&API_LOAD、(uint32)&API_SIZE);
    到我的主文件中。

    --retain="*(.intvecs)"
    
    MEMORY
    {
        VECTORS (X)    : origin=0x00000000 length=0x00000020
        FLASH_API (RX) : origin=0x00000020 length=0x000014E0
        FLASH0  (RX)   : origin=0x00001500 length=0x0000EB00
        STACKS  (RW)   : origin=0x08000000 length=0x00001500
        RAM     (RW)   : origin=0x08001500 length=0x0001EB00
    
    }
    
    SECTIONS
    {
        .intvecs : {} > VECTORS
    
       flashAPI :
       {
    	  ../../../IDE/CSS/Debug/port/TMS570LS0914PGE/F021_API/source/Fapi_UserDefinedFunctions.obj (.text)
         --library= F021_API_CortexR4_BE_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
    
    }
    
       .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
    

    从行"  .ref  api_load"开始我收到的错误如: #10008-D 找不到文件".ref"....

    对于 /../../IDE/CSS/Debug/port/TMS570LS0914PGE/F021_API/source Fapi_User Functions.obj (.text)行、我得到错误:
    #10068-D 无匹配部分。
    路径相对于链接器脚本的位置?
    是否有宏 whtick 将"Debug"替换为"Debug"或"Release"、具体取决于我构建的两者中的哪一个?

    此致、
    Juergen

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

    小更新。 我从链接器脚本中删除了汇编器代码。 主文件中的 memcpy 执行该工作、并将闪存 API 复制到 RAM 中。 我 现在可以单步执行 Fapi_setActiveFlashBank()。

    我仍然想知道 是否有方法可以将此行中的 Debug 替换为取决于构建类型(调试或发布)的宏
    ../../../IDE/CSS/Debug/port/TMS570LS0914PGE/F021_API/source Fapi_User 050.edFunctions.obj (.text)

    此致、
    Juergen

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

    我仍然无法使用闪存 API。 只要我单步执行代码,Fapi_issueProgrammingCommand ()就能运行十次中的五次。 如果我没有单步执行代码、它永远不会起作用、它在 未定义的指令(exceptio handler)中结束、CPSR 寄存器的全局中断标志设为1、中断就不应该出现。 Fapi_issueAsyncCommandWithAddress()永远不会起作用、即使是在单步中也不会起作用。 测试设置将四个字节写入扇区4、5、6的开头。 随后是空白检查、它将始终正确地报告扇区非空白。 该操作之后是  每个扇区的 Fapi_issueAsyncCommandWithAddress (Fapi_Erase contr、addr)、但始终在未定义的指令异常处理程序中结束。

    .

    #define NUMBEROFSECTORS 14
    const SECTORS flash_sector[NUMBEROFSECTORS] = {
    
       /*start              len  bank sector */
      (void *)0x00000000, 0x04000, 0,  0,
      (void *)0x00004000, 0x04000, 0,  1,
      (void *)0x00008000, 0x04000, 0,  2,
      (void *)0x0000C000, 0x04000, 0,  3,
      (void *)0x00010000, 0x04000, 0,  4,
      (void *)0x00014000, 0x04000, 0,  5,
      (void *)0x00018000, 0x08000, 0,  6,
      (void *)0x00020000, 0x20000, 0,  7,
      (void *)0x00040000, 0x20000, 0,  8,
      (void *)0x00060000, 0x20000, 0,  9,
      (void *)0x00080000, 0x20000, 0, 10,
      (void *)0x000A0000, 0x20000, 0, 11,
      (void *)0x000C0000, 0x20000, 0, 12,
      (void *)0x000E0000, 0x20000, 0, 13
    };
    
    
    void main(void){
    
        memcpy(&api_run, &api_load, (uint32)&api_size); // copy api to RAM
        
        status = Fapi_initializeFlashBanks(HCLK_FREQ);
        while(FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy);
        status = Fapi_setActiveFlashBank((Fapi_FlashBankType)Fapi_FlashBank0);
        while(FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy);
        status =  Fapi_enableMainBankSectors(0x03FFF);
        while(FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy);
        
        int i = 4;
    
        uint8_t pattern[4] = {0xAA, 0xBB, 0xCC, 0xDD};
        uint8_t eccbuf[4] = {0};
        for(i = 4; i < 7; i++){
    
            status = Fapi_issueProgrammingCommand((uint32_t *)flash_sector[i].start,
                                                  pattern,
                                                  sizeof(pattern),
                                                  eccbuf,
                                                  0,
                                                  Fapi_DataOnly);
    
            while(FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy);
    
            uint32_t fmstat = 0;
    
            do{
                fmstat = FAPI_GET_FSM_STATUS;
            }while(fmstat != 0);
    
        }
        
        for(i = 4; i < 7; i++){
    
            status = Fapi_Error_Fail;
    
            do{
    
                status = Fapi_doBlankCheck((uint32_t *)flash_sector[i].start, 
                                            flash_sector[i].length - 1, // not sure yet why it only work with length -1
                                            &poFlashStatusWord);
    
                if(status == Fapi_Error_Fail){  // sector blank?
    
                    Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32_t *)flash_sector[i].start);
    
                    while(FAPI_CHECK_FSM_READY_BUSY == Fapi_Status_FsmBusy);
    
                    if(FAPI_GET_FSM_STATUS != 0){
    
                        while(1);
                    }
    
                }
    
            }while(status == Fapi_Error_Fail);
    
        }
    
    
    
    }

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

    FAPI 正在运行。 我必须将任何重新领域复制到 FAPI 中的内容复制到 RAM