主题中讨论的其他器件: TMS320F28035、 controlSUITE
我有一个修改后的 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 ;电子---

