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:引导加载程序开发

Guru**** 2538930 points
Other Parts Discussed in Thread: TMS320F28069, CONTROLSUITE, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/604893/compiler-tms320f28069-tms320f28069-bootloader-development

器件型号:TMS320F28069
Thread 中讨论的其他器件: controlSUITEC2000WARE

工具/软件:TI C/C++编译器

[背景]

我想为 TMS320F28069控制器开发一个引导加载程序。 但在这里、我想通过 UART B 下载代码(因为 UART A - GPIO 引脚已经用于其他用途、而且我不想使用 GPIO 设置来选择引导模式-因为这些引脚已经被用于不同用途)。  

因此、我在这里尝试更新控制器的引导 ROM 代码(选择引导模式功能)、在这里 、通过一些定制、如复位控制器、默认情况下将切换到 SCI 引导模式。

同样、我对"Path:<controlSUITE>\libs\utilities\boot _rom\2806x\2806x_boot_rom_v1_source"上共享的代码进行了一些修改

当我最初导入此代码时、我发现以下错误。

错误1 -->"./source/I2C_Boot.c,第63行:致命错误:无法打开源文件"Boot.h"
错误2 -->"./lnk/TMS320x2806x_boot_rom_lnk.cmd,第56行:错误:找不到文件"Flash2806x_API_V100.lib"

要解决此问题、

1) 1)包含以下路径:包含在"包含选项"菜单中、
"${workspace_loc:/${ProjName}/F2806x_headers/include}"
"${workspace_loc:/${ProjName}/include}"

2) 2)将"Flash2806X_API_V100.lib"文件从路径"C:\ti\controlSUITE\libs\utilities\flash_api\2806x\v100a\lib"复制到工程工作空间位置

现在我没有收到错误、但下面将显示警告。

****为项目2806X_BOOT_ROM 构建配置版本****

警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI ":无法确定兼容性

警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性

警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI ":无法确定兼容性

