TI中文支持网
TI专业的中文技术问题搜集分享网站

TMS320F28335: C2000ware中的例程报错是什么情况

Qing Xue Lin阅读(811)

Part Number:TMS320F28335Other Parts Discussed in Thread:C2000WARE

Example_2833xEPwmTripZone这个示例

Vivian Gao:

CCS版本和C2000WARE版本是什么

,

Qing Xue Lin:

CCS是12.8.1,C2000WARE版本是5_05_00_00

,

Vivian Gao:

请更新项目设置以使用rts2800_fpu32_fast_supplement_coff.lib文件,如下图所示。 索引库(rts2800_fpu32_fast_supplement.lib)无法解析它以使用coff版本

TMS320F28377D: 使用CPU1BOOTCPU2时,能正常启动,但是IPC通信不工作。使用仿真器逐个启动,IPC通信可以工作

Mingyang Zou阅读(722)

Part Number:TMS320F28377DOther Parts Discussed in Thread:C2000WARE

尊敬的TI工程师:
我有一个很费解的问题。

当我使用仿真器,逐个启动CPU1与CPU2的时候,他们是能够正常通过IPC通信传输数据的。

但是当我增加了CPU1BOOTCPU2的代码,脱离仿真器,也是可以正常启动的,因为我设置的CPU1和CPU2的中断指示灯都在正常闪烁工作。

但是,IPC通信不工作,因为CPU2并不更新我CPU1中的数据。

我现在向询问CPU1启动CPU2的过程究竟是什么样的,他们会对IPC产生影响吗,以下是我IPC通信代码:
CPU1:

