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.

[参考译文] TMS320F28069:TMS320F28069如何使用 serial_flash_programmer??

Guru**** 2225540 points
Other Parts Discussed in Thread: C2000WARE, TI-CGT
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/771502/tms320f28069-tms320f28069-how-to-use-serial_flash_programmer

器件型号:TMS320F28069
主题中讨论的其他器件:C2000WARE

我们首先通过"scia 示例"与 PC 通信、验证了 sci 硬件状态是否正常。

 通信图片。

1."c:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ device_support \ f2806x \ examples \ c28 \ f28069_sci_flash_kernel"
我在 CCS 中导入了该示例并对其进行了编译。

2.将文件"f28069_sci_flash_kernel.out"复制到文件夹"c:test"。

2.1我没有将"f28069_sci_flash_kernel.out"文件下载到28069。 原因是"serial_flash_programmer"认为它将下载。

3.我将"C:\ ti \ ccsv6 \ tools \ compiler \ ti-CGT_6.4.6 \ bin"文件夹中的"HEX2000.exe"文件复制到文件夹"c:test"中

4.打开 Windows 命令行并输入"c:test"目录。
"hex2000.exe -boot -sci8 -a -o f28069_sci_flash_kernel.txt f28069_sci_flash_kernel.out"

创建了文件"f28069_sci_flash_kernel.txt"(我从未打开过它。 当我打开它时、我有时会看到 Windows 添加了奇怪的数字。)

6."c:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ device_support \ f2806x \ examples \ c28 \ timed_led_blink"
我在 CCS 中导入了该示例并对其进行了编译。
我将程序下载到仿真器、并确认 LED 正在切换。

7.将文件"Example_2806xLEDBlink.out"复制到文件夹"c:test"。

8.打开 Windows 命令行并转至"c:test"目录并运行以下命令:
"hex2000.exe -boot -sci8 -a -o Example_2806xLEDBlink.txt example_2806xLEDBlink.out"

9.已创建"Example_2806xLEDBlink.txt"文件(我从未打开它。 当我打开它时、有时我看到 Windows 添加了奇怪的数字。)

10.我已从电路板上移除仿真器,目前只连接 SCIA 通信和电源。

11. GPIO34 - SET (3.3V 上拉电阻)
GPIO-37 -非置位(GND 下拉)

12.关闭"28069"。

13.打开"28069"的电源。

14."LED 闪烁"不起作用。
因此、它被视为处于"sci 引导模式"。

15。如下图所示继续。

16."正在将 C:\ test \ Example_2806xLEDBlink.txt 下载到设备..."
20分钟后无响应。