警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
警告:"../Flash2806x_API_V100.lib 中缺少构建属性供应商部分 TI  ":无法 确定兼容性
'完成的构建目标:TMS320x2806x_boot_rom.out' '''
****构建完成****

[查询]

1]我的方法是否正确? 我们能否开发自定义引导加载程序、以便复位时的控制器默认直接跳转到 SCI 模式(UART B)?

2]您能告诉我如何解决这些警告吗?

3]当我尝试将程序下载到目标硬件时、我遇到以下错误。
C28xx:加载程序:程序的一个或多个部分属于不可写的存储器区域。 这些区域实际上不会写入目标。 检查链接器配置和/或存储器映射。
C28xx:文件加载程序:验证失败:地址0x3FF72C@程序的值不匹配请验证目标存储器和存储器映射。
C28xx:GEL:文件:C:\Source Code\2806x_boot_rom\Release\TMS320x2806x_boot_rom.out:发生数据验证错误、文件加载失败。

4]如何编程 OTP 存储器位置- OTP_KEY 和 OTP_BMODE?


请求您回答上述问题。

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

    引导 ROM 源代码在 ROM 中(一次性可编程)、因此无法实际加载到器件中。 要创建自定义引导加载程序、必须在闪存中放入自定义内核、并将闪存引导设置为默认引导模式。

    请参阅 F2806x 器件支持内的 F28069闪存内核示例。 这将是您的最佳参考。

    有关 OTP 位置的更多信息、请参阅 TRM: http://www.ti.com/lit/spruh18

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

    感谢你的答复。

    现在我了解到我们无法修改 TMS320F2806x 控制器的 InitBoot 函数。 [路径中提供的代码: \libs\utilities\boot_rom\2806x\2806x_boot_rom_v1_1仅供开发人员参考]。

    我的要求是我应该能够通过串行端口 B 对应用程序进行编程
    因此、您能否告诉我们如何使用串行端口 B 开发引导加载程序? 请求您共享相同的参考。

    在文档"SPRUH18G"页209/1196中、最后一行"跳转至闪存存储器中的分支指令"部分中提到了它、
    "您需要事先在位置0x3F 7FF6编程分支指令、将代码执行重定向到自定义引导加载程序或应用程序代码。"
    那么、使用此参考、我们是否可以使用串行端口 B 开发自定义引导加载程序? 如果是、您能否与我们分享同样的指南。

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

    请参阅此闪存内核示例、它使用 SCI A 并可轻松调整为 SCI B:C:\ti\c2000Ware_1_00_01_00\device_support\f2806x\examples\c28\f28069_flash_kernel

    此外、Sal: e2e.ti.com/.../1530799将在此处回答您对第二点的一些进一步说明

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

    我通过 Sal 读取了线程:e2e.ti.com/.../1530799

    我遵循了他最后的评论并修改了路径"C:\ti\controlSUITE\device_support\f2806x\v151\F2806x_examples_ccsv5\f28069_flash_kernel"中给出的代码
    以从 ROM 引导。

    --------------------------------------------------------------------
    Ben、

    富拉诺是正确的。 请访问 www.ti.com/lit/spruh18

    第206页的 Boot Rom 部分内容如下:

    跳转至闪存中的分支指令。
    跳转至闪存是 Get Mode 引导选项的默认行为。 跳转至闪存也可用作仿真引导选项。

    在此模式下、引导 ROM 软件将器件配置为28x 操作并直接分支到位置0x3F 7FF6。 这个位置恰好在128位代码安全模块(CSM)密码位置之前。 您需要事先在位置0x3F 7FF6编程分支指令、将代码执行重定向到自定义引导加载程序或应用程序代码。"

    您有几个选项。

    您可以从 main 返回、该主函数应调用_ExitBoot。
    您可以直接在内核末尾分支到应用程序起始地址
    您可以在0x3F 7FF6处对分支指令进行编程、该分支指令将跳转到应用程序的开头。 这将导致 C28x 在引导至闪存时执行您的闪存应用程序。 此外、您可以通过构建和编译应用程序以从闪存运行来实现此目的。 链接器和编译器将写入0x3F 7FF6、以便 C28x 在引导至闪存时引导至您的应用。
    希望这对您有所帮助。

    SAL
    --------------------------------------------------------------------

    我在引导加载程序代码中进行了以下更改。
    -修改了从 ROM 引导的链接器文件。
    -更改了以使用 UART B 而不是 UART A
    -使用[#pragma CODE_SECTION (CopyData、"ramfuncs")从 RAM 执行"CopyData()"函数;]
    -闪存扇区 A 用于引导加载程序代码
    注意:在引导加载程序中、我没有调用_InitBoot 函数和_ExitBoot 函数。 由于引导加载程序从闪存中执行、因此此处的入口地址为_c_int00

    在单独的工作空间中、我创建了另一个示例应用项目、其中应用代码位于闪存扇区 D 中
    -我确实需要对应用程序代码进行设置才能获取-boot8、-SCI-A、*。txt 格式的可执行十六进制文件

    现在、要将 application.txt 文件下载到控制器中、我执行了以下步骤。
    使用" XDS100v2 JTAG 调试探针(14引脚 TI 版本)"下载的引导加载程序代码(发布模式)
    2.我将断点放置在 UINT32 SCI_Boot ()函数(释放模式)的最后一行。 这是"return EntryAddr"语句。 成功复制应用程序文件后检查执行流程。
    ----------------------------------------------------
    uint32 SCI_Boot ()

    uint32 EntryAddr;

    //将 GetWordData 标记为的 SCI-A 版本
    //函数。 GetOnlyWordData 是函数的指针。
    //此版本不会向每个字符发回回显。
    GetOnlyWordData = SCIA_GetOnlyWordData;

    SCIA_Init();
    SCIA_AutobaudLock();
    校验和= 0;

    //如果键值无效,则中止加载
    //并返回闪存入口点。
    if (SCIA_GetOnlyWordData()!= 0x08AA)返回 FLASH_entry_point;

    ReadReservedFn();

    EntryAddr = GetLongData();

    CopyData();

    返回 EntryAddr;

    ----------------------------------------------------

    然后使用基于 PC 的实用程序通过 UART B 发送可执行 application.txt 文件

    在这里、我发现了以下观察结果
    当我尝试使用从 application.txt 文件读取的值写入位置0x3F 7FF6时、我的代码被终止。
    在这里、我认为位置0x3F 7FF6已经包含引导加载程序的起始地址、因此可能是我无法在该位置写入该值的原因。 因此,为了继续操作,我通过输入条件绕过了该特定地址的内存写入操作:
    if (BlockHeader.DestAddr!= 0x003F7FF6)

    状态= Flash_Program ((((UINT16 *) BlockHeader.DestAddr、(UINT16 *) progBuf、BlockHeader.blockSize、&FlashStatus);
    if (status!= STATUS_SUCCESS)

    返回;




    在进行上述条件之后、我的 application.txt 文件被写入闪存-扇区 D 成功地与地址"0x003F7FF6"分开

    2.成功执行 CopyData()函数后,"return EntryAddr"上的断点已命中。 当我执行步调试(F5键)时、我的执行流程进入 exit.c 中的"void exit (int status) function"

    预期行为是、一旦我调用"return EntryAddr"函数、应用程序代码应开始运行。 但不幸的是,没有发生这种情况。


    请告诉我哪里出错了吗?
    为什么在成功运行 CopyData()应用程序后不调用我的应用程序?


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

    请将此讨论保留在一个主题中。

    e2e.ti.com/.../2239838

    SAL