void CPU1_SentDataTo_CPU2_USER()
{
Uint16 index=0;
float32 *Cpu1ToCpu2Ram = (void *)0x0003FC00;//无类型指针转为浮点数类型指针:*Cpu1ToCpu2Ram代表访问指针指向的实际值。代表把0x0003FC00写入Cpu1ToCpu2Ram

if(IpcRegs.IPCSTS.bit.IPC1 == 1) //如果检测到了远程CPU生成了IPC1事件,该事件为将IPC1置为1。在CPU2中设置好在Ram中读完数据之后再写.表示CPU2读完了数据
{
//预留赋值

//IPC数据装载
//解释一下为什么放大倍数:由于一些原因,在CPU2中的IPC数据只能是int16,表示范围为-32768到32767
//这个范围绝对够用,但要考虑到float32到int16的转换问题,float到int是只保留整数(包含正负) 因此只考虑小数即可,电流可保留2位小数,电压比较大,保留1位小数
//温度不需要
CPU1TOCPU2[0] = AdcFilters.IL1*100;
CPU1TOCPU2[1] = AdcFilters.IL2*100;
CPU1TOCPU2[2] = AdcFilters.IL3*100;
CPU1TOCPU2[3] = AdcFilters.IL4*100;
CPU1TOCPU2[4] = AdcFilters.IL5*100;
CPU1TOCPU2[5] = AdcFilters.IL6*100;
CPU1TOCPU2[6] = AdcFilters.Iin1*100;
CPU1TOCPU2[7] = AdcFilters.Iin2*100;
CPU1TOCPU2[8] = AdcFilters.Iin3*100;
CPU1TOCPU2[9] = AdcFilters.Iin4*100;
CPU1TOCPU2[10] = AdcFilters.Iin5*100;
CPU1TOCPU2[11] = AdcFilters.Iin6*100;
CPU1TOCPU2[12] = AdcFilters.Iout*100;
CPU1TOCPU2[13] = AdcFilters.Ubus*10;
CPU1TOCPU2[14] = AdcFilters.Uout*10;
CPU1TOCPU2[15] = AdcFilters.Uin1*10;
CPU1TOCPU2[16] = AdcFilters.Uin2*10;
CPU1TOCPU2[17] = AdcFilters.Uin3*10;
CPU1TOCPU2[18] = AdcFilters.Uin4*10;
CPU1TOCPU2[19] = AdcFilters.Uin5*10;
CPU1TOCPU2[20] = AdcFilters.Uin6*10;
CPU1TOCPU2[21] = NTCTrans.Temp1;
CPU1TOCPU2[22] = NTCTrans.Temp2;
CPU1TOCPU2[23] = NTCTrans.Temp3;
CPU1TOCPU2[24] = NTCTrans.Temp4;
CPU1TOCPU2[25] = NTCTrans.Temp5;
CPU1TOCPU2[26] = NTCTrans.Temp6;
CPU1TOCPU2[27] = _IPC_DATA.ERROR_OVERCURRENT_IN1_value*100;
CPU1TOCPU2[28] = _IPC_DATA.ERROR_OVERCURRENT_IN2_value*100;
CPU1TOCPU2[29] = _IPC_DATA.ERROR_OVERCURRENT_IN3_value*100;
CPU1TOCPU2[30] = _IPC_DATA.ERROR_OVERCURRENT_IN4_value*100;
CPU1TOCPU2[31] = _IPC_DATA.ERROR_OVERCURRENT_IN5_value*100;
CPU1TOCPU2[32] = _IPC_DATA.ERROR_OVERCURRENT_IN6_value*100;
CPU1TOCPU2[33] = _IPC_DATA.ERROR_OVERCURRENT_OUT_value*100;
CPU1TOCPU2[34] = _IPC_DATA.ERROR_OVERVOLTAGE_IN1_value*10;
CPU1TOCPU2[35] = _IPC_DATA.ERROR_OVERVOLTAGE_IN2_value*10;
CPU1TOCPU2[36] = _IPC_DATA.ERROR_OVERVOLTAGE_IN3_value*10;
CPU1TOCPU2[37] = _IPC_DATA.ERROR_OVERVOLTAGE_IN4_value*10;
CPU1TOCPU2[38] = _IPC_DATA.ERROR_OVERVOLTAGE_IN5_value*10;
CPU1TOCPU2[39] = _IPC_DATA.ERROR_OVERVOLTAGE_IN6_value*10;
CPU1TOCPU2[40] = _IPC_DATA.ERROR_OVERVOLTAGE_BUS_value*10;
CPU1TOCPU2[41] = _IPC_DATA.ERROR_OVERVOLTAGE_OUT_value*10;
CPU1TOCPU2[42] = _IPC_DATA.ERROR_OVERTEMPERATURE_1_value;
CPU1TOCPU2[43] = _IPC_DATA.ERROR_OVERTEMPERATURE_2_value;
CPU1TOCPU2[44] = _IPC_DATA.ERROR_OVERTEMPERATURE_3_value;
CPU1TOCPU2[45] = _IPC_DATA.ERROR_OVERTEMPERATURE_4_value;
CPU1TOCPU2[46] = _IPC_DATA.ERROR_OVERTEMPERATURE_5_value;
CPU1TOCPU2[47] = _IPC_DATA.ERROR_OVERTEMPERATURE_6_value;
CPU1TOCPU2[48] = _IPC_DATA.ERROR_STATU;
CPU1TOCPU2[49] = _IPC_DATA.ERROR_NUM;
CPU1TOCPU2[50] = _IPC_DATA.ERROR_NUM_LAST;
CPU1TOCPU2[51] = _IPC_DATA.DCPRESTATU;

//Ram写入
for (index = 0; index < 60; index++)//Ram一共是1k=1024*16位,float是32位,因此最多写512个变量,数据范围[0,511]
{
*(Cpu1ToCpu2Ram + index) = CPU1TOCPU2[index];//*Cpu1ToCpu2Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}
IpcRegs.IPCSET.bit.IPC0 = 1;//CPU1数据更新完成,触发IPC事件0,表示CPU1完成了数据写
IpcRegs.IPCACK.bit.IPC1 = 1;//清CPU2读取完IPC事件1

M_ClrFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
if(M_ChkCounter(CNT.CNTIPCWrite,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
}

void CPU1_ReadDataFrom_CPU2_USER()
{
Uint16 index=0;
float32 *Cpu2ToCpu1Ram = (void *)0x0003F800;//无类型指针转为浮点数类型指针:*Cpu2ToCpu1Ram代表访问指针指向的实际值。代表把0x0003F800写入Cpu2ToCpu1Ram

if(IpcRegs.IPCSTS.bit.IPC0 == 1)//检测到CPU2写完了数据
{
for(index = 0; index < 50; index++)//Ram读取
{
CPU1FROMCPU2[index] = *(Cpu2ToCpu1Ram + index);//*Cpu2ToCpu1Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}
_IPC_DATA.START_CONTROL = CPU1FROMCPU2[0];
_IPC_DATA.OVERCURRENT_IN_time = CPU1FROMCPU2[1];
_IPC_DATA.OVERCURRENT_IN_value = CPU1FROMCPU2[2];
_IPC_DATA.OVERCURRENT_OUT_time = CPU1FROMCPU2[3];
_IPC_DATA.OVERCURRENT_OUT_value = CPU1FROMCPU2[4];
_IPC_DATA.OVERTEMPERATURE_time = CPU1FROMCPU2[5];
_IPC_DATA.OVERTEMPERATURE_value = CPU1FROMCPU2[6];
_IPC_DATA.OVERVOLTAGE_IN_time = CPU1FROMCPU2[7];
_IPC_DATA.OVERVOLTAGE_IN_value = CPU1FROMCPU2[8];
_IPC_DATA.OVERVOLTAGE_OUT_time = CPU1FROMCPU2[9];
_IPC_DATA.OVERVOLTAGE_OUT_value = CPU1FROMCPU2[10];
_IPC_DATA.ERROR_CLEAR = CPU1FROMCPU2[11];
_IPC_DATA.ERROR_OPPPSITE_CURRENT_value = CPU1FROMCPU2[12];

IpcRegs.IPCSET.bit.IPC1 = 1;//CPU1数据更新完成,触发IPC事件1,表示CPU1完成了数据读
IpcRegs.IPCACK.bit.IPC0 = 1;//清CPU2写完IPC事件0

M_ClrFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}

if(M_ChkCounter(CNT.CNTIPCRead,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}
}

CPU2:

void CPU2_SentDataTo_CPU1_USER()
{
Uint16 index=0;
float32 *Cpu2ToCpu1Ram = (void *)0x0003F800;//无类型指针转为浮点数类型指针:*Cpu2ToCpu1Ram代表访问指针指向的实际值。代表把0x0003F800写入Cpu2ToCpu1Ram

if(IpcRegs.IPCSTS.bit.IPC1 == 1) //如果检测到了远程CPU生成了IPC1事件,该事件为将IPC1置为1。在CPU1中设置好在Ram中读完数据之后再写.表示CPU1读完了数据
{
//预留赋值

//IPC数据装载
CPU2TOCPU1[0] = _IPC_DATA.START_CONTROL;
CPU2TOCPU1[1] = _IPC_DATA.OVERCURRENT_IN_time;
CPU2TOCPU1[2] = _IPC_DATA.OVERCURRENT_IN_value;
CPU2TOCPU1[3] = _IPC_DATA.OVERCURRENT_OUT_time;
CPU2TOCPU1[4] = _IPC_DATA.OVERCURRENT_OUT_value;
CPU2TOCPU1[5] = _IPC_DATA.OVERTEMPERATURE_time;
CPU2TOCPU1[6] = _IPC_DATA.OVERTEMPERATURE_value;
CPU2TOCPU1[7] = _IPC_DATA.OVERVOLTAGE_IN_time;
CPU2TOCPU1[8] = _IPC_DATA.OVERVOLTAGE_IN_value;
CPU2TOCPU1[9] = _IPC_DATA.OVERVOLTAGE_OUT_time;
CPU2TOCPU1[10] = _IPC_DATA.OVERVOLTAGE_OUT_value;
CPU2TOCPU1[11] = _IPC_DATA.ERROR_CLEAR;
CPU2TOCPU1[12] = _IPC_DATA.ERROR_OPPPSITE_CURRENT_value;
CPU2TOCPU1[13] = 0;
CPU2TOCPU1[14] = 0;
CPU2TOCPU1[15] = 0;
CPU2TOCPU1[16] = 0;
CPU2TOCPU1[17] = 0;
CPU2TOCPU1[18] = 0;
CPU2TOCPU1[19] = 0;
CPU2TOCPU1[20] = 0;
CPU2TOCPU1[21] = 0;
CPU2TOCPU1[22]=0;
CPU2TOCPU1[23]=0;
CPU2TOCPU1[24]=0;
CPU2TOCPU1[25]=0;
CPU2TOCPU1[26]=0;
CPU2TOCPU1[27]=0;
CPU2TOCPU1[28]=0;
CPU2TOCPU1[29]=0;
CPU2TOCPU1[30]=0;
CPU2TOCPU1[31]=0;
CPU2TOCPU1[32]=0;
CPU2TOCPU1[33]=0;

//Ram写入
for (index = 0; index < 50; index++)//Ram一共是1k=1024*16位,float是32位,因此最多写512个变量,数据范围[0,511]
{
*(Cpu2ToCpu1Ram + index) = CPU2TOCPU1[index];//*Cpu1ToCpu2Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}
IpcRegs.IPCSET.bit.IPC0 = 1;//CPU2数据更新完成,触发IPC事件0,表示CPU2完成了数据写
IpcRegs.IPCACK.bit.IPC1 = 1;//清CPU1读取完IPC事件1

M_ClrFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
if(M_ChkCounter(CNT.CNTIPCWrite,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_WRITE_OVERTIME);
CNT.CNTIPCWrite = 0;
}
}

void CPU2_ReadDataFrom_CPU1_USER()
{
Uint16 index=0;
float32 *Cpu1ToCpu2Ram = (void *)0x0003FC00;//无类型指针转为浮点数类型指针:*Cpu1ToCpu2Ram代表访问指针指向的实际值。代表把0x0003FC00写入Cpu1ToCpu2Ram

if(IpcRegs.IPCSTS.bit.IPC0 == 1)//检测到CPU1写完了数据
{
for(index = 0; index < 60; index++)//Ram读取
{
CPU2FROMCPU1[index] = *(Cpu1ToCpu2Ram + index);//*Cpu1ToCpu2Ram是float32位,因此此处+index,在地址上面会自动加4字节。
}

_IPC_DATA.IL1 = CPU2FROMCPU1[0];
_IPC_DATA.IL2 = CPU2FROMCPU1[1];
_IPC_DATA.IL3 = CPU2FROMCPU1[2];
_IPC_DATA.IL4 = CPU2FROMCPU1[3];
_IPC_DATA.IL5 = CPU2FROMCPU1[4];
_IPC_DATA.IL6 = CPU2FROMCPU1[5];
_IPC_DATA.Iin1 = CPU2FROMCPU1[6];
_IPC_DATA.Iin2 = CPU2FROMCPU1[7];
_IPC_DATA.Iin3 = CPU2FROMCPU1[8];
_IPC_DATA.Iin4 = CPU2FROMCPU1[9];
_IPC_DATA.Iin5 = CPU2FROMCPU1[10];
_IPC_DATA.Iin6 = CPU2FROMCPU1[11];
_IPC_DATA.Iout = CPU2FROMCPU1[12];
_IPC_DATA.Ubus = CPU2FROMCPU1[13];
_IPC_DATA.Uout = CPU2FROMCPU1[14];
_IPC_DATA.Uin1 = CPU2FROMCPU1[15];
_IPC_DATA.Uin2 = CPU2FROMCPU1[16];
_IPC_DATA.Uin3 = CPU2FROMCPU1[17];
_IPC_DATA.Uin4 = CPU2FROMCPU1[18];
_IPC_DATA.Uin5 = CPU2FROMCPU1[19];
_IPC_DATA.Uin6 = CPU2FROMCPU1[20];
_IPC_DATA.Temp1 = CPU2FROMCPU1[21];
_IPC_DATA.Temp2 = CPU2FROMCPU1[22];
_IPC_DATA.Temp3 = CPU2FROMCPU1[23];
_IPC_DATA.Temp4 = CPU2FROMCPU1[24];
_IPC_DATA.Temp5 = CPU2FROMCPU1[25];
_IPC_DATA.Temp6 = CPU2FROMCPU1[26];
_IPC_DATA.ERROR_OVERCURRENT_IN1_value = CPU2FROMCPU1[27];
_IPC_DATA.ERROR_OVERCURRENT_IN2_value = CPU2FROMCPU1[28];
_IPC_DATA.ERROR_OVERCURRENT_IN3_value = CPU2FROMCPU1[29];
_IPC_DATA.ERROR_OVERCURRENT_IN4_value = CPU2FROMCPU1[30];
_IPC_DATA.ERROR_OVERCURRENT_IN5_value = CPU2FROMCPU1[31];
_IPC_DATA.ERROR_OVERCURRENT_IN6_value = CPU2FROMCPU1[32];
_IPC_DATA.ERROR_OVERCURRENT_OUT_value = CPU2FROMCPU1[33];
_IPC_DATA.ERROR_OVERVOLTAGE_IN1_value = CPU2FROMCPU1[34];
_IPC_DATA.ERROR_OVERVOLTAGE_IN2_value = CPU2FROMCPU1[35];
_IPC_DATA.ERROR_OVERVOLTAGE_IN3_value = CPU2FROMCPU1[36];
_IPC_DATA.ERROR_OVERVOLTAGE_IN4_value = CPU2FROMCPU1[37];
_IPC_DATA.ERROR_OVERVOLTAGE_IN5_value = CPU2FROMCPU1[38];
_IPC_DATA.ERROR_OVERVOLTAGE_IN6_value = CPU2FROMCPU1[39];
_IPC_DATA.ERROR_OVERVOLTAGE_BUS_value = CPU2FROMCPU1[40];
_IPC_DATA.ERROR_OVERVOLTAGE_OUT_value = CPU2FROMCPU1[41];
_IPC_DATA.ERROR_OVERTEMPERATURE_1_value = CPU2FROMCPU1[42];
_IPC_DATA.ERROR_OVERTEMPERATURE_2_value = CPU2FROMCPU1[43];
_IPC_DATA.ERROR_OVERTEMPERATURE_3_value = CPU2FROMCPU1[44];
_IPC_DATA.ERROR_OVERTEMPERATURE_4_value = CPU2FROMCPU1[45];
_IPC_DATA.ERROR_OVERTEMPERATURE_5_value = CPU2FROMCPU1[46];
_IPC_DATA.ERROR_OVERTEMPERATURE_6_value = CPU2FROMCPU1[47];
_IPC_DATA.ERROR_STATU = CPU2FROMCPU1[48];
_IPC_DATA.ERROR_NUM = CPU2FROMCPU1[49];
_IPC_DATA.ERROR_NUM_LAST = CPU2FROMCPU1[50];
_IPC_DATA.DCPRESTATU = CPU2FROMCPU1[51];

IpcRegs.IPCSET.bit.IPC1 = 1;//CPU2数据更新完成,触发IPC事件1,表示CPU2完成了数据读
IpcRegs.IPCACK.bit.IPC0 = 1;//清CPU1写完IPC事件0

M_ClrFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}

if(M_ChkCounter(CNT.CNTIPCRead,DELAY_5S) >= 0)
{
M_SetFlag(STS_IPC_READ_OVERTIME);
CNT.CNTIPCRead = 0;
}
}

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Alice:

您好,

      CPU1启动CPU2过程,请参考c2000ware中的示例 cpu01_to_cpu02_ipcdrivers_wprotect_cpu1 

TMS320F28335: sysconfig问题

Qing Xue Lin阅读(864)

Part Number:TMS320F28335Other Parts Discussed in Thread:SYSCONFIG

正常应该有好多参数可以调,为什么我的软件上只有name下面的这些

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Lydia:

您好,

这是sysconfig培训相关文档以及视频,请参考,

Application Note C2000 SysConfig : https://www.ti.com.cn/lit/an/spracx3/spracx3.pdf

C2000Tm SysConfig 视频 : www.ti.com.cn/…/C2000-SysConfig.html

,

Qing Xue Lin:

他的示例是通过例程里面的syscfg文件配置的,F28335的例程似乎都没有这个文件,我直接用SysConfig怎么把name以外的功能弄出来呀

,

Lydia:

您好,

C2000 SysConfig 对28335没有全面支持,具体请参考下面两个帖子,

https://e2echina.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/201437/syscfg/628980?tisearch=e2e-sitesearch&keymatch=F28335%20syscfg#

e2echina.ti.com/…/2835160

,

Qing Xue Lin:

我之前就看过这两个帖子,知道没有全面支持,但是这个没有全面支持就是只有name这个功能吗?

,

Lydia:

请注意、SysConfig 仅支持第3代器件(F2807x 以上版本)、F28335器件不支持。

TMS320F28027: 请问C2000链接器的哪个选项可以剔除代码中未使用的函数?

Xiao Dong阅读(781)

Part Number:TMS320F28027Other Parts Discussed in Thread:C2000WARE

由于某些原因,我希望编译的代码尽可能小,已经采用-O4 –opt_for_speed=0编译选项,尽量减少代码体积。

实际中发现,有些不使用的函数也会占用空间,必须把这些函数注释掉,才能有效降低空间,其它编译器比如ARM都可以设置选项,linker在链接的时候会忽略这些不使用的函数。比如ARM的GCC可以用-ffunction-sections、-fdata-sections和-Wl,–gc-sections来设置不链接的函数。请问C2000链接器的哪个选项可以剔除代码中未使用的函数?

找到一个链接器选项–unused_section_elimination=on,不过提示只有EABI才支持,我的项目输出格式是COFF。

我的CCS版本是 12.8.1.00005 ,编译器版本v22.6.1.LTS

Xiao Dong:

试了下EABI格式,输出代码减小了很多,看了下不用的函数也都剔除掉了。但是因为我的项目使用了FLASH_API,28335/28035/28069这些器件没有 提供EABI版本的FLASH_API库,导致无法使用EABI输出格式,是否可以提供这些器件的EABI版本的FLASH_API库?

,

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Lydia:

您好,

关于最新版本的 Flash API,可在 C2000Ware/libraries/flash_api 中找到。

,

Xiao Dong:

我这里有最新的C2000Ware,也一直在用FLASH API的COFF版本,我想找的是28335/28035/28069这些芯片EABI版本的FLASH API

,

Lydia:

目前没有计划将现有的 F2833x 库移植到 EABI。

另外您可以自行搜索资源库,dev.ti.com/…/node

TMS320F28377D:向烧写CPU2烧写程序时,会影响到CPU1的初始化数据值

Mingyang Zou阅读(1240)

Part Number:TMS320F28377DOther Parts Discussed in Thread:C2000WARE

下图是我在烧写完CPU1时的变量值的状态。

此时这些数据一切正常

但是当我烧写CPU2时,这些值会发生变化,如下图所示

最开始是怀疑两个CPU的地址有重复,导致数据覆盖,但是查阅CMD文件,并没有这样的问题。 以下给出两个CMD文件内容:

cpu1的cmd:

MEMORY
{
PAGE 0 : /* 程序内存 */
/* 内存(RAM/FLASH)块可以移动到 PAGE1 进行数据分配 */
/* BEGIN 用于“引导到 Flash”引导加载程序模式 */

BEGIN : 原点 = 0x080000, 长度 = 0x000002
RAMM0 : 原点 = 0x000123, 长度 = 0x0002DD
RAMD0 : 原点 = 0x00B000, 长度 = 0x000800
RAMLS0 : 原点 = 0x008000, 长度 = 0x000800
RAMLS1 : 原点 = 0x008800, 长度 = 0x000800
RAMLS2 : 原点 = 0x009000, 长度 = 0x000800
RAMLS3 : 原点 = 0x009800, 长度 = 0x000800
RAMLS4 : 原点 = 0x00A000, 长度 = 0x000800

RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008 /* 根据勘误公告“内存:超出有效内存的预取”保留且不用于代码 */

RESET : origin = 0x3FFFC0, length = 0x000002//上电就到RESET,然后执行一大堆,根据GPIO启动方式,跳到BEGIN,而用户程序的入口通常是 _c_int00
//CODESTART放在了BEGIN
若0x080000 处的 BEGIN 段未被有效代码占用,DSP上电后执行 0x080000 处的代码时,若此处没有有效的跳转指令,程序无法跳转到 _c_int00,导致冷启动失败。
解决方法:TI提供了CodeStartBranch.asm文件,使得自动跳转。asm中:.sect “codestart” 将自身链接到 codestart 段
/* 闪存扇区 */
FLASHA : 原点 = 0x080002, 长度 = 0x001FFE /* 片上闪存 */
FLASHB : 原点 = 0x082000, 长度 = 0x002000 /* 片上闪存 */
FLASHC : 原点 = 0x084000, 长度 = 0x002000 /* 片上闪存 */
FLASHD : 原点 = 0x086000, 长度 = 0x002000 /* 片上闪存 */
FLASHE : 原点 = 0x088000, 长度 = 0x008000 /* 片上闪存 */
FLASHF : 原点 = 0x090000, 长度 = 0x008000 /* 片上闪存 */
FLASHG : 原点 = 0x098000, 长度 = 0x008000 /* 片上闪存 */
FLASHH : 原点 = 0x0A0000, 长度 = 0x008000 /* 片上闪存 */
FLASHI : 原点 = 0x0A8000, 长度 = 0x008000 /* 片上闪存 */
FLASHJ : 原点 = 0x0B0000, 长度 = 0x008000 /* 片上闪存 */
FLASHK : 原点 = 0x0B8000,长度 = 0x002000 /* 片上闪存 */
FLASHL : 原点 = 0x0BA000, 长度 = 0x002000 /* 片上闪存 */
FLASHM : 原点 = 0x0BC000, 长度 = 0x002000 /* 片上闪存 */
FLASHN : 原点 = 0x0BE000, 长度 = 0x001FF0 /* 片上闪存 */

FLASHN_RSVD : origin = 0x0BFFF0, length = 0x000010 /* 根据勘误公告“内存:超出有效内存的预取”保留且不用于代码 */

PAGE 1 : /* 数据存储器 */
/* 内存 (RAM/FLASH) 块可以移动到 PAGE0 进行程序分配 */

BOOT_RSVD : origin = 0x000002, length = 0x000121 /* M0的一部分,BOOT rom将用于堆栈 */
RAMM1 : origin = 0x000400, length = 0x0003F8 /* 片上RAM块M1 */
RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* 根据勘误公告“内存:超出有效内存的预取”保留且不用于代码 */
RAMD1 : origin = 0x00B800, length = 0x000800

RAMLS5:原点 = 0x00A800,长度 = 0x000800

/* RAMGS0 : 原点 = 0x00C000, 长度 = 0x001000
RAMGS1 : 原点 = 0x00D000, 长度 = 0x001000
RAMGS2 : 原点 = 0x00E000, 长度 = 0x001000
RAMGS3 : 原点 = 0x00F000, 长度 = 0x001000
RAMGS4 : 原点 = 0x010000, 长度 = 0x001000
RAMGS5 : 原点 = 0x011000, 长度 = 0x001000
RAMGS6 : 原点 = 0x012000, 长度 = 0x001000
RAMGS7 : 原点 = 0x013000,长度 = 0x001000
*/
RAMGS01234567 : 原点 = 0x00C000,长度 = 0x008000

CPU2TOCPU1RAM : 原点 = 0x03F800,长度 = 0x000400
CPU1TOCPU2RAM : 原点 = 0x03FC00,长度 = 0x000400
}

SECTIONS
{
/* Allocate program areas: */
//ALIGN(8):将段按 8 字节对齐,提高访问效率。 .cinit : > FLASHB PAGE = 0, ALIGN(4)//存储全局变量和静态变量的初始化值,放入FLASHB。 .pinit : > FLASHB, PAGE = 0, ALIGN(4)//存储程序启动时需要执行的初始化函数指针(如全局对象构造函数)。 .text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(4)//.text:存储程序代码,放入多个 FLASH 区域(FLASHB、FLASHC等)。 //>>:表示允许段跨越多个区域,优化空间利用。|:逻辑 OR,用于合并多个区域。 codestart : > BEGIN PAGE = 0, ALIGN(4)//codestart:程序入口点,放入BEGIN区域
/* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE = 1//.stack:栈空间, 用于函数调用和局部变量,放入RAMM1。 .ebss : > RAMGS01234567, PAGE = 1//ebss:存储未初始化的全局变量和静态变量(默认值为 0),位于多个 RAM 区
.esysmem : > RAMLS5, PAGE = 1//.esysmem:系统内存,用于动态内存分配(如malloc),位于RAMLS5

.econst : >> FLASHF PAGE = 0, ALIGN(4)//.econst:存储常量数据(如字符串字面量),位于FLASHF以节省 RAM 空间。 .switch : > FLASHB PAGE = 0, ALIGN(4)//.switch:用于switch-case语句的跳转表,放入FLASHB。

.reset : > RESET, PAGE = 0, TYPE = DSECT /* 未使用, *///.reset:复位向量表,放入RESET区域

.cio : > RAMLS5, PAGE = 1//.cio:标准输入输出(C I/O)相关缓冲区,位于RAMLS5。
/* 初始化的章节进入 Flash */

#ifdef __TI_COMPILER_VERSION__ // 检查是否使用 TI 编译器
#if __TI_COMPILER_VERSION__ >= 15009000 // 针对编译器版本 >= 15.9.0 的新语法
.TI.ramfunc : {} // 定义段名 (新版使用 .TI.ramfunc)
LOAD = FLASHD, // 加载地址:Flash D 区
RUN = RAMLS0, // 运行地址:RAM LS0 区
LOAD_START(_RamfuncsLoadStart), // 定义加载起始地址符号
LOAD_SIZE(_RamfuncsLoadSize), // 定义加载大小符号
LOAD_END(_RamfuncsLoadEnd), // 定义加载结束地址符号
RUN_START(_RamfuncsRunStart), // 定义运行起始地址符号
RUN_SIZE(_RamfuncsRunSize), // 定义运行大小符号
RUN_END(_RamfuncsRunEnd), // 定义运行结束地址符号
PAGE = 0, ALIGN(4) // 位于 PAGE 0 (程序空间),8字节对齐
#else // 旧版本编译器语法
ramfuncs : // 定义段名 (旧版使用 ramfuncs)
LOAD = FLASHD, // 同上
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(4)
#endif
#endif

/* 使用 IPC API 驱动程序时需要以下部分定义 */
GROUP : > CPU1TOCPU2RAM, PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}

组 : > CPU2TOCPU1RAM, PAGE = 1
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
}

}

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

CPU2的cmd:

MEMORY
{
PAGE 0 :
/* BEGIN is used for the "boot to SARAM" bootloader mode */

BEGIN : origin = 0x080000, length = 0x000002
RAMM0 : origin = 0x0000A2, length = 0x00035E
RAMD0 : origin = 0x00B000, length = 0x000800
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800

// RAMGS15_RSVD : origin = 0x01BFF8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

RESET : origin = 0x3FFFC0, length = 0x000002

/* Flash sectors */
FLASHA : origin = 0x080002, length = 0x001FFE /* on-chip Flash */
FLASHB : origin = 0x082000, length = 0x002000 /* on-chip Flash */
FLASHC : origin = 0x084000, length = 0x002000 /* on-chip Flash */
FLASHD : origin = 0x086000, length = 0x002000 /* on-chip Flash */
FLASHE : origin = 0x088000, length = 0x008000 /* on-chip Flash */
FLASHF : origin = 0x090000, length = 0x008000 /* on-chip Flash */
FLASHG : origin = 0x098000, length = 0x008000 /* on-chip Flash */
FLASHH : origin = 0x0A0000, length = 0x008000 /* on-chip Flash */
FLASHI : origin = 0x0A8000, length = 0x008000 /* on-chip Flash */
FLASHJ : origin = 0x0B0000, length = 0x008000 /* on-chip Flash */
FLASHK : origin = 0x0B8000, length = 0x002000 /* on-chip Flash */
FLASHL : origin = 0x0BA000, length = 0x002000 /* on-chip Flash */
FLASHM : origin = 0x0BC000, length = 0x002000 /* on-chip Flash */
FLASHN : origin = 0x0BE000, length = 0x001FF0 /* on-chip Flash */

// FLASHN_RSVD : origin = 0x0BFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

PAGE 1 :

BOOT_RSVD : origin = 0x000002, length = 0x0000A0 /* Part of M0, BOOT rom will use this for stack */
RAMM1 : origin = 0x000400, length = 0x0003F8 /* on-chip RAM block M1 */
// RAMM1_RSVD : origin = 0x0007F8, length = 0x000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
RAMD1 : origin = 0x00B800, length = 0x000800

RAMLS5 : origin = 0x00A800, length = 0x000800

//以下GS8-GS15分配给CPU2
RAMGS8 : origin = 0x014000, length = 0x001000
RAMGS9 : origin = 0x015000, length = 0x001000
RAMGS10 : origin = 0x016000, length = 0x001000
RAMGS11 : origin = 0x017000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS12 : origin = 0x018000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS13 : origin = 0x019000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS14 : origin = 0x01A000, length = 0x001000 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
RAMGS15 : origin = 0x01B000, length = 0x000FF8 /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */

CPU2TOCPU1RAM : origin = 0x03F800, length = 0x000400
CPU1TOCPU2RAM : origin = 0x03FC00, length = 0x000400
}

SECTIONS
{
/* Allocate program areas: */
//ALIGN(8):将段按 8 字节对齐,提高访问效率。
.cinit : > FLASHB PAGE = 0, ALIGN(4)//存储全局变量和静态变量的初始化值,放入FLASHB。
.pinit : > FLASHB, PAGE = 0, ALIGN(4)//存储程序启动时需要执行的初始化函数指针(如全局对象构造函数)。
.text : >> FLASHB | FLASHC | FLASHD | FLASHE PAGE = 0, ALIGN(4)//.text:存储程序代码,放入多个 FLASH 区域(FLASHB、FLASHC等)。//>>:表示允许段跨越多个区域,优化空间利用。|:逻辑 OR,用于合并多个区域。
codestart : > BEGIN PAGE = 0, ALIGN(4)//codestart:程序入口点,放入BEGIN区域
/* Allocate uninitalized data sections: */
.stack : > RAMM1 PAGE = 1//.stack:栈空间,用于函数调用和局部变量,放入RAMM1。
.ebss : >>RAMGS8 | RAMGS9 | RAMGS10, PAGE = 1, ALIGN(4)//ebss:存储未初始化的全局变量和静态变量(默认值为 0),位于多个 RAM 区
.esysmem : > RAMLS5, PAGE = 1//.esysmem:系统内存,用于动态内存分配(如malloc),位于RAMLS5

.econst : >> FLASHF PAGE = 0, ALIGN(4)//.econst:存储常量数据(如字符串字面量),位于FLASHF以节省 RAM 空间。
.switch : > FLASHB PAGE = 0, ALIGN(4)//.switch:用于switch-case语句的跳转表,放入FLASHB。

.reset : > RESET, PAGE = 0, TYPE = DSECT /* not used, *///.reset:复位向量表,放入RESET区域

.cio : > RAMLS5, PAGE = 1//.cio:标准输入输出(C I/O)相关缓冲区,位于RAMLS5。
/* Initalized sections go in Flash */

#ifdef __TI_COMPILER_VERSION__
#if __TI_COMPILER_VERSION__ >= 15009000
.TI.ramfunc : {} LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(4)
#else
ramfuncs : LOAD = FLASHD,
RUN = RAMLS0,
LOAD_START(_RamfuncsLoadStart),
LOAD_SIZE(_RamfuncsLoadSize),
LOAD_END(_RamfuncsLoadEnd),
RUN_START(_RamfuncsRunStart),
RUN_SIZE(_RamfuncsRunSize),
RUN_END(_RamfuncsRunEnd),
PAGE = 0, ALIGN(4)
#endif
#endif

/* 使用 IPC API 驱动程序时,需要以下部分定义 */
GROUP : > CPU2TOCPU1RAM, PAGE = 1
{
PUTBUFFER
PUTWRITEIDX
GETREADIDX
}

组 : > CPU1TOCPU2RAM, PAGE = 1
{
GETBUFFER : TYPE = DSECT
GETWRITEIDX : TYPE = DSECT
PUTREADIDX : TYPE = DSECT
}
}

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

Lydia:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Eirwen:

  CPU1启动CPU2过程,请参考c2000ware中的示例 cpu01_to_cpu02_ipcdrivers_wprotect_cpu1 

TMS320F28377D: 使用GPIO64、GPIO65作为SCIA的收发引脚时发送数据发生丢包情况

cmh cmh阅读(198)

Part Number:TMS320F28377D

按如下的配置将GPIO64、65引脚作为SCIA的收发引脚,波特率为9600,每次发送91字节的数据,前30个数据是对的,而后面的数据开始出现混乱,不仅内容是错的而且发送的数据个数也不对。我们在硬件板上用飞线将SCI通信模块的两个引脚连接到GPIO8、GPIO9这两个引脚上,任然使用SCIA模块,同样的配置只修改了GPIO号,发现数据的收发过程一切正常,用示波器抓取GPIO64、GPIO65两个引脚上的波形,得到的波形信号没有明显的干扰,只是发送过程的波形持续时间减少,遍查程序后也没有发现引脚复用的情况。请问GPIO64/65在系统中是否有其他特殊的用途?请各位工程师帮忙分析一下原因。

Links:

您好,

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Taylor:

GPIO64 to 95默认有输入限定器(Qualifier),从现象看可能是输入限定器配置​​导致的信号同步问题。

具体请参考TRM

,

cmh cmh:

我们并没有配置过输入限定器,请问这种情况应该怎么配置引脚呢?

,

Taylor:

要说GPIO64/65在系统中是否有其他特殊的用途的话,首先考虑到输入限定器。关于设置方法等,请参考TRM中关于输入限定器(Qualifier)的说明。

TMS320F28P650DK: How to use sysconfig to design my CAN function

Cheng Zhijun阅读(703)

Part Number:TMS320F28P650DKOther Parts Discussed in Thread:SYSCONFIG

I want to implement two functions :

1. when recieved message identifier is 0x522, generate CAN rx interrupt

2. send DLC = 2~7 can messages,message identifier is 0x521.

3. bit rate is 1Mbps

how to config the CAN module by sysconfig?

when I config the CAN module, I have some doubts:

1. I just use CAN line 0 interrupt, why must I set both CAN interrupt 0 and CAN interrupt 1?

2. What do the options of Flags for Message Object mean? (Enable Transmit interrupts, use filtering base on the Message ID …) 

3. My TX message's length has several different length, should I set several message objects, for example  I want send messages length are  2,3,4,5, need I create message object 2,3,4,5 for these different length messages?

Vivian Gao:

感谢您对TI产品的关注! 关于你的咨询,我们正在确认你的问题,稍后回复您。

,

Cheng Zhijun:

any reply?

,

Eirwen:

Cheng Zhijun 说:1. I just use CAN line 0 interrupt, why must I set both CAN interrupt 0 and CAN interrupt 1?

No, you don't have to enable both interrupt lines. You can select either line 0 or line 1 or both from sysconfig. 

Cheng Zhijun 说:2. What do the options of Flags for Message Object mean? (Enable Transmit interrupts, use filtering base on the Message ID …) 

Those parameters are used to set the bit fields of the following config registers:

1. IFx Mask Register: 

2. IFx ID register:

3. and IFx message control register:

Cheng Zhijun 说:3. My TX message's length has several different length, should I set several message objects, for example  I want send messages length are  2,3,4,5, need I create message object 2,3,4,5 for these different length messages?

You can use separate message objects with different configuration for example different msg length. If you use the same message object, you have to reconfig the message length. 

TMS320F280049C: 能够正常输出HRPWM,但是无法输出SPWM。换了一块板子后SPWM能正常输出

lmh l阅读(148)

Part Number:TMS320F280049C

我单独测HRPWM的时候可以正常输出HRPWM。但是我用SPWM就不行。
然后我换了一块板子,SPWM又可以正常输出。。

测试HRPWM说明板子和芯片的HRPWM功能正常。可是换了个代码又无法输出。在改代码下换了个板子又可以正常输出。

Eirwen:

已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

,

Alice:

您好,

对于SPWM,没有官方参考资源。

请参考下面帖子:

CCS/TMS320F28379D: Pulse Width Modulation – SPWM – C2000 microcontrollers forum – C2000Tm︎ microcontrollers – TI E2E support forums

(+) TMS320F28027: 项目使用SPWM,官方有没有SPWM的详细解释? – C2000Tm︎ 微控制器论坛 – C2000 微控制器 – E2ETm 设计支持

© 2025 TI中文支持网   网站地图 鲁ICP备2022002796号-1