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.

[参考译文] LAUNCHXL-F28069M:加电时无法从闪存引导

Guru**** 2589280 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/664624/launchxl-f28069m-cannot-boot-from-flash-on-power-up

器件型号:LAUNCHXL-F28069M

我的代码通过 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

}

/*/===========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================

//文件结束。
//============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================
* 

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

    事实证明代码根本不是挂起的。 我假设它挂起、因为我无法通过 SCI-A 端口进行通信。 看起来 FTDI 芯片启动会在 SCI-A RX 线路上导致错误(如果您的电路板配置为使用 SCI-A 来实现 USB 转串行通信)。 我所要做的就是针对 SCI-A RX 上的错误启用中断、并在发生错误时将 SCI-A 复位。

    令人尴尬的是、我想我几个月前在另一个 LaunchPad 上遇到了同样的问题、但我忘记了。 如果我离开这里、我下次会找到它。 )

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

    我很高兴您能够解决您的问题。

    -Mark