主题中讨论的其他器件: C2000WARE
工具/软件:Code Composer Studio
您好,
我不熟悉 Code Composer Studio、我需要 CCS 上的项目创建帮助。 我有一个应用代码的输出(.out)文件、我需要 使用 UART 通信将此输出代码闪存到 TMS320F28334控制器。 请任何人在这方面提供帮助以实现这一目标。
谢谢、此致、
Jyoti
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.
工具/软件:Code Composer Studio
您好,
我不熟悉 Code Composer Studio、我需要 CCS 上的项目创建帮助。 我有一个应用代码的输出(.out)文件、我需要 使用 UART 通信将此输出代码闪存到 TMS320F28334控制器。 请任何人在这方面提供帮助以实现这一目标。
谢谢、此致、
Jyoti
您好 Sal、
我们使用 f05_DownloadImage.cpp 代码刷写内核和应用程序代码。 在这里,我们能够将内核加载到我们的控制器,但我们无法将应用程序代码加载到控制器中,您能建议可能出现的问题是什么?
谢谢、此致、
Jyoti
//###################################################################################################################### //文件: F05_DownloadImage.CPP//标题: 串行闪存编程器所需的下载映像函数。///此函数用于与器件进行通信和下载。 对于 // F05器件,串行闪存编程器加载内核,并以字节/字节回显方式进行字节回显。 将应用程序与内核通信时、IT//工作方式不同。 它发送应用程序的数据块并等待 //该数据的校验和。//########################################################################################## //$TI 发行版:F28X7X 支持库$//$发行 日期:Octobe 23,2014 $//##################################################################################
#include "../include/f05_DownloadImage.h
#include "stdafx.h"#include #include #include
#ifndef __linux__#pragma once #include #include #include #endif
// Linux 独占#ifdef __linux__
#include #include #include #include #include #include "linux_macros.h"
#endif //_Linux__
// ////根据详细和安静的标志生成输出的有用宏。//********* #define VERBOSEPRINT (...) if (g_BVerbose){_tprintf (__VA_args__);#define QUIETPRINT (...) if (!g_bQuiet){_tprintf (__va_args__);}
// ////通过命令行参数设置或覆盖其值的全局变量。//********* extern baudg_bVerbose;extern bg_BBinary;extern bool g_Bool;覆盖;extern boog_BUpload;extern bleg_BClear;extern bool g_Bool;extern bool g_bool;extern boop extern _boor;extern *extern _boor 1 + boor 1 + boor 1
//COM 端口填充#ifdef __linux__extern int fd;#elseextern 句柄文件;extern DCB 端口;#endif
// ////将图像下载到通过传递句柄标识的设备。 要下载的//图像和与操作相关的其他参数由命令行参数通过全局变量进行控制。////成功返回0或失败返回正错误返回代码。//********* intf05_DownloadImage (void){file *KfH;file *AFH;
unsigned int rcvData = 0;unsigned int rcvDataH = 0;int txCount = 0;
uint16_t 校验和;unsigned int fileStatus;DWORD dwRead; #ifdef __linux__ unsigned char buf[8];int readf;unsigned int sendData[8];#else errno_t error;DWORD dwWritten; unsigned char sendData[8];#endif
QUIETPRINT (_T ("正在将%s 下载到设备...\n")、g_pszAppFile);
////输入文件是否存在? ////打开闪存内核文件 #ifdef __linux__ KfH = fopen (g_pszKernelFile、_T ("rb");#else 错误=_wfopen_s (&KfH、g_pszKernelFile、_QUT ("rb"))); #endif ("%tint inue"(如果打开 t 内核文件) 它是否存在?\n"), g_pszKernelFile);return(10);}
//打开应用程序文件 #ifdef __linux__AFH =fopen (g_pszAppFile,_T ("rb"); #else 错误=_wfopen_s(&AFH,g_pszAppFile,"L"rb");#endif (!AFH){IETPRINT("%s 无法打开应用程序文件 它是否存在?\n"), g_pszAppFile);return(10);}
//内核、应用程序和 COM 端口都打开
//do AutoBaud dwRead = 0;sendData[0]='A';#ifdef __linux__ write (fd、&sendData[0]、1); while (dwRead = 0) {
readf =读取(fd、&buf、1); if (readf ==1) { QUIETPRINT (_T ("错误%s\n")、strerror (errno)); } dwRead = readf; rcvData = buf[0]; if (readf =0) { write (fd、&sendData[0]、1); } #else WriteFile (file、&sendData[0]、1、&dwWritten、NULL); while (dwRead =0){ReadFile (file、&rcvData、1、&dwRead、NULL);} #endif
if (sendData[0]!= rcvData) return (12);
VERBOSEPRINT (_T ("\n 内核自动波特成功"));//查找内核数据#ifndef __linux__getc (KfH);getc (KfH);#endif getc (KfH);
fileStatus = fscanf_s (KfH、"%x"、&sendData[0]); int i = 0;while (fileStatus = 1){i++;
//发送下一个字符
#ifdef __linux__ write (fd、_sendData[0]、1);//usleep (10000);#else WriteFile (file、&S sendData[0]、1、 &dwWritten、NULL);#endif dwRead = 0;//SAL// while (dwRead = 0)//{// ReadFile (file、&rcvData、1、&dwRead、NULL);// if (sendData[0]!= rcvData)//(99)//(return)
//读取下一个字符文件状态= fscanf_s (KfH、"%x"、&sendData[0]);}
VERBOSEPRINT (_T ("\nkernel loaded"));#ifdef __linux__ sleep (5);#else sleep (5000);#endif VERBOSEPRINT (_T ("\nDone 正在等待内核引导...正在尝试 清除);#ifdef _linux__ if (tcflush (tcflush);{= tctrende=&tre=);#euteRfr (tctrl);#ife= ge= geRfr)
#endif sleep (5000);
purgeRet = PurgeComm (file、purep_RXCLEAR);
//do AutoBaud sendData[0]='A';
#ifdef __linux__ write (fd、&S sendData[0]、1);buf[0]= 0; dwRead = 0; // int 计数器= 0; while (dwRead = 0) { //counter++; readf = read (fd、&buf、1); if (readf ==1) { QUIETPRINT (_T ("错误%s\n")、strerror (errno)); } dwRead = readf; rcvData = buf[0]; }
#else WriteFile (file、&sendData[0]、1、&dwWritten、NULL);
dwRead = 0;while (dwRead = 0){ReadFile (file、&rcvData、1、&dwRead、NULL);} #endif
int err = GetLastError();
if (sendData[0]!= rcvData) return (12);
VERBOSEPRINT (_T ("\n 应用程序自动波特成功"));//查找应用程序数据的起始值 txCount = 0;校验和= 0;#ifndef __linux__getc (AFH);getc (AFH);#endif getc (AFH);
while (txCount < 22){txCount++;fscanf_s (AFH、"%x"、&sendData[0]);校验和+= sendData[0]; //发送下一个 char #ifdef __linux__ 写入(fd、&sendData[0]、1);#else WriteFile (file、&sendData[0]、1、&dwWritten、 null); #endif}dwRead = 0;while (dwRead = 0){#ifdef __linux__ readf = read (fd、&buf、1); if (readf ==1) { QUIETPRINT (_T ("错误%s\n")、strerror (errno)); } dwRead = readf; rcvData = buf[0];#else ReadFile (file、&rcvData、1、&dwRead、 空); #endif}dwRead = 0;while (dwRead = 0){ #ifdef __linux__ readf = read (fd、&buf、1); if (readf ==1) { QUIETPRINT (_T ("错误%s\n")、strerror (errno)); } dwRead = readf; rcvDataH = buf[0];#else ReadFile (file、&rcvDataH、1、&dwRead、 null); #endif}
//确保校验和匹配(如果(checkSum!=(rcvData |(rcvDataH << 8))))返回(12);
//Ronnies 代码 int wordData;int byteData;txCount = 0;CHECKSUM = 0;
int totalCount = 0;wordData = 0x0000;byteData = 0x0000;fileStatus = 1;
//加载闪存应用程序 while (1){
fileStatus = fscanf_s (AFH、"%x "、&sendData[0]);if (fileStatus = 0) break;#ifdef __linux__ 写入(fd、&sendData[0]、1);#else WriteFile (file、&sendData[0]、1、&dwWritten、 null);#endif checksum += sendData[0];
//如果(txCount == 0x00){wordcata = sendData[0];}否则(txCount == 0x01){byteData = sendData[0];//从 MSB:LSB wordData |=(byteData <<8)形成 wordData;}则获取块大小
txCount++;totalCount++;
//如果下一个块大小为0,则退出 while 循环。 if (wordData = 0x00 && txCount > 1){
wordData = 0x0000;字节数据= 0x0000;
break;}//将在以下情况下执行:(txCount == 2 *(wordcount + 3)){dwRead = 0;while (dwRead ==0){#ifdef __linux__ readf = read (fd、&buf、1);if (readf =-1){#ifdef _linux_readt (#rint)}(%prrint);if (#ref"(#def_trint)(#def_error)) dwRead = readf;rcvData = buf[0];#else ReadFile (file、&rcvData、1、 dwRead、NULL);#endif}dwRead = 0;while (dwRead = 0){#ifdef __linux__ readf = read (fd、&buf、1);if (readf =-1){QUIETPRINT (_T ("Error %s\n")、readstrerror (fd、&buf、1);if (readif =-1){&r)}{&r DataTrr、readt = 1}、readr、readr 文件= 1、readmf (vrf); dwRead、NULL);#endif}//确保校验和匹配(如果(CHECKSUM!=(rcvData |(rcvDataH << 8)))返回(12);否则校验和= 0;
wordData = 0x0000;字节数据= 0x0000;txCount = 0x00;}//将在闪存内核缓冲区已满(0x400字= 0x800字节)时执行、否则(txCount - 6)% 0x800 = 0 && txCount > 6){dwRead = 0; while (dwRead =0){ #ifdef __linux__ readf = read (fd、&buf、1); if (readf ==1) { QUIETPRINT (_T ("错误%s\n")、strerror (errno)); } dwRead = readf; rcvData = buf[0]; #else ReadFile (file、&rcvData、1、&dwRead、NULL); #endif}dwRead = 0;while (dwRead = 0){#ifdef __linux__ readf = read (fd、&buf、1); if (readf ==1) { QUIETPRINT (_T ("错误%s\n")、strerror (errno)); } dwRead = readf; rcvDataH = buf[0];#else ReadFile (file、&rcvDataH、1、&dwRead、 空); #endif}//确保校验和匹配(如果(CHECKSUM!=(rcvData |(rcvDataH << 8)))返回(12);否则校验和= 0;}}VERBOSEPRINT (_T ("\n 应用程序加载成功")));
//不确定是否应该添加? 返回0;}
我成功使用了内核、串行闪存编程器和闪烁示例。
请使用我在 ZIP 中提供的文件执行以下命令以进行确认。 使用正确的 COM 端口进行设置。
serial_flash_programr.exe -d F2833x -v -k f28335_flash_kernel.txt -a Example_2833xLEDBlink.txt -p COM13
此致、
SAL
您好 Sal、
您能否在 F2833x 控制卡上刷写我们的应用文件?如果 您不能刷写到控制器卡、请告知我们。 我们在将以下代码刷写到电路板时遇到问题。
我在下面给出了附加的2个应用文件和串行闪存路径
文件名:PQCR_DAC_1.5V.out
C:\ti\c2000Ware_1_00_06_00\utilities\flash_programmers\serial_flash_programmer>serial_flash_programr.exe -d F2803x -k kernel.txt -a PQCR_DAC_1.5V.txt -p COM5 -b 9600 -v
文件名: PQCR_DAC_3V.out
C:\ti\c2000Ware_1_00_06_00\utilities\flash_programmers\serial_flash_programmer>serial_flash_programr.exe -d F2803x -k kernel.txt -a PQCR_DAC_3V.txt -p COM5 -b 9600 -v
请告知我们您是否能够进行刷写。
谢谢、此致、
Jyoti
e2e.ti.com/.../f05_5F00_DownloadImage_5F00_new.cppHiSal、
我们使用的是 F28335、但正如您建议的、我们将参数传递为 F2803x。
我们使一个内核项目和一个集成的应用程序项目无法正常工作。
首先、我们尝试在 Visual Studio 中运行内核代码并重置硬件。 似乎正在加载内核代码。
然后、只在 Visual Studio 中运行应用程序代码 、然后控制从以下代码返回到 main。
if (校验和!=(rcvData |(rcvDataH << 8)))
退货(12);
其他
校验和= 0;
此处 rcvData 为8、rcvDataH 为0、因此条件不匹配、控制返回到主系统、根本不加载应用程序文件。
我们也增加了延迟,但这对我们没有帮助。
我有一些查询、如所示
1) 1)是否需要进行喀尼尔负载复位?
2)对于 F2803x、我们没有找到任何擦除函数、 所以代码中不需要擦除?
3) 3) rcvData 和 rcvDataH 之间有何区别?
4) 4)您能否提供 F28335的整个项目文件?
附加了工程文件副本。 请查看此信息并告知我们问题。
谢谢、
Jyoti
e2e.ti.com/.../f05_5F00_DownloadImage_2800_1_2900_.cppHiSal、
今天我安装了 controlSUIT 4.9,正如 C2000微控制器串行闪存编程数据表中所建议的那样,我在 Visual Studio 中开始了串行闪存编程器文件夹的工作。
我观察到内核加载成功。
匹配应用自动波特率时出错。
在中、我发现 sendData 和 rcvData 不匹配。
我尝试了不同的波特率、我观察到了 rcvData 的不同值。
我尝试发送'A'以返回 不同波特率的31、0、172值
我尝试在加载内核后将延迟从10秒增加到1分钟、但我没有成功。
我尝试了一件事。 当我在发送每个字符后在内核中添加以下代码行时、应用程序自动波特率成功。
dwRead = 0;
while (dwRead = 0)
{
ReadFile (file、&rcvData、1、&dwRead、NULL);
睡眠(1);
}
printf (("=%lx\n")、rcvData);
但后来我坚持在 ReadFile (file、&rcvDataH、1、&dwRead、NULL); 在下面的环路中。
while (dwRead = 0)
{
#ifdef __linux__
readf =读取(fd、&buf、1);
if (readf ==1)
{
QUIETPRINT (_T ("错误%s\n")、strerror (errno));
}
dwRead = readf;
rcvDataH = buf[0];
其他
ReadFile (file、&rcvDataH、1、&dwRead、NULL);
睡眠(50);
#endif
}
您能给我们提供一些解决此问题的建议吗?
1) 1)在加载内核时添加读取函数后、为什么自动波特对于应用来说是成功的?
2)为什么控件粘在 ReadFile 中(file、&rcvDataH、1、&dwRead、NULL); 在上面的代码中?
3) 3)我们为什么需要修改 F28335的项目 、正如您所说的那样、它将直接工作?
3)您能否提供 F28335的项目文件。
我们使用的是 F28335、但正如您建议的、我们将参数传递为 F2803x。
attache F05_DownloadImage (1).cpp 文件。 您能查看此代码吗?
谢谢、
Jyoti
您好 Sal、
serial_flash_programr.exe -d F2833x -v -k f28335_flash_kernel.txt -a Example_2833xLEDBlink.txt -p COM13
您建议命令行使用 F2833x 作为器件 ID、但对于我们的项目、我们使用 F2803x 、因为我们的项目不支持 F2833x 器件。因此、如果您有支持 F2833x 器件的项目、请与我们分享。
问. 您能否告诉我们您将哪个 GPIO 引脚用于此 LEDBLinking 示例?
谢谢、此致、
Jyoti
尊敬的 Sal:
我们有2个应用文件(1.txt 和2.txt)。 我们能够在其中加载1.txt 应用程序文件、但无法加载2.txt。 您能不能向我们建议可能存在的问题。 两个文件大小相同、但内容变化很小。 已附加这两个应用程序文件供您参考。
e2e.ti.com/.../5123.1.txte2e.ti.com/.../6175.2.txt
谢谢、
Jyoti
在使用“serial_flash_programmer.exe”下载应用程序映像时,我们遇到了另一个问题。
我们可以下载我们自己的从 CCS4生成的示例代码。
我们还能够下载提供的一些.out 文件、然后将它们转换为十六进制。 使用 CCS8提供的工具“hex2000.exe”将这些文件从“*.out”转换为“*.txt”。
问题:
部分“*.out”文件未下载,在应用程序自动波特成功后停止。 它不会从环路中产生。
我们想知道原因,为什么某些应用程序十六进制文件在 其他文件下载时未成功下载?
请优先帮助我们解决此问题。
谢谢、
Sal 提到的线结束问题的调试示例: e2e.ti.com/.../2902135
谢谢、此致、
Vamsi
e2e.ti.com/.../Application_5F00_Image_5F00_Not_5F00_working.txte2e.ti.com/.../Application_5F00_Image_5F00_Working.txtHi、Vamsi & Sal、
正如 Vamsi 建议的那样 我们将继续在此处发布新问题。
我们可以下载我们自己的从 CCS4生成的示例代码。
我们还能够下载提供的一些.out 文件、然后将它们转换为十六进制。 使用 CCS8提供的工具“hex2000.exe”将这些文件从“*.out”转换为“*.txt”。
问题:
部分“*.out”文件未下载,在应用程序自动波特成功后停止。 它不会从环路中产生。
我们想知道原因,为什么某些应用程序十六进制文件在 其他文件下载时未成功下载?
PFA:正在工作和不工作的应用程序映像文件。
我们已经在 Windows 10和7操作系统上进行了测试。 我们不会使用记事本打开转换后的.txt 文件、以避免附加字符出现任何问题。
请您检查您的最终优先级并提供解决方案。
等待您的回复
e2e.ti.com/.../Working_5F00_NotWorking.zipe2e.ti.com/.../F28334_5F00_cmd_5F00_linker.txt
大家好、Vamsi & Sal、
我们使用的是独立应用程序映像。 我们将使用以下命令从".out"转换为".txt"
(hex2000.exe -boot -sci8 -a -o application.txt application.out)
然后使用"serial_flash_programmer.exe"并使用以下参数进行刷写:
(serial_flash_programr.exe -d F2803x -k kernel.txt -a application.txt -p COM3 -b 9600 -v)
我们将从项目默认重建选项生成.out 文件
附件:cmd 链接器文件。(文件扩展名更改为.txt)
附加的图像:工作中和不工作
附加的.out 文件 :工作中和不工作中
所附的.txt 文件:工作中和不工作中
正在等待您的快速 resolution.e2e.ti.com/.../8524.Application_5F00_Image_5F00_Working.txte2e.ti.com/.../1234.Application_5F00_Image_5F00_Not_5F00_working.txt
谢谢你
此致、
Bhanu
您好 Bhanu、
感谢您对我们团队的澄清:
-您对两个.out 文件使用相同的 linker.cmd?
-您在 Windows 计算机上构建和转换文件?
-什么导致.out 文件中的更改(#define changes、manual edit、...)?
只是尝试了解导致此问题的原因、因为生成的.txt 在某些字节中仅有细微差异。 我假设您在多个电路板上尝试过多次? 也有不同的顺序?
您是否有更多使用其他源代码或构建选项的工作/非工作示例?
此致、
弗兰克
您好、Frank、
请查看以下信息:
-您对两个.out 文件使用相同的 linker.cmd?
(是...我们使用相同的链接器文件)
-您在 Windows 计算机上构建和转换文件?
(是的。我们使用 Windows 10环境)
-什么导致.out 文件中的更改(#define changes、manual edit、...)?
(更改一些通过 SPI 发送以配置 DAC 的变量)
检查所附图像显示了哪些更改使其正常工作、哪些更改不起作用。
只需尝试了解可能导致此问题的原因,因为生成的.txt 在某些字节中只有细微的差异。 我假设您在多个电路板上尝试过多次? 也有不同的顺序?
(是的。。。我们在两个板上尝试了多次)
附件:
工作&不工作 Image2e.ti.com/.../Working_5F00_1v.txte2e.ti.com/.../Not_5F00_Working2.txtes(set-2)-使用了相同的链接器文件
谢谢、
Bhanu
e2e.ti.com/.../SCI_5F00_Boot.cHi、Sal、
我们已尝试您的建议更改,并在下面添加了。
(SciaRegs.SCIHBAUD = 1;)
它没有解决问题、
供参考:在此处附加"SCI_Boot.c"文件。
请检查并告知我们您是否会建议进行任何其他更改。
等待您的回复。
此致、
Bhanu
您好、Jyoti、
我已经检查了您的 SCI_Boot.c 文件。
您进行了以下更改:
//
//必须使用大于1的主波特率寄存器
//
SciaRegs.SCILBAUD = 1;
SciaRegs.SCIHBAUD = 1;// TI 建议使用此行
文件中有一个小错误。 TI 建议使 HBAUD = 0而不是 HBAUD = 1。
请检查 Sal 的帖子。
如 Sal 所述、请将其修改为
//
//必须使用大于1的主波特率寄存器
//
SciaRegs.SCILBAUD.bit.波特= 1;
SciaRegs.SCIHBAUD.bit.baud = 0;//添加此行代码
通过此更改、重建内核并重新生成内核的 hex 文件。
谢谢、
Katta
e2e.ti.com/.../DSP2833x_5F00_Sci.hHiSal & Katta、
不像您建议的那样工作。
正如您所提到的、我们已经测试了以下行、但进行了一些微小的更改、因为确切行会给出屏幕截图中所附的编译错误。
此外、我们还使用"DSP2833x_Sci.h"头文件。 我随函附上供您参考。
//
//必须使用大于1的主波特率寄存器
//
//SciaRegs.SCILBAUD = 1;
SciaRegs.SCILBAUD = 1;
SciaRegs.SCIHBAUD = 0; //添加了 TI 建议的此行
//
//准备自动波特率检测。 设置 CDC 位以启用自动波特
//检测并清除 Abd 位
//
请检查并提供解决方案。
谢谢、
此致、
Bhanu
e2e.ti.com/.../0216.Application_5F00_Image_5F00_Working.txte2e.ti.com/.../6153.Application_5F00_Image_5F00_Not_5F00_working.txte2e.ti.com/.../Serial_5F00_Data_5F00_Capture_5F00_Working_5F00_NotWorking.zipHiSal & Katta
除了 上述回复外、我们还可以观察到通过 USB UART 串行端口下载时的情况。
我们正在使用主机端的串行端口分析器在下载到电路板时调试此问题、以验证下载步骤的确切顺序。
PFA :工作文件和不工作文件,为您参考而捕获的串行数据。
还随附了工作和不工作(.txt)文件供您参考。
观察结果:
1:多次使用不起作用的文件捕获。
答:下载应用程序映像时,它总是在相同的特定位置停止。 (订单编号:104491)
b.在发送应用程序映像的每个块(主要是4094字节)后、它将接收2个字节的数据(即校验和)、
c.发送最后一个块后,我们不会接收校验和(按顺序停止:104491)。 它在工作文件中接收
2.我们看到工作文件和非工作文件中只有3个字节的代码更改。
a:这些更改属于最后一个不工作文件块的区域、我们不会接收校验和。
为什么我们没有收到校验和、原因可能是什么? (我们已经观察到、在完成大约70%后、它会停止下载)
此致、
Bhanu
您好 Bhanu、
我测试了您发送的两个.txt。 并且两个都已成功加载。
我不确定问题可能是什么。
首先、您能否尝试使用我附加的 ZIP 中的内容。 可能有一些细微的差异、但我不确定可能会是什么。
其次、您能否使用编译器或链接器标志来生成代码的子段。 我看到您的十六进制文件中有非常大的数据块。 也许将这些细分为更小的块会有所帮助。 尽管我不是肯定的、但-gen_func_subsections 标志可能有助于将其分解。
此致、
SAL
e2e.ti.com/.../Kernel_5F00_Header.zipHiSal、
我们已使用您的共享内核 文件和 serial_flash_programmer 进行了测试 、我们也发现这些文件具有相同的观察结果。
实际上、我们使用的是 TMS320F28334 MCU、我假设您在不同的 MCU 上进行测试、即28335。
我们请求您检查我们正在使用的确切器件。
我正在附加闪存内核和用于生成相同内容的头文件。
1.为什么没有使用不起作用的文件从 MCU 接收校验和?
2.为什么在6个位置发生2个字节的变化会导致上述情况?
附加比较屏幕截图图像也可供参考。
此致、
Bhanu