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.
我们首先通过"scia 示例"与 PC 通信、验证了 sci 硬件状态是否正常。
1."c:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ device_support \ f2806x \ examples \ c28 \ f28069_sci_flash_kernel"
我在 CCS 中导入了该示例并对其进行了编译。
2.将文件"f28069_sci_flash_kernel.out"复制到文件夹"c:test"。
2.1我没有将"f28069_sci_flash_kernel.out"文件下载到28069。 原因是"serial_flash_programmer"认为它将下载。
3.我将"C:\ ti \ ccsv6 \ tools \ compiler \ ti-CGT_6.4.6 \ bin"文件夹中的"HEX2000.exe"文件复制到文件夹"c:test"中
4.打开 Windows 命令行并输入"c:test"目录。
"hex2000.exe -boot -sci8 -a -o f28069_sci_flash_kernel.txt f28069_sci_flash_kernel.out"
创建了文件"f28069_sci_flash_kernel.txt"(我从未打开过它。 当我打开它时、我有时会看到 Windows 添加了奇怪的数字。)
6."c:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ device_support \ f2806x \ examples \ c28 \ timed_led_blink"
我在 CCS 中导入了该示例并对其进行了编译。
我将程序下载到仿真器、并确认 LED 正在切换。
7.将文件"Example_2806xLEDBlink.out"复制到文件夹"c:test"。
8.打开 Windows 命令行并转至"c:test"目录并运行以下命令:
"hex2000.exe -boot -sci8 -a -o Example_2806xLEDBlink.txt example_2806xLEDBlink.out"
9.已创建"Example_2806xLEDBlink.txt"文件(我从未打开它。 当我打开它时、有时我看到 Windows 添加了奇怪的数字。)
10.我已从电路板上移除仿真器,目前只连接 SCIA 通信和电源。
11. GPIO34 - SET (3.3V 上拉电阻)
GPIO-37 -非置位(GND 下拉)
12.关闭"28069"。
13.打开"28069"的电源。
14."LED 闪烁"不起作用。
因此、它被视为处于"sci 引导模式"。
15。如下图所示继续。
16."正在将 C:\ test \ Example_2806xLEDBlink.txt 下载到设备..."
20分钟后无响应。
因此、如果我犯了错误、请告诉我。
我无法求解一个月。
感谢您的快速回答。
但答案没有解决我的问题。
1.您可以看到最后一张图片已包含"-v"选项。但是,在最后一张图片之后,“正在将 C:\ test \ Example_2806xLEDBlink.txt 下载到设备...”之后没有字符。
2.它设置为"gpio28 (SCIA_RX)"和"gpio29 (SCIA_TX)"、您可以在"SCI_A_ucRX"中看到发送到超级终端的"0x61"、如第一张图片所示。
当我在"SciaRegs.SCITXBUF"中输入"0x62"时、我确认在 PC 的超级终端上显示英文字符"b"。
还有更多问题。
3.将"f28069_sci_flash_kernel"的"out file"下载到"DSP"的"internal flash ROM"后、我是否应该从第一个问题的第一个问题继续?
像问题"2.1"这样思考是否正确?
4、请查看 SPRABV4B 文档
"如有必要。 然后、它等待来自主机的'A'或'A'、以便对主机执行自动波特率锁定。 "
有此内容。
这是否从 DSP 自动发送到主机(PC)?
如果是、Cmd 窗口是否可见?
如果不是、"自动波特锁定"是如何工作的?
第五个问题
11. GPIO34 - SET (3.3V 上拉电阻)
GPIO-37 -非置位(GND 下拉)
12.关闭"28069"。
13.打开"28069"的电源。
14."LED 闪烁"不起作用。
因此、它被视为处于"sci 引导模式"。
在我执行序列时、是否有任何方法来验证 DSP 是否进入 SCI 引导模式? (我有一个示波器、因此我可以看到 DSP 的所有引脚。)
噢,我的神,我在实验中没有接地。
字符打印如下:程序是否下载到内部闪存 ROM?
与图片一样、应用项目现在在 RAM 区域中编程为"RAM.cmd"。 我应该使用"rom.cmd"吗?
我使用"Rom.cmd"下载了内部闪存 ROM 程序。
感谢您的回答。
我只想从外部串行通信线路(TX、Rx、GND)将程序下载到内部 ROM 区域。
但是、作为一个特殊的问题、"serial_flash_programmer"应该最初设置为"GPIO34"和"gpio37"。
因此、在重新启动程序时、必须再次设置"GPIO34"和"gpio37"。
我想在不修改"GPIO"的情况下下载程序。
还有其他方法吗?
感谢您的回答。
使用 GPIO 设置、sci_boot 模式已启用、可将程序下载到内部闪存 ROM 区域。
但我现在是
1.将设置修正为 GPIO34 - 高电平、gpio37 -高电平(获取模式)、并且没有仿真器。
2.软件调用 sci_boot 函数
3.我想将程序下载到内部闪存 ROM 区域。
您说您只需要添加".lib 文件"。
但是、当您查看下一张图片时、会生成一个错误。
因此、
C:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ libraries \ boot_rom \ f2806x \ v1_1 \ rom_sources\ source
我需要将.c 和.h 文件添加到我的项目中。
这是我的想法吗?
如果是、我可以推荐 e2e 帖子或数据表吗?
如果您给我们发送一个链接、我将不胜感激。
我正在使用 FPU。
所以
C:\ti\c2000Ware_1_00_06_00\libraries\boot_rom\f2806x\v1_1\rom_symbol_libs\Flash_API\2806x_FlashAPI_BootROMSymbols_fpu32.lib
已添加。
但是,仍然无法调用 sci_boot ()函数。
附加我的 main.c
#include "DSP28x_Project.h"
extern Memcopy();
extern UINT32 SCI_Boot (void);
void (*entry)();
字 wCntMain = 0;
word test_boot_sci=0;
unsigned long boot_addr = 0x003fe74a;
void main (void){
////
//// GPIO 和 SCI 仍从 SCI_Boot ()设置
////设置 sysctl 和 PLL
////
// DisableDoG();
//国际振荡1Sel();
// InitPll (DSP28_PLLCR、DSP28_DIVSEL);
//
// delay_US (100);
//返回 SCI_Boot ();
InitSysCtrl();
Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
InitFlash();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitCpuTimer();
init_gpio();
Timer_Init();
EINT;
/*启用全局中断 INTM */
ERTM;
/*启用全局实时中断 DBGM */
for (;;)
{
wCntMain++;
if (test_boot_sci=1)
{
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//准备 SCI 引导加载
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
EALLOW;
Dint;
EDIS;
PieCtrlRegs.PIECTRL.bit.ENPIE = 0;//禁用 PIE
DisableDog ();//禁用看门狗
国际振荡1Sel();
InitPll (DSP28_PLLCR、DSP28_DIVSEL);
EALLOW;
条目=(void (*)(boot_addr);
entry();
// boot_addr=sci_Boot();
//((void (*)(void)) boot_addr)();
}
}
}
1.我认为这不应该只添加 lib. 是这样吗?
2.当我打开用记事本添加的库时,没有关于 sci_boot 的信息()。 所以
C:\ti\c2000Ware_1_00_06_00\libraries\flash_api\f28066\lib\2806x_Bootrom_api_table_Symbols_fpu32.lib
我认为添加是正确的。
是这样吗?
我想你现在错了。
我不使用 f2837xd、F2837xs、F2807x、F2833x、f28004x 系列 DSP。
我使用的是 F28069。
请参阅 C2000库中的 SCI_Boot.c 源代码。
它位于以下目录中:
C:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ libraries \ boot_rom \ f2806x \ v1_1 \ rom_sources\ source
您提到的 UINT32 SCI_Boot (UINT32引导模式)原型
它只存在于 F2837x 的目录中。
它位于以下目录中:
C:\ ti \ c2000 \ C2000Ware_1_00_06_00 \ libraries \ boot_rom \ f2837xs \ revB \ rom_sources\ F2837x_bootROM \ cpu01-bootROM \ source
请检查您的计算机目录并给出答案。
我认为我不需要调用 SCI_Boot ()函数。
由于"serial_flash_programmer"使用"28069_sci_flash_kernel.txt"文件、我相信"serial_flash_programmer"将调用"SCI_Boot ()"函数。
只需将其设置为 sci 引导模式。
第一种方法是 GPIO 设置。
我想将"sci 引导模式"设置为软件。
另一种方法是调用 sci_boot ()函数。
该方法如下所示:main.c
------------------------------------------ main.c ----------------------------
#include "DSP28x_Project.h"
extern Memcopy();
extern UINT32 SCI_Boot ();
字 wCntMain = 0;
word test_boot_sci=0;
unsigned long sci_boot_addr = 0x003ff699;
unsigned long init_boot_addr = 0x003ff760;
unsigned long select_boot_addr = 0x003ff459;
#define Device_cal (void (*)(void)) 0x3D7C80
uint32 (*entry)();
uint32 main (void){
InitSysCtrl();
Memcopy (&RamfuncsLoadStart、&RamfuncsLoadEnd、&RamfuncsRunStart);
InitFlash();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
InitCpuTimer();
init_gpio();
Timer_Init();
EINT;
/*启用全局中断 INTM */
ERTM;
/*启用全局实时中断 DBGM */
EALLOW;
//看门狗服务
ServiceDog ();
//用0x0000插入闪存 API 使用的两个位置
Flash_CPUScaleFactor = 0;
Flash_CallbackPtr = 0;
EDIS;
//读取密码位置-这将解锁
//仅当密码被擦除时才为 CSM。 否则
//将不起作用。
CsmPwl.PSWD0;
CsmPwl.PSWD1;
CsmPwl.PSWD2;
CsmPwl.PSWD3;
CsmPwl.PSWD4;
CsmPwl.PSWD5;
CsmPwl.PSWD6;
CsmPwl.PSWD7;
DisableDog ();
LED1_ON;
LED2_ON;
LED3_ON;
LED4_ON;
LED5_ON;
LED6_ON;
LED7_ON;
LED2_ON;
国际振荡1Sel();
InitPll (DSP28_PLLCR、DSP28_DIVSEL);
DELAY_US (100);
条目=(uint32 (*)())(sci_boot_addr);
返回条目();
}
------------------------------------------ main.c ----------------------------
我位于 C:\ti\c2000Ware_1_00_06_00\libraries\boot_rom\f2806x\v1_1\rom_sources\Release 目录中、请参阅"TMS320x2806x_boot_rom.map"文件
我发现"sci_boot()"函数的地址是0x003ff699。
但是,在 cmd 窗口中,将显示与下一个窗口相同的文本。
此时的 DSP 状态为"SCIA_GetWordData()"函数
" while (SciaRegs.SCIRXST.bit.RXRDY! = 1){}"。
我认为应该首先调用"SelectMode()"或"Init_Boot"函数,而不是简单的"sci_boot()"函数调用。
是这样吗?
1) 1)工作正常。 ( 我可以确认 txt 文件正常)
2) 9600、1200、75 I 已设置三个波特率、但它没有影响。
3) 3)我已确认 不能通过断点从"CopyData()"中退出。
我已确认以下两个"shared_Boot.c"中"CopyData()函数的内容不同。
C :\ti\c2000Ware_1_00_06_00\libraries\boot_rom\f2806x\v1_rom_sources\source\shared_Boot.c
-------------------------- 1---CopyData()--1----
//-------------------------------------- void CopyData() { struct header{ uint16 blocksize; uint32 DestAddr; }BlockHeader; uint16 wordData; uint16 i; //获取第一个块 BlockHeader.blocksize =(* GetWordData)(); //当块大小大于0时,将数据复制 //到 DestAddr。 没有错误检查 //假设 DestAddr 是有效 的//内存位置 while (BlockHeader.blocksize!=(UINT16) 0x0000 ){ BlockHeader.DestAddr = GetLongData(); for (i = 1;i <= BlockHeader.blocksize;i++) { wordData =(* GetWordData)(); *(uint16 *) BlockHeader.DestAddr++= wordData; } //获取下一个块的大小 BlockHeader.blocksize =(*GetWordData)(); } return; }
-------------------------- 1---CopyData()--1----
2. c:\ti\c2000Ware_1_00_06_00\device_support\f2806x\examples\c28\f28069_sci_flash_kernel\shared_Boot.c
-------------------------- 2---CopyData()--2----
void CopyData (void) { 结构标头 { uint16 blocksize; uint32 DestAddr; uint32 ProgBuffAddr; } BlockHeader; uint16 wordcata; uint16状态; uint16 i、j; // //确保代码安全被禁用 // CsmUnlock(); EALLOW; Flash_CPUScaleFactor = scale_factor; Flash_CallbackPtr =空; EDIS; 状态= Flash_Erase (((sectora | sectorb | SECTORC | SECORD)、 FlashStatus (FlashStatus); if (status!= STATUS_SUCCESS) { // //返回 // 返回; } // //闪存擦除后,将校验和发送到 PC 程序。 // SendCheckSum(); // //获取第一个块的大小(以字为单位) // BlockHeader.blocksize =(* GetOnlyWordData)(); // //当块大小大于0时,将数据复制到 DestAddr。 没有 //错误检查,因为假定 DestAddr 是有效的内存位置 // while (BlockHeader.blocksize!=(UINT16) 0x0000) { if (BlockHeader.blocksize > PROG_buffer_length) { // //块要大到适合我们的缓冲区,所以我们必须将它编程到中 //块 // BlockHeader.DestAddr = GetLongData(); // //对尽可能多的完整缓冲区进行编程 // for (j = 0;j <(BlockHeader.blocksize / PROG_buffer_length);j++) { BlockHeader.ProgBuffAddr =(uint32) progBuf; for (i = 1;i <= PROG_buffer_length;i++) { wordData =(* GetOnlyWordData)(); *(uint16 *) BlockHeader.ProgBuffAddr++= wordData; } 状态= Flash_Program (((UINT16 *) BlockHeader.DestAddr、 (uint16 *) progBuf、PROG_buffer_length、&FlashStatus); if (status!= STATUS_SUCCESS) { 返回; } BlockHeader.DestAddr += PROG_Buffer_length; // //闪存程序后,将校验和发送到 PC 程序。 // SendCheckSum(); } // //对剩余的内容进行编程 // BlockHeader.ProgBuffAddr =(uint32) progBuf; for (i = 1;i <=(BlockHeader.blocksize % PROG_buffer_length);i++) { wordData =(* GetOnlyWordData)(); *(uint16 *) BlockHeader.ProgBuffAddr++= wordData; } 状态= Flash_Program (((UINT16 *) BlockHeader.DestAddr、 (uint16 *) progBuf、(BlockHeader.blocksize % PROG_Buffer_length)、FlashStatus); if (status!= STATUS_SUCCESS) { 返回; } // //闪存程序后,将校验和发送到 PC 程序。 // SendCheckSum(); } 其他 { // //块将适合我们的缓冲区、因此我们将在进行所有编程 //一次 // BlockHeader.DestAddr = GetLongData(); BlockHeader.ProgBuffAddr =(uint32) progBuf; for (i = 1;i <= BlockHeader.blocksize;i++) { wordData =(* GetOnlyWordData)(); *(uint16 *) BlockHeader.ProgBuffAddr++= wordData; } 状态= Flash_Program (((UINT16 *) BlockHeader.DestAddr、 (uint16 *) progBuf、BlockHeader.blocksize、&FlashStatus); if (status!= STATUS_SUCCESS) { 返回; } // //闪存程序后,将校验和发送到 PC 程序。 // SendCheckSum(); } // //获取下一个块的大小 // BlockHeader.blocksize =(* GetOnlyWordData)(); } 返回; }
-------------------------- 2---CopyData()--2----
我认为第二个 shared_Boot.c 的内容是正确的。 是这样吗?
好久不见。
我将忽略我发布的其他帖子、并关注此帖子。
无法使用独立引导模式、因为"SciBoot.asm"位于 RAM 区域。
我的位置是获取模式:仿真引导模式的闪存模式。
我看到 了 Fullano de Tal 帖子、并创建了一个"SciBoot.asm"文件并将其包含在项目中。
当他将"SciBoot.asm"放在"RAML0"区域时
其余应用程序位于"FLASHE"区域。
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 = 0x000400 /*片上 OTP */ FLASHH :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 = 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 */ 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, 运行= RAML1、 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 //分配 IQ 数学区域:*/ IQmath :> FLASHE、 PAGE = 0 /*数学代码*/ IQmathTables :> IQTABLES,page = 0,type = NoLoad securebootfuncs :> RAML0, PAGE = 0 //分配 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. /*如果调用 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 } /*/=========================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================== //文件结束。 //============================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================================ *
运行"serial_flash_programmer"作为"Visual Studio"的结果
"F05_DownloadImage.CPP"文件卡在与图片相同的位置。
"ReadFile"函数在哪里读取某些内容以及为什么不读取这些内容?
谢谢你
Kim