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.

[参考译文] TMS320F2808:闪存 API Flash_API 版本十六进制()

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1069392/tms320f2808-flash-api-flash_apiversionhex

部件号:TMS320F2808
“线程:测试”中讨论的其它部件

使用 Code Composer 10.3,我正在将 Flash API 导入到代码中,并按预期构建。 我确保图书馆路径是本次讨论的一部分- https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1012666/launchxl-f280025c-flash-api/3742724#3742724

我添加了必要的 F2808.cmd 链接:

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Flash28_API:
{
-lFlash2808_API_V302.lib(.econst)
-lFlash2808_API_V302.lib(.text)
} LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_Flash28_API_LoadStart),
LOAD_END(_Flash28_API_LoadEnd),
RUN_START(_Flash28_API_RunStart),
PAGE = 0
ramfuncs : LOAD = FLASHD,
RUN = RAML0,
LOAD_START(_RamfuncsLoadStart),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
PAGE = 0
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

作为一项测试,我将 Flash_API VersionHex ()移动到了我的主要功能(在 Memcopy 和 PLL 设置等之后),以确保它能够正常工作。 当我跑步时,我跳到了一个非法的_ISR()紧急停止。

我还得到了以下信息: 在“Flash28_Version_Hex.c”中找不到源文件
找到文件或编辑源查找路径以包括其位置。

当我步入  Flash_API VersionHex () 并显示反汇编时,我看到以下内容,当我一步执行代码时,它将进入 CopyData 函数:

Fullscreen
1
2
3
4
5
6
7
8
Flash2808_APIVersionHex():
00851b: FE0C ADDB SP, #12
00851c: 767F51E3 LCR 0x3f51e3
100 {
CopyData(), RamfuncsRunStart:
00851e: FE0C ADDB SP, #12
115 CsmUnlock();
00851f: 767F51E8 LCR CsmUnlock
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

为什么我似乎无法使用此简单设置获得 Flash API 十六进制版本?

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

    你好,杰弗里,

    我们的 F2808闪存专家将于下周中返回给您。   

    谢谢,此致,
    瓦姆西

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

    非常感谢。 期待得到帮助。

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

    杰弗里

    您能否告诉我您正在如何使用 Memcopy 函数/使用什么函数?  我认为有一个默认的 C 原型,我看到其他人有问题。  在我们的 API 示例中,我们有一个简单的例程(您可能已经在使用),如下所示:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // Copy the Flash API functions to SARAM
    Example_MemCopy(&Flash28_API_LoadStart, &Flash28_API_LoadEnd, &Flash28_API_RunStart);
    // We must also copy required user interface functions to RAM.
    Example_MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
    void Example_MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
    {
    while(SourceAddr < SourceEndAddr)
    {
    *DestAddr++ = *SourceAddr++;
    }
    return;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    上一个屏幕截图有趣的是,对 APIVersionHex ()的 ASM 调用是对闪存地址的调用,而链接程序本应是对 SRAM 地址的调用。

    您也可以在 memcopy 函数调用后立即手动检查 API 函数是否位于 RAM 中。

    我认为.c 文件错误是由于.lib 中的内容与独立文件的打包,但我需要进一步研究。

    最佳

    马修

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

    Memcopy 定义:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    MemCopy(&Flash28_API_LoadStart, &Flash28_API_LoadEnd, &Flash28_API_RunStart);
    MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
    void MemCopy(Uint16 *SourceAddr, Uint16* SourceEndAddr, Uint16* DestAddr)
    {
    while(SourceAddr < SourceEndAddr)
    {
    *DestAddr++ = *SourceAddr++;
    }
    return;
    }
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    我已经包括了地图文件,以查看它是否能帮助您找到问题。

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ******************************************************************************
    TMS320C2000 Linker PC v20.2.4
    ******************************************************************************
    >> Linked Fri Jan 21 08:41:01 2022
    OUTPUT FILE NAME: <Example_2808_Flash.out>
    ENTRY POINT SYMBOL: "_c_int00" address: 003f5c9c
    MEMORY CONFIGURATION
    name origin length used unused attr fill
    ---------------------- -------- --------- -------- -------- ---- --------
    PAGE 0:
    RAML0 00008000 00001000 000005fb 00000a05 RWIX
    OTP 003d7800 00000400 00000000 00000400 RWIX
    FLASHD 003e8000 00004000 000005fb 00003a05 RWIX
    FLASHC 003ec000 00004000 00000000 00004000 RWIX
    FLASHB 003f0000 00004000 00000000 00004000 RWIX
    FLASHA 003f4000 00003f80 000020c8 00001eb8 RWIX
    CSM_RSVD 003f7f80 00000076 00000076 00000000 RWIX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

    杰弗里

    由于包含了地图文件,因此一切似乎都是为了使其正常工作。  从您之前的 ASM 屏幕截图中,您还根据地址跳到了功能助手中,因此我们知道 CSM 也没有锁定。

    1)您是否可以导入 API 软件包中包含的示例并加载/运行它?  在代码复制后调用闪存版本功能时,它几乎也在做同样的事情。  路径为 C:\tidcs\c28\Flash28_API\Flash2808_API_V302\example

    2)如果我们正在调试您的当前代码,我们可以使用堆栈回顾获取 ITRAP 的位置。  进入非法 ISR 后,打开一个内存窗口,到达 SP 寄存器指向的位置(在 CPU 寄存器视图中)。  如果我们回顾两个字,我们应该看到返回地址,这将是一条超过 ITRAP 的指令。  或者,您可以将代码插入 Flash Version 函数,以查看何时也会发生这种情况。

    在上述两项操作之间,我认为我们可以缩小代码的差异,并纠正导致代码行为不当的任何原因。

    最佳

    马修

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

    谢谢 Mathew——我还没有忘记,但已经被跟踪。 我应该在第二天或第二天做这项工作。

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

    感谢您的更新,杰弗里将会查找您的更新,我们可以从那里获得。

    最佳

    马修

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

    所以,我有两个版本的球形  
    UINT16 Flash28_API_LoadStart;
    UINT16 Flash28_API_LoadEnd;
    UINT16 Flash28_API_RunStart;

    在我的代码中。 因此,我删除了一个集,它使 Memcopy 地址 的参数更好。 (在开始和结束执行0xFFFF 之前)

    现在 Flash_APIVersionHex ()给出了正确的响应- 0x0302,但它是从 Flash 运行的。

    从 main()开始,我将它包装在 A 中  

    #pragma code_section (getversion,“ramfuns”);
    getversion();

    现在,它提供了 SRAM 的正确版本(0x8537)。 因此,我显然只需要确保所有的复制函数都包含在 pragma 中。

    使用  C:\tidcs\c28\Flash28_API\Flash2808_API_V302\example,尽管它很古老。

    当我将 pragma 中的所有 Flash 函数换行并使副本生效时,我会将此票证标记为“已解决”。 如果有另一两个问题,请搁置。