我的代码通过 CCS (7.2)调试器从闪存加载并运行。 但是、如果我断开 USB 电缆并重新连接、它将挂起。 如果我然后按下复位按钮、它将再次运行、只是正常。 我已经阅读了十几篇 TI 支持文章、这些文章涉及这个完全相同的问题(更不用说 TI 的"在 TMS320F28xxx DSP 上运行内部闪存存储器中的应用"应用手册)、但是它们的修复程序都不适合我。 下面是我的链接器和.asm 文件、它们应该告诉处理器从哪里开始。 我的 launchpad 上的三个 DIP 开关都处于"打开"位置、我认为这正是它们应该位于的位置。 在项目属性 Build > C2000 Linker > Advanced Options > Symbol Management 中、入口点设置为"code_start"。
我阅读的一些文章似乎表明有一种调试方法、但我还没有弄清楚如何操作。 当我断开 USB 连接时、CCS 调试器失去与电路板的联系、并且在我对其重新编程之前不会再次运行。 如果有调试方法、请告诉我!
请帮助!
F2806x_CodeStartBranch.asm:
// TI 文件$Revision:/main/2 $ ;//签入$Date:2011年1月4日10:10:05 $ ;//############################################################################################################################################################ // ;//文件:F2806x_CodeStartBranch.asm ;// ;//标题:用于在引导后重定向代码执行的分支。 ;// ;//对于这些示例,code_start 是 ;//退出引导 ROM 代码后执行的第一个代码。 ;// ;//链接器 cmd 文件中的 codestart 段用于将 ;//此代码实际放置在正确的存储器位置。 应将此段放置 ;//在引导 ROM 将代码重定向到的位置。 例如, ;//对于引导以刷写此代码将位于0x3f7ff6。 // ;//此外,示例 F2806x 项目被设置,这样 codegen ;//入口点也被设置为 code_start 标签。 这由链接器完成 ;//项目构建选项中的选项-e。 当调试器加载代码时, ;//它将自动将 PC 设置为 ;//链接器选项指示的“入口点”地址。 在这种情况下,调试器只是分配 PC; //它与器件的完全复位不同。 ;// ;//编译器可能会警告项目的入口点是; //_c_init00。 _c_init00是 C 环境设置,在 输入;// main()之前运行。 code_start 代码将重新引导执行 ;//到_c_init00,因此不用担心,可以忽略此警告。 ;// ;//################################################################################################################## //$TI 发布:F2806x 支持库 v2.02.00.00 $ ;//$发布 日期:截至2017年12月7日18:50:05 CST 2017 $ ;//版权所有: ;//版权所有(C) 2009-2017 Texas Instruments Incorporated - http://www.ti.com/ ;// ;//如果 满足以下条件,允许以源代码和二进制形式重新分发和使用,无论是否修改;// // ;//源代码的重新分发必须保留上述版权 ;//注意,此条件列表和以下免责声明。 //;//二进制形式的再发行必须复制上述版权 ;// 声明、本条件列表和以下免责声明;//文档和/或随;//发行提供的其他材料。 // ;//如果 没有事先的书面许可,不能使用德州仪器公司的名称或;//其贡献者的名称来认可或推广源自此软件的产品;// ;// ;//本软件由版权所有者和贡献者提供 ;//“按原样”,任何明示或暗示的保证,包括但不 限于对适销性和适用性的暗示保证 ;//特定用途不承担任何责任。 在任何情况下,版权 不得对任何直接、间接、偶然或 特殊、模范、 或间接损害赔偿(包括但不 限于采购替代产品或服务;丧失使用、 数据或利润; 或业务中断)的 任何原因;//责任理论,无论是合同、严格责任还是侵权 行为;//(包括疏忽或其他)因使用 本软件而产生;//本软件,即使被告知可能会发生此类损坏。 //$ ;//######################################################################################################## (三 WD_DISABLE.set1;设置为1可禁用 WD、否则设置为0 .ref _c_int00 全局代码_启动 *函数:codestart 段 * 说明:分支到代码起始点 .sect "codestart" code_start: 如果 WD_DISABLE = 1 LB wd_disable ;分支到看门狗禁用代码 其他 LB _c_int00 ;分支到 RTS 库中 boot.asm 的启动 .endif ;end codestart 部分 *函数:WD_DISABLE * 说明:禁用看门狗计时器 如果 WD_DISABLE = 1 .text wd_disable: SETC OBJMODE ;为28x 目标代码设置 OBJMODE EALLOW ;启用 EALLOW 受保护寄存器访问 MOVZ DP,#7029h>>>6;设置 WDCR 寄存器的数据页 MOV @7029h、#0068h;将 WDCR 中的 WDDIS 位置位以禁用 WD EDIS ;禁用 EALLOW 受保护的寄存器访问 LB _c_int00 ;分支到 RTS 库中 boot.asm 的启动 endif ;end wd_disable .end ;// ;//文件结束。 ;//
28609_flash_lnk.cmd:
/* //################################################################################################################ // ////文件:example_Flash28069_api.cmd // //标题:F28069器件闪存 API 的链接器命令文件 // //################################################################################################## //$TI 发布:F2806x 支持库 v2.02.00.00 $ //$发布 日期:截至12月7日18:50:05 CST 2017 $ //版权所有: //版权所有(C) 2009-2017 Texas Instruments Incorporated - http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## /* ==================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //对于 Code Composer Studio V2.2和更高版本 //------------ //除了这个内存连接器命令文件之外, //将头连接器命令文件直接添加到项目中。 //将 //外设结构链接到 //内存映射中的适当位置需要使用头链接器命令文件。 // //可以在中找到头文件链接器 头文件\cmd // ////对于非 BIOS 应用程序,添加:f2806x_headers_nonBIOS.cmd ======================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== // //*定义 F2806x 页的内存块开始/长度0将用于组织程序段 页1将用于组织数据段 注: F2806x 上的存储器块是一致的(即相同的 物理存储器)。 不应该是相同的存储器区域 同时为 PAGE 0和 PAGE 1定义。 这样做将导致程序损坏 和/或数据。 可组合连续 SARAM 存储器块 如果需要创建更大的存储器块。 */ MEMORY { PAGE 0:/*程序存储器*/ /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/ PRAML0 :origin = 0x008000、length = 0x000800 /*片上 RAM 块 L0 */ OTP :origin = 0x3D7800,length = 0x000400 /*片上 OTP */ 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_PROG: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 = 0x000C10 /*引导 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 将此用于栈*/ RAMM0 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */ RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */ DRAML1 :origin = 0x008800,length = 0x000400 /*片上 RAM 块 L1 */ 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 */ FLASHB :origin = 0x3F0000、length = 0x004000 /*片上闪存*/ }/* 将段分配给内存块。 注: DSP28_CodeStartBranch.asm 中用于重定向代码的 codestart 用户定义段 闪存时执行 ramfuncs 用户定义的部分来存储将从闪存复制到 RAM 中的函数 */ 部分 { //分配程序区域:*/ /*闪存 API 函数可以按如下所示组合在一起。 定义的符号_Flash28_API_LoadStart、_Flash28_API_LoadEnd 和_Flash28_API_RunStart 用于将 API 函数复制出 闪存存储器并进入 SARAM */ /******** // //对于 Piccolo,我们不需要从闪存复制 API,因为 它在引导 ROM 中存在*////* // /* Flash28_API://仅在 API 不在 BootROM 中时适用{ -lFlash2802x_API_V100a.lib (.text) } 负载= FLASHD、 运行= PRAML0、 Load_start (_Flash28_API_LoadStart)、 Load_End (_Flash28_API_LoadEnd)、 RUN_START (_Flash28_API_RunStart)、 page = 0 */ .cinit :> FLASHA PAGE = 0.Pinit :> FLASHA、 PAGE = 0.text :> FLASHA PAGE = 0 codestart :>开始 PAGE = 0 ramfuncs :load = FLASHA, 运行= PRAML0、 load_start (_RamfuncsLoadStart)、 load_end (_RamfuncsLoadEnd)、 run_start (_RamfuncsRunStart)、 PAGE = 0 csmpasswds :>csm_PWL_PROG page = 0 csm_rsvd :>CSM_RSVD PAGE = 0 /*分配未初始化的数据段:*/ .stack :> RAMM0 PAGE = 1.ebss :> DRAML1 PAGE = 1 .esysmem :> DRAML1 PAGE = 1 /*初始化段进入闪存*/ //*要使 SDFlash 对这些段进行编程、必须将它们分配到 PAGE 0 */ .econst :> FLASHA PAGE = 0.switch :> FLASHA PAGE = 0 //分配 IQ 数学区域:*/ IQmath :> FLASHA PAGE = 0 /*数学代码*/ IQmathTables :> IQTABLES,page = 0,type = NoLoad //分配 FPU 数学区域:*/ FPUmathTables :> FPUTABLES,page = 0,type = NoLoad //如果调用 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 } /*/=========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //文件结束。 //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ *