DSP:TMS320F28069
CCS: 6.1.2.00015
调试器:USB560 V2系统跟踪(Blackhawk)
提前感谢您。
我通过 GPIO 设置成功进入了 sci 引导模式。
请参见下图。
但是、我想在应用程序中进入 sci 引导模式、而不是 GPIO 设置。
如何在软件中进入引导模式?
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.
DSP:TMS320F28069
CCS: 6.1.2.00015
调试器:USB560 V2系统跟踪(Blackhawk)
提前感谢您。
我通过 GPIO 设置成功进入了 sci 引导模式。
请参见下图。
但是、我想在应用程序中进入 sci 引导模式、而不是 GPIO 设置。
如何在软件中进入引导模式?
条目=(uint32 (*)())(0x003f4abd); 条目();
1.我将 SCI_Boot.c 文件添加到了我的项目中。
2.根据.map 文件、SCI_Boot ()函数的地址值为0x003f4abd。
所以我编码的代码是这样的。
serial_flash_programmers 执行结果在以下部分停止。
由于许多实验、我认为我需要复制和修改 DSP 中嵌入的内容。
当 DSP 首次复位时、InitBoot 的内容被执行、并且根据 selectmode 函数的内容选择引导模式。
对 sci_boot ()函数的简单调用是无用的。
/* //################################################################################################################ // ////文件: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"区域。