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**** 2558250 points
Other Parts Discussed in Thread: TMS320F28069

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/774529/tms320f28069-tms320f28069-how-do-i-enter-serial-boot-mode

器件型号:TMS320F28069

DSP:TMS320F28069

CCS: 6.1.2.00015

调试器:USB560 V2系统跟踪(Blackhawk)

提前感谢您。


我通过 GPIO 设置成功进入了 sci 引导模式。

请参见下图。


但是、我想在应用程序中进入 sci 引导模式、而不是 GPIO 设置。


如何在软件中进入引导模式?

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

    您好!

       引导模式始终由 GPIO 设置控制。 您无法从应用程序进入引导模式。

       您的用例和流程是什么?

    此致

    Baskaran

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

    如果您仍面临此问题、请提供更多详细信息。

    此致

    Baskaran

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

    我想实现红色虚线框的功能。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定这种方法是否可行、但您可以尝试一下。

    从应用程序代码调用"EntryAddr = SCI_Boot()"。 然后跳转至 EntryAddr (函数指针)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    条目=(uint32 (*)())(0x003f4abd);
    条目();
    

    1.我将 SCI_Boot.c 文件添加到了我的项目中。
    2.根据.map 文件、SCI_Boot ()函数的地址值为0x003f4abd。
    所以我编码的代码是这样的。

    serial_flash_programmers 执行结果在以下部分停止。

    由于许多实验、我认为我需要复制和修改 DSP 中嵌入的内容。
    当 DSP 首次复位时、InitBoot 的内容被执行、并且根据 selectmode 函数的内容选择引导模式。
    对 sci_boot ()函数的简单调用是无用的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否将应用程序加载到 CCS 中并查看行为是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1.下载源后、DSP 正处于与下图相同的等待位置。

    2。如果您运行 serial_flash_programmer
    它在"Done waiting for kernel ..."的语法中被暂停。

    此时、DSP 已在调试模式下退出。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我想、可靠的方法是复制代码并将其作为您的应用的一部分、正如您在上面提到的那样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首次复位 DSP 时、运行的.asm 或.c 文件是什么?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    init_Boot.asm
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    init_Boot.asm 在哪里调用?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    init_boot.asm 包含一个名为_InitBoot 的例程。 这个例程被放置在 CPU 的复位矢量上。 因此、当器件复位时、首先执行此例程。

    因此、您不会在代码中的任何位置看到对_InitBoot 的任何显式 SW 调用。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    /*
    //################################################################################################################
    //
    ////文件:F28069.cmd
    //
    //标题:F28069器件的链接器命令文件
    //
    //########################################################################################
    //$TI 发布:F2806x C/C++头文件和外设示例 V141 $
    //$发布 日期:2015年1月19日$
    //$版权:版权所有(C) 2011-2015 Texas Instruments Incorporated -
    //             http://www.ti.com/ 保留所有权利$
    //############################################################################################################
    /*
    
    ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //对于 Code Composer Studio V2.2和更高版本
    //------------
    //除了这个内存连接器命令文件之外,
    //将头连接器命令文件直接添加到项目中。
    //将
    //外设结构链接到
    //内存映射中的适当位置需要使用头链接器命令文件。
    //
    //可以在中找到头文件链接器 \f2806x_headers\cmd
    //
    //对于 BIOS 应用程序添加: F2806X_Headers_BIOS.cmd
    //对于非 BIOS 应用程序,添加:F2806X_Headers_nonBIOS.cmd
    ============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ /*
    
    ====================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    //对于 V2.2之前的 Code Composer Studio
    ,//----------------
    // 1)使用以下-l 语句之一在
    工程中包含//头链接器命令文件。 将
    外设结构链接到
    存储器映射中的适当//位置需要使用头链接器//文件 //
    
    ////*取消注释此行以仅包括非 BIOS 应用程序的文件*//
    /*-l F2806x_Headers_nonBIOS.cmd */
    
    //*取消注释此行以仅包括 BIOS 应用程序的文件*/
    *-l F2806x_Headers_BIOS.cmd */
    
    * 2)在项目中添加路径 \f2806x_headers\cmd 至
    project->build options、linker tab、
    library search path (-i)下的库搜索路径。
    /*================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ //
    
    //*定义 F2806x
    页的内存块开始/长度0将用于组织程序段
    页1将用于组织数据段
    
    注:
    F28069上的存储器块是一致的(也是相同的
    物理存储器)。
    不应该是相同的存储器区域
    同时为 PAGE 0和 PAGE 1定义。
    这样做将导致程序损坏
    和/或数据。
    
    可组合连续 SARAM 存储器块
    如果需要创建更大的存储器块。
    */
    
    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 = 0x0003FB //片上 OTP */
    
    key_boot:origin = 0x3D7BFB,length = 0x000003// OTP 中的 Key Boot Value */
    boot_mode:origin = 0x3D7BFE,length = 0x000003//引导模式选择*/
    
    FLASH :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 = 0x000C09 /* Boot ROM */
    FLASH_CHK:origin = 0x3FFFB9,length = 0x000001
    版本 :origin = 0x3FFFBA,length = 0x000002
    CHECKSUM:origin = 0x3FFFBC,length = 0x000004
    reset :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,
    运行= RAML0、
    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
    SciBootInit :> FLASHA、 page = 0
    BootMode:> boot_mode,page = 0
    KeyBoot:> key_boot,page = 0
    .Flash :LOAD = FLASH_CHK PAGE = 0
    .Checksum :load =校验和,page = 0
    .Version :load = version、page = 0
    
    /*分配 IQmath 区域:*/
    IQmath :> FLASHE、 PAGE = 0 /*数学代码*/
    IQmathTables :> IQTABLES,page = 0,type = NoLoad
    
    
    //分配 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
    
    // FlashAPI :load = flash_API,page = 0
    //{
    //-lFlash2806x_API_V100.lib (.text)
    //-lFlash2806X_API_V100.lib (.econst)
    //}
    //.romApiTable:load = ROM_API TABLE,page = 0
    //如果调用 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
    
    }
    
    /*/===========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    
    //文件结束。
    //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
    *
    
    
    .global _ExitBoot
    .global _SciBootInit
    .ref _SelectBootMode
    .ref _c_int00
    .sect "SciBootInit";安全 RAM 位置
    
    ;---------------------
    ;_SciBoot
    ;----------------------------------
    ;------------------------------------------------
    ;此函数为
    引导 ROM 执行初始引导例程。
    ;
    ;此模块执行以下操作:
    ;
    ; 1)初始化堆栈指针
    ; 2) 2)将器件设置为 C28x 操作模式
    ; 3)调用主引导函数
    ; 4)调用一个退出例程
    ;-----------------
    
    
    _SciBootInit:
    
    ;初始化栈指针。
    
    _stack:.usect ".stack"、0
    MOV SP、#_stack;初始化栈指针
    
    ;初始化要在 C28x 模式下运行的器件。
    
    C28OBJ ;选择 C28x 对象模式
    C28ADDR ;选择 C27x/C28x 寻址
    C28MAP ;为 C28x 模式设置块 M0/M1
    CLRC PAGE0;始终使用栈寻址模式
    MOVW DP、#0;初始化 DP 以指向低64K
    CLRC OVM
    
    ;将 PM 漂移设置为0
    
    SPM 0
    
    ;决定使用哪种引导模式
    LCR _SelectBootMode
    
    ;清理并退出。 此时 EntryAddr
    位于 ACC 寄存器中
    bf _ExitBoot,UNC
    
    
    
    ;--------------------------------------
    ;_ExitBoot
    ;---------------
    ;------------------------------------------------
    ;此模块在引导加载程序之后清理
    ;1)
    确保已取消对堆栈的分配。
    ; SP = 0x400退出引导
    后;加载程序
    ;2)将0推入栈,使 RPC 为;
    使用 LRETR 跳转到
    入口点后为0
    ;2)使用入口点加载 RPC
    ;3)清除所有 XARn 寄存
    器; 4)清除 ACC、P 和 XT 寄存器
    ;5) LRETR -这也将清除 RPC
    ;寄存器,因为0在栈上
    ;---------------
    
    _ExitBoot:
    
    ;---------------
    ;确保堆栈被取消分配
    ;----------------------
    
    MOV SP,#_STACK
    
    ;------------------------------------------------------
    ;清除堆栈的底部。 这将进行重编
    ;在我们完成时在 RPC 中
    ;----------------------------
    
    MOV * SP++、#0
    MOV *SP++,#0
    
    ;------------------------------
    ;使用确定的入口点加载 RPC
    ;通过引导模式。 此地址将在
    ACC 寄存器中返回。
    ;------------------------------------------------
    
    按 ACC
    弹出 RPC
    
    ;-----
    ;将寄存器恢复到复位状态。
    ;
    ;清除所有 XARn、ACC、XT、P 和 DP
    ;寄存器
    ;
    ;注:将器件保持在 C28x 操作模式
    ; (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
    
    ;------------------------------------
    ;恢复 st0和 st1。 注意 OBJMODE 是
    ;唯一的位不会恢复到其复位状态。
    ; OBJMODE 为 C28x 对象操作
    ;模式保留设置。
    ;
    ; st0=0x0000 ST1 = 0x0A0B
    ;15:10 OVC = 0 15:13 ARP = 0
    ;9:7 PM = 0 12. XF = 0
    ; 6V = 0 11 M0M1MAP = 1
    ; 5 N = 0 10保留
    ; 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
    弹出 ST1
    弹出 st0
    
    ;--------------------------------------------------------
    ;跳转至由定义
    的 EntryAddr;选择的引导模式并继续执行
    ;---------------
    
    LRETR
    
    ;电子---
    
    条目=(uint32 (*)())(0x3F4000);
    条目(); 

    我创建并附加了文件"SciBootInit.asm"和"F28069.cmd"。
    我在 main.c 中调用了"FLASHA"区域并执行了"serial_flash_programmer"。
    程序比以前停止。

    SciBootInit :> FLASHA、 PAGE = 0 

    "SciBootInit"的区域被分配给"FLASHA"区域、而我的应用程序被分配给"FLASHE"区域。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需将 SCI_Boot()函数及其依赖项复制到应用程序代码并进行集成即可。
    在上述情况下、您似乎采用了不需要的完整引导代码。