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.

[参考译文] TMS320F28021:自定义 OTP SCI 引导跳转至闪存 A 的正常启动(0x3F7FF6)、但仅在使用调试器时运行。

Guru**** 2531480 points
Other Parts Discussed in Thread: TMS320F28021, TMS320F28035, CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/903347/tms320f28021-custom-otp-sci-boot-jumps-to-start-normal-start-of-flasha-0x3f7ff6-but-only-runs-if-using-debugger

器件型号:TMS320F28021
主题中讨论的其他器件: TMS320F28035controlSUITE

我有一个修改后的 SCI 引导加载程序、我想将其 从 FlashA 移至 OTP。  我从用于在 FlashA 中运行的加载程序没有问题的 TMS320F28035切换到了 TMS320F28021、并且只想在 OTP 中使用同一加载程序。   如果加载程序被加载到28021上的 FlashA 中、它 运行良好。  如果我下载一个新映像、它可以覆盖自己并在 CPU 复位时使用标准跳转至闪存运行应用程序(GPIO37 =1、GPIO34=1、TRST=0);  当我将加载程序放入 OTP 中时、它开始(我有一个 LED 打开、从一个全新的电源周期)、验证应用程序映像(这是正常的)、 跳转到 FlashA (0x3F7FF6) 、然后就在那里(我可以通过使用 调试器了解到的内容)。  如果我使用调试器将映像(引导加载程序)下载到 OTP 中并点击"Play"按钮、则可以正常工作。  我花了几天时间尝试找出问题所在(我正在使用坏板进行测试)、因此非常感谢您的帮助。 所有项目文件已从28035转换为28021。  非常感谢、Ron。   

我唯一不确定的是从 InitBoot.asm 中借用的 ExitBoot 示例(如果它与28021兼容)、这两个示例都来自 C2000系列?

链接器命令文件如下、我使用 InitBoot.asm (由 TI control Suite xx\controlSUITE\libs\utilities\boost_rom\2803x\2803x_boot_rom_v1提供)来设置 OTP 启动值。

内存
{
第0页:
SCIBOOTINIT:origin = 0x3D7800,length = 0x000050
SCIBOOT :origin = 0x3D7850、length = 0x0002FE
版本 :origin = 0x3D7B50,length = 0x000004 //当前版本的 bootloader 和日期
开始 :origin = 0x3D7B54,length = 0x000002 /*用于"引导至闪存"引导加载程序模式。 OTP */

OTP_KEY :origin = 0x3D7BFE,length = 0x000001 //从一次性编程引导*/
OTP_BMODE:origin = 0x3D7BFF,length = 0x000001 //从一次性编程引导*/


页1:
eBSS :origin = 0x0400,length = 0x002
堆栈 :origin = 0x0402,length = 0x200
}

SECTIONS
{
InitBoot:load = SCIBOOTINIT,page = 0
codestart :>开始 PAGE = 0
.text :load = SCIBOOT, PAGE = 0
堆栈 :load = stack、 PAGE = 1.
ebss :load = EBSS, PAGE = 1.
.Version :load = version、 PAGE = 0
OTP_BMODE:> OTP_BMODE, PAGE = 0 /*添加 OTP 引导模式*/
OTP_KEY :> OTP_KEY、 PAGE = 0 /*添加 OTP 引导密钥*/

} 

InitBoot.asm

.global _InitBoot
.ref _SCI_Boot
;.sect ".Flash";闪存 API 会检查
;.word 0xFFFE ;芯片兼容性

.sect "OTP_KEY"
字0x55AA

.sect "OTP_BMODE"
.word 0x0006

.sect ".Version"
字0x0001 ;引导 ROM 版本 v.001
字0x0414 ;月/年:(例如:0x0414 = 4/20 = 2020年8月)
;使用十六进制表示月/年


.sect ".InitBoot"

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

应用程序的链接器文件:

内存
{
PAGE 0:/*程序内存*/
/*内存(RAM/FLASH/OTP)块可被移动到第1页进行数据分配*/

RAMM0 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
OTP :origin = 0x3D7800,length = 0x000400 /*片上 OTP */
FLASHD :origin = 0x3F0000、length = 0x004050 /*片上闪存3000*/
FLASHC :origin = 0x3F4050、length = 0x000FB0 /*片上闪存1000 */
FLASHB :origin = 0x3F5000,length = 0x001000 /*片上闪存*/
FLASHA :origin = 0x3F6000,length = 0x001F7C /*片上闪存-注意闪存 A 的最后4个字节用于引导加载程序检查*/
csm_RSVD:origin = 0x3F7F80,length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 */
开始 :origin = 0x3F7FF6,length = 0x000002 /* FLASHA 的一部分。 用于"引导至闪存"引导加载程序模式。 //
csm_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /* FLASHA 的一部分。 FLASHA */

IQTABLES 中的 CSM 密码位置:origin = 0x3FE000,length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
IQTABLES2:origin = 0x3FEB50,length = 0x00008C /*引导 ROM 中的 IQMath 表*/
IQTABLES3:origin = 0x3FEBDC,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

ROM :origin = 0x3FF27C、length = 0x000D44 /*引导 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 将此用于栈*/
RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
DRAML0 :origin = 0x008000、length = 0x000C00 /*片上 RAM 块 L0 */
}/*

将段分配给内存块。
注:
DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段
闪存时执行
ramfuncs 用户定义的段来存储将从闪存复制到 RAM 中的函数
*/