因此、如果我犯了错误、请告诉我。
我无法求解一个月。

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

    请使用-v 选项进行详细打印。 如果正在下载内核、则应在终端中回显字符。

    它看起来是自动波特率锁定、SCI 通信可能无法正常工作。 请确保使用的 GPIO 引脚与 SCI 引导加载程序使用的 GPIO 引脚相同。

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

    感谢您的快速回答。

    但答案没有解决我的问题。

    1.您可以看到最后一张图片已包含"-v"选项。但是,在最后一张图片之后,“正在将 C:\ test \ Example_2806xLEDBlink.txt 下载到设备...”之后没有字符。

    2.它设置为"gpio28 (SCIA_RX)"和"gpio29 (SCIA_TX)"、您可以在"SCI_A_ucRX"中看到发送到超级终端的"0x61"、如第一张图片所示。
    当我在"SciaRegs.SCITXBUF"中输入"0x62"时、我确认在 PC 的超级终端上显示英文字符"b"。

    还有更多问题。

    3.将"f28069_sci_flash_kernel"的"out file"下载到"DSP"的"internal flash ROM"后、我是否应该从第一个问题的第一个问题继续?
    像问题"2.1"这样思考是否正确?

    4、请查看 SPRABV4B 文档
    "如有必要。 然后、它等待来自主机的'A'或'A'、以便对主机执行自动波特率锁定。 "
    有此内容。
    这是否从 DSP 自动发送到主机(PC)?
    如果是、Cmd 窗口是否可见?
    如果不是、"自动波特锁定"是如何工作的?

    第五个问题

    11. GPIO34 - SET (3.3V 上拉电阻)
    GPIO-37 -非置位(GND 下拉)

    12.关闭"28069"。

    13.打开"28069"的电源。

    14."LED 闪烁"不起作用。
    因此、它被视为处于"sci 引导模式"。
    在我执行序列时、是否有任何方法来验证 DSP 是否进入 SCI 引导模式? (我有一个示波器、因此我可以看到 DSP 的所有引脚。)

    噢,我的神,我在实验中没有接地。

    字符打印如下:程序是否下载到内部闪存 ROM?

    与图片一样、应用项目现在在 RAM 区域中编程为"RAM.cmd"。 我应该使用"rom.cmd"吗?

    我使用"Rom.cmd"下载了内部闪存 ROM 程序。

    感谢您的回答。

    我只想从外部串行通信线路(TX、Rx、GND)将程序下载到内部 ROM 区域。

    但是、作为一个特殊的问题、"serial_flash_programmer"应该最初设置为"GPIO34"和"gpio37"。

    因此、在重新启动程序时、必须再次设置"GPIO34"和"gpio37"。
    我想在不修改"GPIO"的情况下下载程序。
    还有其他方法吗?

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

    您的最新帖子无法理解。

    看起来您已使其正常工作。 您无法对 ROM 进行编程。 这就是它是只读存储器的原因。

    如果您希望在不修改引导控制引脚的情况下执行器件固件更新、则需要使用某种方法来通知系统/器件转到 ROM 中的 SCI 引导加载程序。 如果将引导 ROM 符号库添加到项目中、则可以对 ROM 引导加载程序进行函数调用。

    您可以查看其他 E2E 论坛帖子、以获取有关此方面的帮助。

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

    感谢您的回答。

    使用 GPIO 设置、sci_boot 模式已启用、可将程序下载到内部闪存 ROM 区域。

    但我现在是
    1.将设置修正为 GPIO34 - 高电平、gpio37 -高电平(获取模式)、并且没有仿真器。
    2.软件调用 sci_boot 函数
    3.我想将程序下载到内部闪存 ROM 区域。

    http://e2e.ti.com/support/microcontrollers/c2000/f/171/p/754532/2789202?tisearch=e2e-sitesearch&keymatch=boot_rom#2789202

    您说您只需要添加".lib 文件"。
    但是、当您查看下一张图片时、会生成一个错误。

    因此、

    C:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ libraries \ boot_rom \ f2806x \ v1_1 \ rom_sources\ source

    我需要将.c 和.h 文件添加到我的项目中。
    这是我的想法吗?

    如果是、我可以推荐 e2e 帖子或数据表吗?

    如果您给我们发送一个链接、我将不胜感激。

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

    extern SCI 引导函数的原型。

    此外、不要同时包含两个.libs。 仅包含您需要的.lib。 如果要在启用了 FPU 的情况下编译项目、请使用 FPU 版本。

    SAL
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这个线程中有一些很好的信息。

    e2e.ti.com/.../758414

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

    我正在使用 FPU。
    所以
    C:\ti\c2000Ware_1_00_06_00\libraries\boot_rom\f2806x\v1_1\rom_symbol_libs\Flash_API\2806x_FlashAPI_BootROMSymbols_fpu32.lib
    已添加。

    但是,仍然无法调用 sci_boot ()函数。

    附加我的 main.c

    e2e.ti.com/.../4846.main.c

    #include "DSP28x_Project.h"

    extern Memcopy();
    extern UINT32 SCI_Boot (void);

    void (*entry)();

    字 wCntMain = 0;
    word test_boot_sci=0;

    unsigned long boot_addr = 0x003fe74a;

    void main (void){

    ////
    //// GPIO 和 SCI 仍从 SCI_Boot ()设置
    ////设置 sysctl 和 PLL
    ////
    // DisableDoG();
    //国际振荡1Sel();
    // InitPll (DSP28_PLLCR、DSP28_DIVSEL);
    //
    // delay_US (100);
    //返回 SCI_Boot ();

    InitSysCtrl();
    Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
    InitFlash();

    Dint;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();
    InitCpuTimer();

    init_gpio();
    Timer_Init();

    EINT;
    /*启用全局中断 INTM */
    ERTM;
    /*启用全局实时中断 DBGM */
    for (;;)

    wCntMain++;
    if (test_boot_sci=1)

    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    //准备 SCI 引导加载
    //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    EALLOW;
    Dint;
    EDIS;
    PieCtrlRegs.PIECTRL.bit.ENPIE = 0;//禁用 PIE
    DisableDog ();//禁用看门狗
    国际振荡1Sel();
    InitPll (DSP28_PLLCR、DSP28_DIVSEL);
    EALLOW;
    条目=(void (*)(boot_addr);
    entry();

    // boot_addr=sci_Boot();
    //((void (*)(void)) boot_addr)();


    1.我认为这不应该只添加 lib. 是这样吗?

    2.当我打开用记事本添加的库时,没有关于 sci_boot 的信息()。 所以
    C:\ti\c2000Ware_1_00_06_00\libraries\flash_api\f28066\lib\2806x_Bootrom_api_table_Symbols_fpu32.lib
    我认为添加是正确的。
    是这样吗?

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

    UINT32 SCI_Boot (UINT32引导模式)

    请执行以下操作:

    外部 UINT32 SCI_Boot (UINT32引导模式);

    在您的程序中适当地调用该函数。

    您可以在 C2000Ware 中看到原型和代码。 我们为您提供所有这些。

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

    我想你现在错了。

    我不使用 f2837xd、F2837xs、F2807x、F2833x、f28004x 系列 DSP。

    我使用的是 F28069。

    请参阅 C2000库中的 SCI_Boot.c 源代码。
    它位于以下目录中:

    C:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ libraries \ boot_rom \ f2806x \ v1_1 \ rom_sources\ source

    您提到的 UINT32 SCI_Boot (UINT32引导模式)原型
    它只存在于 F2837x 的目录中。

    它位于以下目录中:

    C:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ libraries \ boot_rom \ f2837xs \ revB \ rom_sources\ F2837x_bootROM \ cpu01-bootROM \ source

    请检查您的计算机目录并给出答案。

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

    如果在进行函数调用的文件中使用外部 API、并且在 CCS 工程中包含.lib、编译器和链接器将正确编译工程。

    请告诉我您看到的具体问题。

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

    我认为我不需要调用 SCI_Boot ()函数。

    由于"serial_flash_programmer"使用"28069_sci_flash_kernel.txt"文件、我相信"serial_flash_programmer"将调用"SCI_Boot ()"函数。

    只需将其设置为 sci 引导模式。

    第一种方法是 GPIO 设置。

    我想将"sci 引导模式"设置为软件。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    串行闪存编程器是一种与器件通信的 PC 应用。

    如果我理解正确、您需要从应用程序运行引导加载程序。 在这种情况下,只需从应用程序调用 SCI_Boot()即可开始执行 ROM 中的 SCI 引导加载程序。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另一种方法是调用 sci_boot ()函数。

    该方法如下所示:main.c

    ------------------------------------------ main.c ----------------------------

    #include "DSP28x_Project.h"

    extern Memcopy();
    extern UINT32 SCI_Boot ();

    字 wCntMain = 0;
    word test_boot_sci=0;

    unsigned long sci_boot_addr = 0x003ff699;
    unsigned long init_boot_addr = 0x003ff760;
    unsigned long select_boot_addr = 0x003ff459;
    #define Device_cal (void (*)(void)) 0x3D7C80
    uint32 (*entry)();

    uint32 main (void){

    InitSysCtrl();
    Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
    InitFlash();

    Dint;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;

    InitPieVectTable();
    InitCpuTimer();

    init_gpio();
    Timer_Init();

    EINT;
    /*启用全局中断 INTM */
    ERTM;
    /*启用全局实时中断 DBGM */

    EALLOW;

    //看门狗服务
    ServiceDog ();

    //用0x0000插入闪存 API 使用的两个位置
    Flash_CPUScaleFactor = 0;
    Flash_CallbackPtr = 0;
    EDIS;

    //读取密码位置-这将解锁
    //仅当密码被擦除时才为 CSM。 否则
    //将不起作用。
    CsmPwl.PSWD0;
    CsmPwl.PSWD1;
    CsmPwl.PSWD2;
    CsmPwl.PSWD3;
    CsmPwl.PSWD4;
    CsmPwl.PSWD5;
    CsmPwl.PSWD6;
    CsmPwl.PSWD7;

    DisableDog ();
    LED1_ON;
    LED2_ON;
    LED3_ON;
    LED4_ON;
    LED5_ON;
    LED6_ON;
    LED7_ON;
    LED2_ON;

    国际振荡1Sel();
    InitPll (DSP28_PLLCR、DSP28_DIVSEL);

    DELAY_US (100);
    条目=(uint32 (*)())(sci_boot_addr);
    返回条目();

    ------------------------------------------ main.c ----------------------------

    我位于 C:\ti\c2000Ware_1_00_06_00\libraries\boot_rom\f2806x\v1_1\rom_sources\Release 目录中、请参阅"TMS320x2806x_boot_rom.map"文件
    我发现"sci_boot()"函数的地址是0x003ff699。

    但是,在 cmd 窗口中,将显示与下一个窗口相同的文本。

    此时的 DSP 状态为"SCIA_GetWordData()"函数
      " while (SciaRegs.SCIRXST.bit.RXRDY! = 1){}"。

    我认为应该首先调用"SelectMode()"或"Init_Boot"函数,而不是简单的"sci_boot()"函数调用。

    是这样吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    UINT32 SCI_Boot()充分初始化 SCI。 您应该能够像正在执行的那样调用函数。

    串行闪存编程器可能会向器件发送数据、这可能过于频繁、并且一个字节会丢失。

    1) 1)是否可以尝试从独立模式运行引导加载程序、以查看是否可以使其正常工作? 这意味着、请将器件引导至 SCI 引导模式并使用串行闪存编程器。

    2) 2)尝试降低波特率以查看这是否有帮助。

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

    1) 1)工作正常。 ( 我可以确认 txt 文件正常)

    2) 9600、1200、75 I 已设置三个波特率、但它没有影响。

    3) 3)我已确认 不能通过断点从"CopyData()"中退出。

    我已确认以下两个"shared_Boot.c"中"CopyData()函数的内容不同。

    C :\ti\c2000Ware_1_00_06_00\libraries\boot_rom\f2806x\v1_rom_sources\source\shared_Boot.c

    -------------------------- 1---CopyData()--1----

    //--------------------------------------
    
    void CopyData()
    {
    
    struct header{
    uint16 blocksize;
    uint32 DestAddr;
    }BlockHeader;
    
    uint16 wordData;
    uint16 i;
    
    //获取第一个块
    BlockHeader.blocksize =(* GetWordData)();
    
    //当块大小大于0时,将数据复制
    //到 DestAddr。 没有错误检查
    //假设 DestAddr 是有效
    的//内存位置
    
    while (BlockHeader.blocksize!=(UINT16) 0x0000
    ){
    BlockHeader.DestAddr = GetLongData();
    for (i = 1;i <= BlockHeader.blocksize;i++)
    {
    wordData =(* GetWordData)();
    *(uint16 *) BlockHeader.DestAddr++= wordData;
    }
    
    //获取下一个块的大小
    BlockHeader.blocksize =(*GetWordData)();
    }
    return;
    } 

    -------------------------- 1---CopyData()--1----

    2. c:\ti\c2000Ware_1_00_06_00\device_support\f2806x\examples\c28\f28069_sci_flash_kernel\shared_Boot.c

    -------------------------- 2---CopyData()--2----

    void
    CopyData (void)
    {
    结构标头
    {
    uint16 blocksize;
    uint32 DestAddr;
    uint32 ProgBuffAddr;
    } BlockHeader;
    
    uint16 wordcata;
    uint16状态;
    uint16 i、j;
    
    //
    //确保代码安全被禁用
    //
    CsmUnlock();
    
    EALLOW;
    Flash_CPUScaleFactor = scale_factor;
    Flash_CallbackPtr =空;
    EDIS;
    
    状态= Flash_Erase (((sectora | sectorb | SECTORC | SECORD)、
    FlashStatus (FlashStatus);
    if (status!= STATUS_SUCCESS)
    {
    //
    //返回
    //
    返回;
    }
    
    //
    //闪存擦除后,将校验和发送到 PC 程序。
    //
    SendCheckSum();
    
    //
    //获取第一个块的大小(以字为单位)
    //
    BlockHeader.blocksize =(* GetOnlyWordData)();
    
    //
    //当块大小大于0时,将数据复制到 DestAddr。 没有
    //错误检查,因为假定 DestAddr 是有效的内存位置
    //
    while (BlockHeader.blocksize!=(UINT16) 0x0000)
    {
    if (BlockHeader.blocksize > PROG_buffer_length)
    {
    //
    //块要大到适合我们的缓冲区,所以我们必须将它编程到中
    //块
    //
    BlockHeader.DestAddr = GetLongData();
    
    //
    //对尽可能多的完整缓冲区进行编程
    //
    for (j = 0;j <(BlockHeader.blocksize / PROG_buffer_length);j++)
    {
    BlockHeader.ProgBuffAddr =(uint32) progBuf;
    for (i = 1;i <= PROG_buffer_length;i++)
    {
    wordData =(* GetOnlyWordData)();
    *(uint16 *) BlockHeader.ProgBuffAddr++= wordData;
    }
    状态= Flash_Program (((UINT16 *) BlockHeader.DestAddr、
    (uint16 *) progBuf、PROG_buffer_length、&FlashStatus);
    
    if (status!= STATUS_SUCCESS)
    {
    返回;
    }
    BlockHeader.DestAddr += PROG_Buffer_length;
    
    //
    //闪存程序后,将校验和发送到 PC 程序。
    //
    SendCheckSum();
    }
    
    //
    //对剩余的内容进行编程
    //
    BlockHeader.ProgBuffAddr =(uint32) progBuf;
    for (i = 1;i <=(BlockHeader.blocksize % PROG_buffer_length);i++)
    {
    wordData =(* GetOnlyWordData)();
    *(uint16 *) BlockHeader.ProgBuffAddr++= wordData;
    }
    状态= Flash_Program (((UINT16 *) BlockHeader.DestAddr、
    (uint16 *) progBuf、(BlockHeader.blocksize %
    PROG_Buffer_length)、FlashStatus);
    
    if (status!= STATUS_SUCCESS)
    {
    返回;
    }
    
    //
    //闪存程序后,将校验和发送到 PC 程序。
    //
    SendCheckSum();
    }
    
    其他
    {
    //
    //块将适合我们的缓冲区、因此我们将在进行所有编程
    //一次
    //
    BlockHeader.DestAddr = GetLongData();
    BlockHeader.ProgBuffAddr =(uint32) progBuf;
    for (i = 1;i <= BlockHeader.blocksize;i++)
    {
    wordData =(* GetOnlyWordData)();
    *(uint16 *) BlockHeader.ProgBuffAddr++= wordData;
    }
    状态= Flash_Program (((UINT16 *) BlockHeader.DestAddr、
    (uint16 *) progBuf、BlockHeader.blocksize、&FlashStatus);
    if (status!= STATUS_SUCCESS)
    {
    返回;
    }
    
    //
    //闪存程序后,将校验和发送到 PC 程序。
    //
    SendCheckSum();
    }
    
    //
    //获取下一个块的大小
    //
    BlockHeader.blocksize =(* GetOnlyWordData)();
    }
    返回;
    } 

    -------------------------- 2---CopyData()--2----

    我认为第二个 shared_Boot.c 的内容是正确的。 是这样吗?

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

    引导加载程序使用回声通信来确保正确。 它接收一个字节并将该字节回传到主机以检查数据完整性。 然后、它将数据写入 RAM。

    内核使用校验和实现数据完整性。

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

    好久不见。


    我将忽略我发布的其他帖子、并关注此帖子。

    无法使用独立引导模式、因为"SciBoot.asm"位于 RAM 区域。
    我的位置是获取模式:仿真引导模式的闪存模式。

    我看到  帖子、并创建了一个"SciBoot.asm"文件并将其包含在项目中。

    https://e2e.ti.com/support/microcontrollers/c2000/f/171/p/246637/1515835?tisearch=e2e-sitesearch&keymatch=%20user:180128#pi320995=2

    当他将"SciBoot.asm"放在"RAML0"区域时
    其余应用程序位于"FLASHE"区域。

    MEMORY
    {
    PAGE 0:/* Program Memory */
    /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
    RAML0 :origin = 0x008000、length = 0x000800 /*片上 RAM 块 L0 */
    RAML1 :origin = 0x008800,length = 0x000400 /*片上 RAM 块 L1 */
    OTP :origin = 0x3D7800,length = 0x000400 /*片上 OTP */
    
    FLASHH :origin = 0x3D8000,length = 0x004000 /*片上闪存*/
    FLASHG :origin = 0x3DC000、length = 0x004000 /*片上闪存*/
    FLASHF :origin = 0x3E0000、length = 0x004000 /*片上闪存*/
    FLASHE :origin = 0x3E4000,length = 0x004000 /*片上闪存*/
    FLASHD :origin = 0x3E8000、length = 0x004000 /*片上闪存*/
    FLASHC :origin = 0x3EC000、length = 0x004000 /*片上闪存*/
    FLASHA :origin = 0x3F4000,length = 0x003F80 //片上闪存*/
    csm_RSVD:origin = 0x3F7F80,length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 */
    开始 :origin = 0x3F7FF6,length = 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 //
    csm_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /* FLASHA 的一部分。 FLASHA */
    
    FPUTABLES 中的 CSM 密码位置:origin = 0x3FD860,length = 0x0006A0//引导 ROM 中的 FPU 表*/
    IQTABLES:origin = 0x3FDF00,length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
    IQTABLES2:origin = 0x3FEA50,length = 0x00008C /*引导 ROM 中的 IQMath 表*/
    IQTABLES3:origin = 0x3FEADC,length = 0x0000AA/*引导 ROM 中的 IQMath 表*/
    
    ROM :origin = 0x3FF3B0,length = 0x000C10 /*引导 ROM */
    重置 :origin = 0x3FFFC0,length = 0x000002 引导 ROM 的/*部分*/
    向量 :origin = 0x3FFFC2,length = 0x00003E /*部分引导 ROM */
    
    第1页:/*数据存储器*/
    /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
    /*寄存器保留在第1页上 //
    
    boot_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM0 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
    RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    RAML2 :origin = 0x008C00,length = 0x000400 /*片上 RAM 块 L2 */
    RAML3 :origin = 0x009000、length = 0x001000//片上 RAM 块 L3 */
    RAML4 :origin = 0x00A000、length = 0x002000 /*片上 RAM 块 L4 */
    RAML5 :origin = 0x00C000、length = 0x002000 /*片上 RAM 块 L5 */
    RAML6 :origin = 0x00E000、length = 0x002000 /*片上 RAM 块 L6 */
    RAML7 :origin = 0x010000,length = 0x002000 /*片上 RAM 块 L7 */
    RAML8 :origin = 0x012000、length = 0x002000 /*片上 RAM 块 L8 */
    USB_RAM :origin = 0x040000、length = 0x000800 /* USB RAM*/
    FLASHB :origin = 0x3F0000、length = 0x004000 /*片上闪存*/
    }
    
    /*将段分配给内存块。
    注:
    DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
    闪存时执行
    ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
    */
    
    
    段
    {
    
    //分配程序区域:*/
    .cinit :> FLASHE、 PAGE = 0.Pinit
    :> FLASHE、 PAGE = 0.text
    :> FLASHE、 PAGE = 0
    .InitBoot :> FLASHE、 PAGE = 0
    codestart :>开始, PAGE = 0
    ramfuncs :LOAD = FLASHD,
    运行= RAML1、
    load_start (_RamfuncsLoadStart)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    load_size (_RamfuncsLoadSize)、
    PAGE = 0
    
    csmpasswds :>csm_PWL_P0、page = 0
    csm_rsvd :>csm_RSVD,page = 0
    
    /*分配未初始化的数据段:*/
    .stack :> RAMM0, PAGE = 1.ebss
    :> RAML2|RAML3, PAGE = 1
    .esysmem :> RAML2, PAGE = 1
    
    /*初始化段要进入闪存*/
    /*要使 SDFlash 对这些段进行编程、必须将它们分配到 PAGE 0 */
    .econst :> FLASHE、 PAGE = 0.switch
    :> FLASHE、 PAGE = 0
    
    //分配 IQ 数学区域:*/
    IQmath :> FLASHE、 PAGE = 0 /*数学代码*/
    IQmathTables :> IQTABLES,page = 0,type = NoLoad
    securebootfuncs :> RAML0, PAGE = 0
    //分配 FPU 数学区域:*/
    FPUmathTables :> FPUTABLES,PAGE = 0,TYPE = NOLOAD
    
    DLOG:>RAML7,PAGE = 1
    
    DMARAML5:> RAML5, PAGE = 1
    DMARAML6:> RAML6, PAGE = 1
    DMARAML7:> RAML7, PAGE = 1
    DMARAML8:> RAML8, PAGE = 1.
    
    /*如果调用 IQNexp()或 IQexp(),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    //
    /*
    IQmathTables2:> IQTABLES2,page = 0,type = NoLoad
    {
    
    IQMath.lib (IQmathTablesRam)
    
    }
    */
    /*如果调用 IQNasin ()或 IQasin (),请取消注释以下部分
    库中的函数、以便利用
    引导 ROM 中的相关 IQ Math 表(这可以节省空间和引导 ROM
    1个等待状态)。 如果此部分未注释、则为 IQmathTables2
    将被加载到其他存储器(SARAM、闪存等)中并将采用
    上行空间、但0等待状态是可能的。
    *
    /*
    IQmathTables3:> IQTABLES3,PAGE = 0,TYPE = NOLOAD
    {
    
    IQMath.lib (IQmathTablesRam)
    
    }
    //
    
    /*.reset 是编译器使用的标准段。 它包含
    用于 C 代码的_c_int00起始地址的*//*。 /*
    /*使用引导 ROM 时
    ,不需要此部分和 CPU 矢量*//*表。 因此,默认类型设置为*/
    /* DSECT */
    .reset :>重置, PAGE = 0、TYPE = DSECT
    向量 :>引导程序,page = 0,type = DSECT
    
    }
    
    /*/===========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    * 


    运行"serial_flash_programmer"作为"Visual Studio"的结果
    "F05_DownloadImage.CPP"文件卡在与图片相同的位置。


    "ReadFile"函数在哪里读取某些内容以及为什么不读取这些内容?

    谢谢你

    Kim

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    主机正在等待接收数据。 这可能是因为器件或主机丢失了一些数据。

    我建议使用 VS 和 CCS 来进行调试。 使用 IDE 和调试器运行主机和器件、以帮助自己调试此问题。

    谢谢、
    SAL