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.

[参考译文] TMS320F2800157:设置 OTP BOOT 引脚和引导模式

Guru**** 2696755 points

Other Parts Discussed in Thread: SYSCONFIG, UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1553977/tms320f2800157-setting-otp-bootpin-and-bootmode

器件型号: TMS320F2800157
Thread 中讨论的其他器件: SYSCONFIGUNIFLASH

工具/软件:

您好、  

我有一个 F2800157 系列 LaunchPad、 我对如何在 OTP 中配置 bootpin/BOOTMODE 信息感到困惑。  我知道我只需要写入一次、因此我认为它可以是开发一个程序、也可以只是输出加载一次的十六进制文件。  仅在 OTP 中设置这些值的十六进制文件是理想情况、因为我计划将其发送到子模块以加载器件。

我从 280015x 技术参考中了解到、对于 I2C 模式/闪存、我需要将 BOOTDEF0 更改为 0x07、而 BMSP0 更改为 GPIO32 - 0x32(如下所示)。

5.4.3.2 一个引导模式选择引脚

此用例演示了一个应用程序使用一个引导模式选择引脚进行选择的场景

引导至闪存或使用 CAN 引导。

  1. 按如下方式对 OTP 中的 BOOTPIN_CONFIG 位置进行编程:
  • 将 BOOTPIN_CONFIG.BMSP0 设置为用户指定的 GPIO、例如 GPIO0 的 0x0
  • 将 BOOTPIN_CONFIG.BMSP1 设置为 0xFF
  • 将 BOOTPIN_CONFIG.BMSP2 设置为 0xFF
  • 将 BOOTPIN_CONFIG.KEY 设置为 0x5A 以使引导 ROM 将这些寄存器位视为有效并使用自定义引导表。
  1. 对器件的 BOOTDEF 位置选项进行编程。 这基本上会设置特定于器件的引导模式表。 有关表中要设置的有效 BOOTDEF 值、请参阅第 5.7.8 节。
  • 将 BOOTDEF.BOOTDEF0 设置为 0x02 以进行 CAN 0x07 I2C 引导。 这组可引导至引导表索引 0。
  • 将 BOOTDEF.BOOTDEF1 设置为 0x03 以引导至闪存(入口地址选项 0)。 这会将闪存引导设置为引导表索引 1。

从下面的 (5.8 和 5.7) 及更高的 (5.4.3.2) 来看、我似乎需要将 0xFF32 写入地址 0x78008 (Z1-GPREG1)、将 0x5AFF 写入地址 0x78009 (Z1-GPREG1)、将 0xFF37 写入地址  0x7800C (Z1-GPREG3)。

您能否提示我如何使用 CCS 20 创建十六进制文件?

提前感谢、