段
{

//分配程序区域:*/
.cinit :> FLASHC PAGE = 0.Pinit
:> FLASHC, PAGE = 0.text
:> FLASHD PAGE = 0
codestart :>开始 PAGE = 0
ramfuncs :load = FLASHA,
运行= RAMM0、

load_start (_RamfuncsLoadStart)、
load_size (_RamfuncsLoadSize)、
run_start (_RamfuncsRunStart)、

/* load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、*/
PAGE = 0

csmpasswds :>csm_PWL_P0 page = 0
csm_rsvd :>csm_RSVD page = 0

//分配未初始化的数据段:*/
.stack :> RAMM1 PAGE = 1.ebss
:> DRAML0 PAGE = 1.CIO
:> DRAML0 page = 1 /*之前为 PRAML0 page 0 */
.esysmem :> RAMM1 PAGE = 1

/*初始化段进入闪存*/
//*要使 SDFlash 对这些段进行编程、必须将它们分配到 PAGE 0 */
.econst :> FLASHA PAGE = 0.switch
:> FLASHB PAGE = 0

//分配 IQ 数学区域:*/
IQmath :> FLASHB PAGE = 0 /*数学代码*/
IQmathTables :> IQTABLES,PAGE = 0,TYPE = NOLOAD



/* DSECT */
.reset :>重置, PAGE = 0、TYPE = DSECT
向量 :>引导程序 PAGE = 0、TYPE = DSECT

} 

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

从 InitBoot.asm 跳转至闪存 A (控制套件 C:\TI\controlSUITE\libs\utilities\boot _rom\2803x\2803x_boot_rom_v1)

EntryAddr= 0x3F7FF6

(笑声)

(笑声)

_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

;电子---

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

    Ron

    两个器件的 ExitBoot 是相同的、因此这不应成为问题。

    您是否看到器件复位?

    那么、您已经确认(未连接调试器)它正在运行 OTP 引导加载程序、然后跳转到正确的地址?

    如果您连接到器件(确保目标配置没有 GEL、在目标配置的高级设置下、单击 CPU1并删除 GEL 的任何路径)、所有这些都发生后、它在哪里?

    此致

    Chris

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

    嗨、Chris、

    感谢您的回复、 我删除了 GEL 文件的路径(设置后) 、并将另一个映像下载到 OTP (找到一堆废电路板、28035、与28021相同(只有两个) 、代码相同)  - 当它跳到加载程序时,我有一个 LED 指示灯亮起,并在 它跳转到应用程序之前将字符输出到终端显示器。 LED 亮起、但没有显示字符。  但是、如果我通过调试器运行(下载 OTP、点击"Play"、只要我不更改任何代码、我就可以根据自己的喜好随时单步调试器、听起来是否正确?)、仍然可以正常工作。

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

    我将其恢复、LED 在下电上电后已经打开(不同电路板的缺点、当我在28021上单步执行时、我可以看到 LED 切换、 或循环通电)、那么我如何判断它的运行状态?如果它不 跳转到 OTP、是否有方法对它进行调试?   

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

    Ron、

    是否在断开调试器连接的情况下进行测试? 如果连接了该引脚、则引导序列不会使用编程到 OTP 中的数据。

    如果您对仿真 RAM 位置进行编程、您可以在连接了调试器的情况下进行测试。

    此外、您可以通过引导 ROM 的 CCS 加载符号。 您可以在 C:\ti\controlSUITE\libs\utilities\boot_ROM 中找到引导 ROM 输出映像

    使用这些符号、您可以单步执行并确保它达到预期的位置(就引导流程而言)。

    此致

    Chris

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

    如果我没有将  其引导至 OTP (通过0x3D7BFE=0x55AA、0x3D7BFF=0x006)、但将引导加载程序存储在 OTP 中、让引导过程默认在闪存 A (0x3F7FF6)中启动 、并在启动时让闪存 A 中的应用跳转到 OTP (0x3D7B54)、 一切都很好,应用程序运行良好(存储在闪存 E-B,28035中)。 它可用于 循环通电或热复位。   因此、我想我缺少一些东西来使它在下电上电时跳转/运行在 OTP 中。

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

    Ron

    您在 OTP 中的引导加载程序在0x3D7800似乎没有其入口点? OTP 引导模式在退出引导时将分支到该位置。

    此致

    Chris

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

    啊、我需要从 SCIBOOTINIT 开始进行交换?

            SCIBOOTINIT : origin = 0x3D7800, length = 0x000050
            SCIBOOT     : origin = 0x3D7850, length = 0x0002FE
            VERSION     : origin = 0x3D7B50, length = 0x000004    //2 words  // Current Version of BootLoader and date
            BEGIN       : origin = 0x3D7B54, length = 0x000002     /* Used for "boot to Flash" bootloader mode. OTP */
    我刚刚尝试了内存浏览器检查、当我点击 CPU 重置、播放和暂停时、肯定会很讨厌...

     

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

    就是这样!  非常感谢 Chris!我完全看错了地方。  希望其他人能从我的错误中学习。

    周末愉快!

    Ron。