John

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

    您好、John:

    从下面 (5.8 和 5.7) 及以上 (5.4.3.2)、我似乎需要将 0xFF32 写入地址 0x78008 (Z1-GPREG1)、将 0x5AFF 写入地址 0x78009  (Z1-GPREG1)、将 0xFF37 写入地址 0x7800C (Z1-GPREG3)

    根据您的要求:

    • 写入 0x5AFFFF 20 至  0x78008 、以将 GPIO32 (32 = 0x20) 配置为 BMSP0 并禁用 BMSP1。
      • GPIO 编号以十六进制编码、因此您必须从十进制转换
    • 写入 0xFFFF 0307. 至 0x7800C、以配置 BOOTDEF0=I2C 引导选项 0 和 BOOTDEF1=Flash 引导选项 0
      • 每个 BOOTDEF#条目具有 8 位宽度

    有关对这些配置进行编程、请参阅 本用户指南中的 5.5 使用闪存 API 插件在 OTP 中写入值。 您可以使用闪存 API 插件根据引导配置对相应的 OTP 位置进行编程。 本用户指南对于理解 C2000 引导流程也非常有用。  

    您还可以使用 SysConfig 中的 DCSM 工具以图形方式配置引导配置: https://www.ti.com/lit/an/spracp8a/spracp8a.pdf

    若要生成十六进制文件、请参阅《C28x 汇编语言工具指南》中的第 12 章以了解输出格式选项: https://www.ti.com/lit/ug/spru513/spru513.pdf。 十六进制实用程序内置在 CCS 中 (Project Properties > Build > Tools > C2000 Hex Utility)。  

    此致、

    马特

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

    尊敬的 Matt:

    你的解释似乎是完整的,我会尽快尝试。  我被吸进了一个下线的情况,将不得不首先支持它。

    将保持该主题开放、直到我确认并询问其他澄清问题。

    John

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

    您好:

    听起来不错、如果 您对此主题有任何问题、请随时提问。

    此致、

    马特

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

    只需保持线程处于活动状态、因为我仍在处理线程。  谢谢。

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

    您好、John:

    不用担心、如果您有任何问题、我还在这里。

    此致、

    马特

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

    只是延长我的答复时间,因为我知道这些项目 30 天后关闭。  看起来我将在一周内重新回到这个问题上。

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

    您好、John:

    没错、线程会在 30 天后自动关闭。 我通常在那之前检查以确认解决方案。  

    此致、

    马特

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

    尊敬的 Matt:

    完成  Z1-GPREG1 和 Z1-GPREG3 设置、并同意所提供的内容。

    这是我的问题 — 我想在制造过程中配置这两个 OTP 寄存器、但看不到仅支持设置这些寄存器的解决方案。  

    查看了 SysConfig 中的 DCSM 工具,但它采用了一个程序,并且似乎设置了这两个之外的其他寄存器 — 如下所示。

    要说明 计划生产的当前系统:

    • Z1-GPREG1 和 Z1-GPREG3 设置:无法仅为这些寄存器和应用程序创建十六进制文件来加载十六进制文件。
    • I2C 中包含的引导加载程序:我有一个 CCS 开发项目、它将使用 HEX2000 输出到十六进制文件、供我的供应商加载 I2C PROM。
    • TMS320 闪存中包含的应用程序: 供应商可以通过 XDS110 USB 调试探针加载或对 IC 进行预编程。

    我已经查看了 UniFlash、我看到这里需要您确认。  

    • 使用“Program"选项“选项卡->选择“Load Image“->“Load Image“->“Verify Image“将应用程序加载到 TMS320 闪存
    •  使用 Settings and Utility 选项卡->  GPREG (BOOTCTRL) 设置 Z1-GPREG1 和 Z1-GPREG3、如下所示进行设置
      Z1-GPREG1 (0x78008)(32 位)0x 5AFFFF20
      Z1-GPREG2 (0x7800A)(32 位)0x FFFFFFFF
      Z1-GPREG3 (0x7800C)(32 位)0x 0xFFFF0307
      Z1-GPREG4 (0x7800E)(32 位)0x FFFFFFFF
      ->程序

    如果这是可行的、似乎也有一些自动化支持。   一旦我们确认该能力存在、我就可以进一步调查。

    请告诉我您的想法和感谢您的帮助、

    John

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

    您好:

    查看了 SysConfig 中的 DCSM 工具,但该工具采用了一个程序,似乎设置了这两个之外的其他寄存器 — 请参见下面的

    您可以将 DCSM 工具输出用作模板、并防止在 dcsm.asm 中对其他寄存器进行编程(注释掉或删除)。 我会注意到大多数寄存器被设置为其默认值(BMSP 和 BOOTDEF 除外)。 用户可以通过检查存储器浏览器中的存储器位置来确认该操作。

    如果这是可行的、似乎也有一些自动化支持。   一旦我们确认能力存在、我就可以进一步调查。

    是的、这应该是可行的。 Uniflash 具有自动化支持、请参阅以下资源:

    1. https://software-dl.ti.com/ccs/esd/uniflash/docs/latest_qsguide.html#command-line-interface
    2.  TMS320F28P550SJ:Uniflash CLI 解锁和编程 
      1. 注意: Thread 用于对 CSMPSWD 进行编程、但可应用于 GPREG1/3
        1. Z1GPREGProgram 是您需要调用的、作为执行操作的参数
          1. 操作按钮名称可在 CCS 的 TMS320F280015x_FlashProperties.xml 中找到(CCS_BASE > DebugServer > propertyDB 文件夹)
        2. 您必须设置 Z1PGREG 值、例如:-b Z1GPREGProgram -s Z1GPREG1=0xFFFFFFFF  

    此致、

    马特

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

    尊敬的 Matt:

    尝试将 UniFlash 与 F2800157 LaunchPad 配合使用。  可以发现 LaunchPad 并启动连接。  由于我尝试学习如何使用 UniFlash 并且不想写任何内容、因此我尝试读取存储器并收到两个错误:

    错误!
    无法读取未定义的属性(读取'addListener')

    Texas Instruments XDS110 USB 调试探针/IcePick_C_0
    连接到目标时出错:(错误–2131 @ 0x0)无法访问器件寄存器。 重置器件、然后重试此操作。 如果错误仍然存在、请确认配置、对电路板进行下电上电、和/或尝试更可靠的 JTAG 设置(例如下 TCLK)。 (仿真包 20.3.0.3656)

    我找到了 039 LaunchPad 的以下链接、出现了类似的错误、但没有看到任何修复: LAUNCHXL-F280039C

    我从会话中下载了 ccxml 文件、但没有看到任何可以修改的内容来解决问题。




        
        
              
              
              
              
          
            
          
        
      

    希望您能提出一个解决方案。

    John

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

    您好、John:

    您是否可以尝试将 ccxml 修改为以下内容(参见第 10 行)? 看起来您使用的是 4 引脚 JTAG、而不是 2 引脚 JTAG (cJTAG)- LaunchPad 需要 cJTAG。 我认为 在 UniFlash 中这是一个错误、可以考虑修复此问题。

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <configurations XML_version="1.2" id="configurations_0">
        <configuration XML_version="1.2" id="Texas Instruments XDS110 USB Debug Probe_0">
            <instance XML_version="1.2" desc="Texas Instruments XDS110 USB Debug Probe_0" href="connections/TIXDS110_Connection.xml" id="Texas Instruments XDS110 USB Debug Probe_0" xml="TIXDS110_Connection.xml" xmlpath="connections"/>
            <connection XML_version="1.2" id="Texas Instruments XDS110 USB Debug Probe_0">
                <instance XML_version="1.2" href="drivers/tixds510icepick_c.xml" id="drivers" xml="tixds510icepick_c.xml" xmlpath="drivers"/>
                <instance XML_version="1.2" href="drivers/tixds510c28x.xml" id="drivers" xml="tixds510c28x.xml" xmlpath="drivers"/>
                <instance XML_version="1.2" href="drivers/tixds510cs_child.xml" id="drivers" xml="tixds510cs_child.xml" xmlpath="drivers"/>
                <instance XML_version="1.2" href="drivers/tixds510ajsm.xml" id="drivers" xml="tixds510ajsm.xml" xmlpath="drivers"/>
                <property Type="choicelist" Value="4" id="SWD Mode Settings"/>
                <platform XML_version="1.2" id="platform_0">
                    <instance XML_version="1.2" desc="TMS320F2800157_0" href="devices/f2800157.xml" id="TMS320F2800157_0" xml="f2800157.xml" xmlpath="devices"/>
                </platform>
            </connection>
        </configuration>
    </configurations>

    此致、

    马特

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

    尊敬的 Matt:

    获得 UniFlash 以查看 LauchPad 上的存储器、因此只需要设置 OTP。  运行后自动执行该操作。

    下面是我需要帮助处理的下一个问题:我将应用程序加载到 LauchPad 上的闪存中(地址为 0x80000)。  我创建了一个驻留在 I2C EEPROM 中的引导加载程序。  由于引导加载程序加载到 RAM、我正在尝试在  F2800157 LaunchPad 上启动它并跳转到 0x80000(应用程序)、以便可以证明完整的引导过程。

    我已经检查了应用程序映射文件、 开始地址是 00080000。  当我在调试中在 RAM 中运行引导加载程序并 在 引导加载程序结束时执行跳转时、它会将 PC 设置为 args_main.c.obj、并且在_c_int00 中似乎挂起。  我是否可以设置调试器以允许其执行应用程序、即使我无法通过调试器进行调试?

    提前感谢、

    John  

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

    尊敬的 Matt:

    做了更多的研究。  下面是我使用的语法 不起作用。  我已在调试器 JumpAddr 中验证包含 0x80000

     退货 (JumpAddr);  
    从“Disassembly"视“视图中、我得到了这组代码:
    $C$L10
    0x00905F 0644        MOVL         ACC、 *- SP[4]
    0x009060 FE86        SUB         SP、 #6
    0x009061 0006        LRETR   
    这看起来是正确的吗?
    John    
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好:

    这组代码看起来是正确的。 ACC 是否加载了正确的返回值 (0x80000)?

    您如何分支到应用程序? 您是否验证了应用程序代码是否由引导加载程序正确编程(通过 Run > Load > Verify Program)?

    此致、

    马特

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

    尊敬的 Matt:

    该应用程序已经通过直接引导至闪存进行了验证、并且所有功能都具备。  因此、如果我没有将引导加载程序加载到 RAM 中、就能够直接运行应用程序。

    我将引导加载程序加载到 RAM、并通过以下代码单步调试器、ACC 在执行 return (JumpAddr) 后其中包含 0x80000。

      //测试引导标志状态

      IF (BFlag == 0x01)
      {
        GPIO_writePin (LED_BUSY、0);//GpioDataRegs.GPASSET.bit.GPIO30 = 1;// LED 亮起
        AppReload ();
        JumpAddr = ADR_BOOT_RAM;       //模式引导:api+algo en RAM
      }
      暴露
      {
       GPIO_writePin (LED_BUSY、1);//GpioDataRegs.GPACLEar.bit.GPIO30 = 1;// LED 熄灭
       JumpAddr = flash_entry_point;  //跳转到闪存:应用程序
      }

       退货 (JumpAddr);
    我刚刚注意到我的重新加载路径有问题(跳转到 RAM)、但我会解决这个问题、因为我们仍然需要修复跳转到闪存。
    谢谢、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Matt:

    我只是使用 asm(“  lb 0x8000“)强行将其跳转到闪存; 想知道返回为什么不起作用。

    John

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

    您好、John:

    可能会发生的情况是 codestartbranch.asm 不处理 从引导加载程序的 main() 返回的地址。  请尝试使用 F280015x 闪存内核使用的 codestartbranch.asm、该 函 数在 ExitBoot 例程中处理此问题。

    ;//###########################################################################
    ;//
    ;// FILE:   flash_kernel_ex3_codestartbranch.asm
    ;//
    ;// TITLE: Branch for redirecting code execution after boot.
    ;//
    ;// For these examples, code_start is the first code that is executed after
    ;// exiting the boot ROM code.
    ;//
    ;// The codestart section in the linker cmd file is used to physically place
    ;// this code at the correct memory location. This section should be placed
    ;// at the location the BOOT ROM will re-direct the code to. For example,
    ;// for boot to FLASH this code will be located at 0x80000.
    ;//
    ;// In addition, the example f280013x projects are setup such that the codegen
    ;// entry point is also set to the codestart label. This is done by linker
    ;// option -e in the project build options. When the debugger loads the code,
    ;// it will automatically set the PC to the "entry point" address indicated by
    ;// the -e linker option. In this case the debugger is simply assigning the PC,
    ;// it is not the same as a full reset of the device.
    ;//
    ;// The compiler may warn that the entry point for the project is other then
    ;//  _c_init00. _c_init00 is the C environment setup and is run before
    ;// main() is entered. The codestart code will re-direct the execution
    ;// to _c_init00 and thus there is no worry and this warning can be ignored.
    ;//
    ;//###########################################################################
    ;//
    ;//
    ;// $Copyright:
    ;// Copyright (C) 2021 Texas Instruments Incorporated - http://www.ti.com/
    ;//
    ;// Redistribution and use in source and binary forms, with or without 
    ;// modification, are permitted provided that the following conditions 
    ;// are met:
    ;// 
    ;//   Redistributions of source code must retain the above copyright 
    ;//   notice, this list of conditions and the following disclaimer.
    ;// 
    ;//   Redistributions in binary form must reproduce the above copyright
    ;//   notice, this list of conditions and the following disclaimer in the 
    ;//   documentation and/or other materials provided with the   
    ;//   distribution.
    ;// 
    ;//   Neither the name of Texas Instruments Incorporated nor the names of
    ;//   its contributors may be used to endorse or promote products derived
    ;//   from this software without specific prior written permission.
    ;// 
    ;// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    ;// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    ;// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ;// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    ;// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    ;// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    ;// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ;// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ;// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    ;// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    ;// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    ;// $
    ;//###########################################################################
    
    ***********************************************************************
    
    WD_DISABLE  .set  1    ;set to 1 to disable WD, else set to 0
    
        .ref _c_int00
        .ref main
        .global code_start
        .global ExitBoot
    
    ***********************************************************************
    * Function: codestart section
    *
    * Description: Branch to code starting point
    ***********************************************************************
    
        .sect "codestart"
        .retain
    
    code_start:
        .if WD_DISABLE == 1
            LB wd_disable       ;Branch to watchdog disable code
        .else
            LB _c_int00         ;Branch to start of boot._asm in RTS library
        .endif
    
    ;end codestart section
    
    ***********************************************************************
    * Function: wd_disable
    *
    * Description: Disables the watchdog timer
    ***********************************************************************
        .if WD_DISABLE == 1
    
        .text
    wd_disable:
        SETC OBJMODE        ;Set OBJMODE for 28x object code
        EALLOW              ;Enable EALLOW protected register access
        MOVZ DP, #7029h>>6  ;Set data page for WDCR register
        MOV @7029h, #0068h  ;Set WDDIS bit in WDCR to disable WD
        EDIS                ;Disable EALLOW protected register access
        LB _c_int00         ;Branch to start of boot._asm in RTS library
        ;LCR main
    
     ; Cleanup and exit.  At this point the EntryAddr
    ; is located in the ACC register
        LB  ExitBoot
        .endif
    
    ;end wd_disable
    
    ;-----------------------------------------------
    ; ExitBoot
    ;-----------------------------------------------
    ;-----------------------------------------------
    ;This module cleans up after the boot loader
    ;
    ; 1) Make sure the stack is deallocated.
    ;    SP = 0x400 after exiting the boot
    ;    loader
    ; 2) Push 0 onto the stack so RPC will be
    ;    0 after using LRETR to jump to the
    ;    entry point
    ; 2) Load RPC with the entry point
    ; 3) Clear all XARn registers
    ; 4) Clear ACC, P and XT registers
    ; 5) LRETR - this will also clear the RPC
    ;    register since 0 was on the stack
    ;-----------------------------------------------
    
    ExitBoot:
    
    __stack:    .usect ".stack",0
    
    ;-----------------------------------------------
    ;   Insure that the stack is deallocated
    ;-----------------------------------------------
    
        MOV SP,#__stack
    
    ;-----------------------------------------------
    ; Clear the bottom of the stack.  This will endup
    ; in RPC when we are finished
    ;-----------------------------------------------
    
        MOV  *SP++,#0
        MOV  *SP++,#0
    
    ;-----------------------------------------------
    ; Load RPC with the entry point as determined
    ; by the boot mode.  This address will be returned
    ; in the ACC register.
    ;-----------------------------------------------
    
        PUSH ACC
        POP  RPC
    
    ;-----------------------------------------------
    ; Put registers back in their reset state.
    ;
    ; Clear all the XARn, ACC, XT, and P and DP
    ; registers
    ;
    ; NOTE: Leave the device in C28x operating mode
    ;       (OBJMODE = 1, AMODE = 0)
    ;-----------------------------------------------
        ZAPA
        MOVL  XT,ACC
        MOVZ  AR0,AL
        MOVZ  AR1,AL
        MOVZ  AR2,AL
        MOVZ  AR3,AL
        MOVZ  AR4,AL
        MOVZ  AR5,AL
        MOVZ  AR6,AL
        MOVZ  AR7,AL
        MOVW  DP, #0
    
    ;------------------------------------------------
    ;   Restore ST0 and ST1.  Note OBJMODE is
    ;   the only bit not restored to its reset state.
    ;   OBJMODE is left set for C28x object operating
    ;   mode.
    ;
    ;  ST0 = 0x0000     ST1 = 0x0A0B
    ;  15:10 OVC = 0    15:13      ARP = 0
    ;   9: 7  PM = 0       12       XF = 0
    ;      6   V = 0       11  M0M1MAP = 1
    ;      5   N = 0       10  reserved
    ;      4   Z = 0        9  OBJMODE = 1
    ;      3   C = 0        8    AMODE = 0
    ;      2  TC = 0        7 IDLESTAT = 0
    ;      1 OVM = 0        6   EALLOW = 0
    ;      0 SXM = 0        5     LOOP = 0
    ;                       4      SPA = 0
    ;                       3     VMAP = 1
    ;                       2    PAGE0 = 0
    ;                       1     DBGM = 1
    ;                       0     INTM = 1
    ;-----------------------------------------------
    
        MOV  *SP++,#0
        MOV  *SP++,#0x0A0B
        POP  ST1
        POP  ST0
    
    ;------------------------------------------------
    ;   Jump to the EntryAddr as defined by the
    ;   boot mode selected and continue execution
    ;-----------------------------------------------
    
        LRETR
    
    ;eof ----------
    
    	.end
    
    
    ;//
    ;// End of file.
    ;//
    

    此致、

    马特

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

    尊敬的 Matt:

    这是我运行的 F280015x codestartbranch.asm 的副本。  我甚至剪切并粘贴了您的副本、这不会改变执行方式、因为它仍然返回  args_main.c、然后返回 boot28.asm。

    ;//###########################################################################
    ;//
    ;// FILE:   f280015x_codestartbranch.asm
    ;//
    ;// TITLE: Branch for redirecting code execution after boot.
    ;//
    ;// For these examples, code_start is the first code that is executed after
    ;// exiting the boot ROM code.
    ;//
    ;// The codestart section in the linker cmd file is used to physically place
    ;// this code at the correct memory location. This section should be placed
    ;// at the location the BOOT ROM will re-direct the code to. For example,
    ;// for boot to FLASH this code will be located at 0x80000.
    ;//
    ;// In addition, the example f280015x projects are setup such that the codegen
    ;// entry point is also set to the codestart label. This is done by linker
    ;// option -e in the project build options. When the debugger loads the code,
    ;// it will automatically set the PC to the "entry point" address indicated by
    ;// the -e linker option. In this case the debugger is simply assigning the PC,
    ;// it is not the same as a full reset of the device.
    ;//
    ;// The compiler may warn that the entry point for the project is other then
    ;//  _c_init00. _c_init00 is the C environment setup and is run before
    ;// main() is entered. The codestart code will re-direct the execution
    ;// to _c_init00 and thus there is no worry and this warning can be ignored.
    ;//
    ;//###########################################################################
    ;//
    ;//
    ;// $Copyright:
    ;// Copyright (C) 2024 Texas Instruments Incorporated - http://www.ti.com/
    ;//
    ;// Redistribution and use in source and binary forms, with or without 
    ;// modification, are permitted provided that the following conditions 
    ;// are met:
    ;// 
    ;//   Redistributions of source code must retain the above copyright 
    ;//   notice, this list of conditions and the following disclaimer.
    ;// 
    ;//   Redistributions in binary form must reproduce the above copyright
    ;//   notice, this list of conditions and the following disclaimer in the 
    ;//   documentation and/or other materials provided with the   
    ;//   distribution.
    ;// 
    ;//   Neither the name of Texas Instruments Incorporated nor the names of
    ;//   its contributors may be used to endorse or promote products derived
    ;//   from this software without specific prior written permission.
    ;// 
    ;// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
    ;// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
    ;// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    ;// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
    ;// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
    ;// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
    ;// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    ;// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    ;// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
    ;// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
    ;// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    ;// $
    ;//###########################################################################
    
    ***********************************************************************
    
    WD_DISABLE  .set  1    ;set to 1 to disable WD, else set to 0
    
        .ref _c_int00
        .global code_start
    
    ***********************************************************************
    * Function: codestart section
    *
    * Description: Branch to code starting point
    ***********************************************************************
    
        .sect "codestart"
        .retain
    
    code_start:
        .if WD_DISABLE == 1
            LB wd_disable       ;Branch to watchdog disable code
        .else
            LB _c_int00         ;Branch to start of boot._asm in RTS library
        .endif
    
    ;end codestart section
    
    ***********************************************************************
    * Function: wd_disable
    *
    * Description: Disables the watchdog timer
    ***********************************************************************
        .if WD_DISABLE == 1
    
        .text
    wd_disable:
        SETC OBJMODE        ;Set OBJMODE for 28x object code
        EALLOW              ;Enable EALLOW protected register access
        MOVZ DP, #7029h>>6  ;Set data page for WDCR register
        MOV @7029h, #0068h  ;Set WDDIS bit in WDCR to disable WD
        EDIS                ;Disable EALLOW protected register access
        LB _c_int00         ;Branch to start of boot._asm in RTS library
    
        .endif
    
    ;end wd_disable
    
        .end
    
    ;//
    ;// End of file.
    ;//
    

    我想我看到了这个问题。  我正在进行调试、方法是直接从 RAM 运行它、而不使用引导引脚引导我进入引导加载程序。  那么、当我将代码用作引导加载程序时、包含闪存位置的返回地址应该起作用?   

    同时、似乎我应该  在使用引导引脚之前使用 asm(“ lb 0x8000“)来检查代码。

       使用 bootpin 时离开 asm(“ lb 0x8000“)是否存在任何问题?

    提前感谢、

    John

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

    您好、John:

    真奇怪。 我刚刚在设置中尝试了它(使用 CCS 调试模式,而不是通过复位)、并且能够成功地返回 0x80000。 您是否可以尝试模拟引导至 RAM 并查看这是否是问题?

       在使用 bootpin 时离开 asm(“ lb 0x8000“)是否有任何问题?

    我假设您的意思是 0x80000。 使用 LB 指令不应该有任何问题、我们在 LFU 示例实现中使用此方法。

    此致、

    马特

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

    尊敬的 Matt:

    我同意这个奇怪的地方、因为我要使用 CCS 20.3.0.14 和 CPU1_RAM 引导至 RAM。  为简单起见、我使用硬编码 return (0x80000);执行 0x80000 后、会加载到 XAR4 中(查看寄存器)、但绝不会传输到 PC。  下面是反汇编显示的内容、但我不理解它的含义。   

    	0x008FEB	8F080000    MOVL         XAR4, #0x080000
    	0x008FED	FE84        SUBB         SP, #4
    	0x008FEE	A8A9        MOVL         @ACC, XAR4
    	0x008FEF	0006        LRETR   

    不知道其他地方可以了解我的故障分析原因是不是 0x80000。

    John

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

    您好、John:

    LRETR 使用返回 PC (RPC) 执行长返回。 MOVL 将 0x80000 存储到 ACC 中。  您能否验证 ACC 的内容是否随后被移动到 RPC 中? 如上面的 ExitBoot 例程中所示、应在 codestartbranch.asm 中完成此操作。

    此外、您是否正在使用任何编译器优化?

    此致、

    马特

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

    尊敬的 Matt:

    我现在尝试从应用程序所在的 0x80000 开始对闪存进行重新编程。  我尝试遵循 C2000 Ware 和 SPRUJ96A 中的所有示例、但没有成功。  我使用 CCS 对应用程序进行了编程、并将存储器与.rom 文件进行了比较、看看它们是相同的。

    当我使用 Fapi_issueProgrammingCommand () 或 Fapi_issueAutoEcc512ProgrammingCommand () 时、我看到存储器中的数据得到了增强、因为我期望 ECC 与数据交错。  从使用 CCS 加载应用程序来看(上述)没有使用 ECC、因此我无法开发将应用程序重新加载到闪存的程序。

    感谢您的帮助、

    John

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

    您好、John:

    如何对齐数据缓冲区(用于对闪存进行编程)?  

    ECC 在单独的存储器区域中进行编程。 例如、0x80000 的 ECC 从 0x108000 开始。

    此致、

    马特

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

    谢谢 Matt、

    发现我是按 16 位字计数递增 Uint32 指针。  更正后、使用正确对齐数据

    Fapi_issueDataOnly512ProgrammingCommand。  

    刚刚使用了 Fapi_issueAutoEcc512ProgrammingCommand () 并修复了我的递增问题、以查看应用程序闪存并正常工作。  

    您向我介绍了 ECC 位置的详细信息、这有助于证明事情的合理性。

    现在、我将在清理引导加载程序的最后一个阶段!

    再次感谢、

    John

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

    您好、John:

    很高兴听到! 在此期间、我将继续保持该主题的开放状态。

    此致、
    马特

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

    尊敬的 Matt:

    到目前为止的一切都已正常工作、我现在正处于如下所示的 GPREG 编程的阶段 — 我想。

    Z1-GPREG1 (0x78008)(32 位)0x 5AFFFF20
    Z1-GPREG2 (0x7800A)(32 位)0x FFFFFFFF
    Z1-GPREG3 (0x7800C)(32 位)0x 0xFFFF0307
    Z1-GPREG4 (0x7800E)(32 位)0x FFFFFFFF
    我在文档中找不到任何显示 BOOTDEF0 是 BOOTPIN0 逻辑电平 0 和  BOOTDEF1 BOOTPIN0 逻辑电平 1 的地方。  请在我拔出触发器之前澄清一下!
    谢谢、
    John
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、John:

    是、我可以确认对 BOOTPIN0 进行解码、以便 在 BOOTPIN0 = 0 时选择 BOOTDEF0、 在 BOOTPIN0 = 1 时选择 BOOTDEF1。

    您可以将其视为查找表、其中使用 BOOTPIN 对 BOOTDEFx 表进行索引(解码时,BOOTPIN0 为 LSB)。  

    此致、

    马特

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

    尊敬的 Matt:

    成功是甜蜜的!  第一次尝试时弄错了一个 LaunchPad、因为我忘记使用第三个 I2C 引导选项 (0x47)。  一旦我调整如下,所有的工作按计划.

    Z1-GPREG1 (0x78008)(32 位)0x 5AFFFF20
    Z1-GPREG2 (0x7800A)(32 位)0x FFFFFFFF
    Z1-GPREG3 (0x7800C)(32 位)0x 0xFFFF0347
    Z1-GPREG4 (0x7800E)(32 位)0x FFFFFFFF
    再次感谢、
    John