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

TMS320F2800137: 管脚配置问题

yun sheng zhao阅读(190)

Part Number:TMS320F2800137

正在使用F2800137,配置GPIO12和GPIO13作为输出口,GPIO13配置后可以正常点亮LEDD闪烁,同样的配置方式配置GPIO12不能使用,无信号输出,这是什么原因?

配置如下:

GpioCtrlRegs.GPAAMSEL.bit.GPIO12 = 0;
AnalogSubsysRegs.AGPIOCTRLA.bit.GPIO12 = 1;

GpioCtrlRegs.GPAODR.bit.GPIO12 = 1;

GpioCtrlRegs.GPAPUD.bit.GPIO12 = 0; //0: Enables the Pull-Up.1: Disables the Pull-Up.
GpioCtrlRegs.GPAGMUX1.bit.GPIO12 = 0; //配置高两位
GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0; // 0=GPIO, 1 = EPWM7_A, 2=CANA_RX, 配置低两位
GpioCtrlRegs.GPADIR.bit.GPIO12 = 1; // 1=OUTput, 0=INput
GpioDataRegs.GPACLEAR.bit.GPIO12 = 1; // uncomment if –> Set Low initially

Lydia:

您好,

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

,

Taylor:

考虑到以下可能性:

GPIO12对应的LED电路可能存在硬件问题,用万用表测量GPIO12对地电压,对比GPIO13的电压变化

GPIO12可能被其他外设占用

TMS320F280049: TMS320F280049 FLASH API调用失败

teng li阅读(192)

Part Number:TMS320F280049

我使用f280049芯片,工程从COFF更换成ELF,调用Flash API函数失败,将之前在COFF工程下的lib文件加进去,是两种格式用的lib有区别吗

Taylor:

您好,

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

,

Alice:

您好,     

     

      请使用EABI格式的库,请参考类似问题帖子的回复。

     TMS320F280049: ROM FLASH API – C2000 microcontrollers forum – C2000Tm︎ microcontrollers – TI E2E support forums

TMS320F28377D: syscfg设置warning问题,以及时钟源设置问题。

阅读(298)

Part Number:TMS320F28377DOther Parts Discussed in Thread:SYSCONFIG, C2000WARE

图片一这两个warining:第一个问题要如何添加Device Support?第二个问题是说EPWM时钟分频要变成1分频,但是设置为1分频之后会导致报错,因为按照手册和规则最大时钟应该为100MHz,第二张图是时钟树的设置。

第三个问题:我的硬件是外部时钟有源20Mhz,应该在时钟源选择部分X1还是XTAL呢,还有AUXCLK是做什么用的呢?

最后想知道这个syscfg界面设置应该如何称呼。

Lydia:

你好,

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

,

Daniel:

您好

1.如果需要,您可以在Sysconfig中添加设备支持,或者当您从C2000Ware导入空的driverlib项目时,它应该附带设备支持文件夹。

2.根据数据表,EPWM的最大频率为100MHz。因此,对于100 MHz以上的SYSCLK,EPWMCLK必须是SYSCLK的一半

3.这取决于你的设计,但你可以使用外部晶体XTAL或INTOSC,内部片上振荡器。

,

user4868504:

第一个问题,这个地方打勾

第二个问题,不少很清楚了,新的F28P65X系列可以设置成1,3877d只能降低系统时钟?不过根据我的理解,提示中说的可能丢失tz event是正对那种只有1,2

个周期的信号,如果故障信号能维持比较长时间,应该不会有这个问题,是我的猜测。

第三个问题,如果外部晶振是无源的,就选XTAL,有源的选X1,并且修改成实际的谐振器的频率。

,

Daniel:

您好

是的,这就是Syscfg中的位置。我不太明白你的第二个问题。对于第三个,您应该在设备中设置XTAL选项。英语字母表的第8个字母

LAUNCHXL-F2800137: 仿真器只有在按住复位键才能连接,但是无法烧录代码

YVTONG YOU阅读(170)

Part Number:LAUNCHXL-F2800137

 不按住烧录报错; 按住复位键烧录报错 ;按住复位键可以连接仿真器

Daniel:

您好

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

,

Vivian Gao:

参考下方链接排查。

1)(+) ccs7.2报错-233是什么原因 – HerculesTm︎ 安全微控制器论坛 – Hercules 安全微控制器 – E2ETm 设计支持

2)TI DSP烧录,解决(Error -233 @ 0x0)错误_the jtag ir and dr scan-paths cannot circulate bit-CSDN博客

3)  Invalid data read back部分

Debugging JTAG

,

YVTONG YOU:

六线接发,是接对的

,

Vivian Gao:

按照下方内容debug一下。

https://www.ti.com/lit/an/spracf0c/spracf0c.pdf

,

YVTONG YOU:

原因是芯片锁了,已经解锁了

TMS320F28377S: 用C2PROG烧录F28377之后,有个变量被强制写0

Liu Jun阅读(869)

Part Number:TMS320F28377SOther Parts Discussed in Thread:UNIFLASH

你好,我们有个问题想请教一下:
1.在用F28377开发过程中,发现用C2Prog烧录代码之后开机,会出现锁相异常,原因是CLA中有一个变量被强制写0;
如果用C2Prog烧录之后,把DSP下电并重新上电开机,CLA的这个变量就是正常的,可以正常赋值。

如果用uniflash烧录,就不会有这个问题。
2.这个异常的变量地址是一个CLA中定义和调用的结构体中的b这个变量,其他a,c两个变量都没有问题。
typedef struct {

float32 a;

float32 b;

float32 c;

}f_THREE_PHASE_ABC;

3.这个异常的变量地址在0x0000a1f6,其中我们划分了0x00A000-0x00B000用于CLA Data区,0x008000-0x00A000用于CLA Prog。

4.我们有试过把这2种烧录工具,烧录完成之后的文件从DSP中复制出来,并没有发现有区别。

我们担心代码中有什么BUG导致这种现象,想问一下: 什么情况下会导致这种烧录之后变量一直被强制写0,而且这种现象会在重新上电后消失;
Vivian Gao:

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

,

Taylor:

0xA1F6可能位于特殊内存边界或与烧录工具的初始化行为相关。

C2Prog与Uniflash尽管烧录内容相同,但烧录过程可能涉及不同的启动初始化或外设配置,C2Prog可能未正确初始化CLA内存控制器,导致特定地址的初始状态不一致。

C2000WARE: TMS28335 内部flash在不适用flash调用库的情况下怎么进行操作,例如擦除、扇区写等

ju xu阅读(114)

Part Number:C2000WARE

目前在CCS下驱动TMS28335芯片,在使用内部flash的情况下需要对flash进行编程操作。目前TI提供了flash调用库,但客户需要提供所有的源代码(不能包含库),请问目前可以直接编写代码通过寄存器控制flash的擦除、编程等操作吗,在TI官网本人还未找到相关的flash寄存器说明,有对应的操作说明链接吗

Daniel:

您好

关于这个IC的相关寄存器的说明请您参考如下链接

https://www.ti.com/lit/pdf/sprui07

在如下链接中有相关例程和库文件,请您参考

www.ti.com/…/C2000WARE

,

ju xu:

sprui07 1.1.4章中只包含了几个状态寄存器,对应无操作的寄存器,无法实现flash源码控制,这块还有别的资料吗。相关例程及库文件也未见这块具体的源码例程,只是说了flash API库的使用

,

Daniel:

您好

您的源码指的是什么,例程对于flash中的寄存器进行相关初始化的源码吗?

https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_C2000_node

如果是,官方给出部分.c文件参考,但是具体的请您参考TRM进行初始化。

,

ju xu:

是的,我指的源码就是通过芯片的寄存器对flash直接操作而不是通过TI给的flash官方库文件(即API)对flash操作。但是官方给的sprui07 TRM并没有通过寄存器对flash进行例如擦除、扇区写的这块内容。我不清楚还有没有别的资料对这块内容进行描述,参考的.c文件都是基于官方给的flash驱动库的使用。我想问一下,这块是TI对于用户不开放还是需要版权才有,要跟TI进行商务才可以对这块内容进行放开吗?

,

Daniel:

您好

您的意思是用汇编语言直接作用在底层进行擦写吗?

,

ju xu:

是的 用汇编或者C代码都行,请问有没有示例吗或者指导手册。

,

Daniel:

您好

针对于您这个需求,官方没有相关代码或指导手册等资料。

,

ju xu:

额 那我理解 TI官方这块flash内部对用户是个黑盒了 只能通过API对flash进行访问了

,

Daniel:

您好

针对于您的需求,目前的资料只有官方公布这些资料辅助您进行配置操作。

TMS320F280049C: HRPWM在移相控制下设定移相值和实际移相值存在误差

QI DONG阅读(250)

Part Number:TMS320F280049COther Parts Discussed in Thread:SYSCONFIG

Dear all:

我现在使用ePWM1和ePWM2来做移相控制,ePWM2为工作在HRPWM模式,使用高精度移相模式,开关频率为100KHz,使用的F280049主频在100MHz。

根据计算得到我移相值的取值范围应该在0-128000之间。当前存在的问题如下:

当设定移相值从63999变到64000的时候,实际移相值变化明显,但是从64000变到64001时,实际移相值变化并不大。

当设定移相值从64000变化到64128时实际移相向右移动,但设定移相值从64000变化到64256时实际移相想左移动。

图中通道2为EPWM1A输出,固定不变的,通道1为EPWM2A输出,是实际动作的移相桥臂。

这个问题导致我当前控制出现问题。

配置代码是根据sysconfig修改而来的,实际代码如下(使用sysconfig配置也出现同样的问题)

// Config ePWM
// Time Base
EPWM_setPeriodLoadMode(EPWM1_BASE, EPWM_PERIOD_SHADOW_LOAD);
EPWM_setEmulationMode(EPWM1_BASE, EPWM_EMULATION_STOP_AFTER_NEXT_TB);
EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(EPWM1_BASE, mEPWM1_TBPRD_VALUE);
EPWM_setTimeBaseCounter(EPWM1_BASE, 0);
EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setCountModeAfterSync(EPWM1_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);
EPWM_disablePhaseShiftLoad(EPWM1_BASE);
EPWM_setPhaseShift(EPWM1_BASE, 0);
EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);
EPWM_setSyncPulseSource(EPWM1_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);

// Counter Compare
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 0);
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0);
EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);

// ActionQualifier
EPWM_setActionQualifierShadowLoadMode(EPWM1_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierShadowLoadMode(EPWM1_BASE, EPWM_ACTION_QUALIFIER_B, EPWM_AQ_LOAD_ON_CNTR_ZERO);

HWREGH(EPWM1_BASE + EPWM_O_AQCTLA) = 0;
HWREGH(EPWM1_BASE + EPWM_O_AQCTLA2) = 0;
EPWM_setActionQualifierContSWForceAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_OUTPUT_LOW);
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN);

HWREGH(EPWM1_BASE + EPWM_O_AQCTLB) = 0;
HWREGH(EPWM1_BASE + EPWM_O_AQCTLB2) = 0;
EPWM_setActionQualifierContSWForceAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_OUTPUT_HIGH);
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN);

// Trip-Zone
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_OSHT1 | EPWM_TZ_SIGNAL_OSHT2);
// EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_OST);
EPWM_clearTripZoneFlag(EPWM1_BASE, EPWM_TZ_FLAG_OST);
EPWM_forceTripZoneEvent(EPWM1_BASE, EPWM_TZ_FORCE_EVENT_OST);

// Dead-Band
EPWM_setDeadBandCounterClock(EPWM1_BASE, EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA);
EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMB);
EPWM_setRisingEdgeDelayCount(EPWM1_BASE, mEPWM1_DBRED_VALUE);
EPWM_setFallingEdgeDelayCount(EPWM1_BASE, mEPWM1_DBFED_VALUE);
EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED,true);
EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED,true);
EPWM_setDeadBandOutputSwapMode(EPWM1_BASE, EPWM_DB_OUTPUT_A, false);
EPWM_setDeadBandOutputSwapMode(EPWM1_BASE, EPWM_DB_OUTPUT_B, false);

EPWM_setEmulationMode(EPWM2_BASE, EPWM_EMULATION_STOP_AFTER_NEXT_TB);
EPWM_setPeriodLoadMode(EPWM2_BASE, EPWM_PERIOD_SHADOW_LOAD);
HRPWM_setClockPrescaler(EPWM2_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(EPWM2_BASE, mEPWM2_TBPRD_VALUE);
HRPWM_setTimeBaseCounter(EPWM2_BASE, 0);
HRPWM_setTimeBaseCounterMode(EPWM2_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setCountModeAfterSync(EPWM2_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);

EPWM_enablePhaseShiftLoad(EPWM2_BASE);
HRPWM_setPhaseShift(EPWM2_BASE, 0);

EPWM_setSyncOutPulseMode(EPWM2_BASE, EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);
EPWM_setSyncPulseSource(EPWM2_BASE, HRPWM_PWMSYNC_SOURCE_ZERO);

// Counter Compare
EPWM_setCounterCompareValue(EPWM2_BASE, EPWM_COUNTER_COMPARE_A, 1);
EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
EPWM_setCounterCompareValue(EPWM2_BASE, EPWM_COUNTER_COMPARE_B, 499);
EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO);

// ActionQualifier
EPWM_setActionQualifierShadowLoadMode(EPWM2_BASE, EPWM_ACTION_QUALIFIER_A, EPWM_AQ_LOAD_ON_CNTR_ZERO);
EPWM_setActionQualifierShadowLoadMode(EPWM2_BASE, EPWM_ACTION_QUALIFIER_B, EPWM_AQ_LOAD_ON_CNTR_ZERO);

HWREGH(EPWM2_BASE + EPWM_O_AQCTLA) = 0;
HWREGH(EPWM2_BASE + EPWM_O_AQCTLA2) = 0;
EPWM_setActionQualifierT2TriggerSource(EPWM2_BASE, EPWM_AQ_TRIGGER_EVENT_TRIG_DC_EVTFILT);
EPWM_setActionQualifierContSWForceAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_SW_OUTPUT_LOW);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN);

HWREGH(EPWM2_BASE + EPWM_O_AQCTLB) = 0;
HWREGH(EPWM2_BASE + EPWM_O_AQCTLB2) = 0;
EPWM_setActionQualifierContSWForceAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_SW_OUTPUT_HIGH);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T1_COUNT_DOWN);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_UP);
// EPWM_setActionQualifierAction(EPWM2_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_NO_CHANGE, EPWM_AQ_OUTPUT_ON_T2_COUNT_DOWN);

// Trip-Zone
EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW);
EPWM_setTripZoneAction(EPWM2_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW);
EPWM_enableTripZoneSignals(EPWM2_BASE, EPWM_TZ_SIGNAL_OSHT1 | EPWM_TZ_SIGNAL_OSHT2);
// EPWM_enableTripZoneInterrupt(EPWM2_BASE, EPWM_TZ_INTERRUPT_OST);
EPWM_clearTripZoneFlag(EPWM2_BASE, EPWM_TZ_FLAG_OST);
EPWM_forceTripZoneEvent(EPWM2_BASE, EPWM_TZ_FORCE_EVENT_OST);

// Dead-Band
EPWM_setDeadBandCounterClock(EPWM2_BASE, EPWM_DB_COUNTER_CLOCK_FULL_CYCLE);
EPWM_setRisingEdgeDeadBandDelayInput(EPWM2_BASE, EPWM_DB_INPUT_EPWMA);
EPWM_setFallingEdgeDeadBandDelayInput(EPWM2_BASE, EPWM_DB_INPUT_EPWMB);
EPWM_setRisingEdgeDelayCount(EPWM2_BASE, mEPWM2_DBRED_VALUE);
EPWM_setFallingEdgeDelayCount(EPWM2_BASE, mEPWM2_DBFED_VALUE);
EPWM_setDeadBandDelayPolarity(EPWM2_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setDeadBandDelayPolarity(EPWM2_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
EPWM_setDeadBandDelayMode(EPWM2_BASE, EPWM_DB_RED,true);
EPWM_setDeadBandDelayMode(EPWM2_BASE, EPWM_DB_FED,true);
EPWM_setDeadBandOutputSwapMode(EPWM2_BASE, EPWM_DB_OUTPUT_A, true);
EPWM_setDeadBandOutputSwapMode(EPWM2_BASE, EPWM_DB_OUTPUT_B, true);

// HRPWM

HRPWM_enableAutoConversion(EPWM2_BASE);
HRPWM_setMEPEdgeSelect(EPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setCounterCompareShadowLoadEvent(EPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
HRPWM_setMEPEdgeSelect(EPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_CTRL_RISING_AND_FALLING_EDGE);
HRPWM_setCounterCompareShadowLoadEvent(EPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_LOAD_ON_CNTR_ZERO_PERIOD);
HRPWM_setMEPControlMode(EPWM2_BASE, HRPWM_CHANNEL_A, HRPWM_MEP_DUTY_PERIOD_CTRL);
HRPWM_setMEPControlMode(EPWM2_BASE, HRPWM_CHANNEL_B, HRPWM_MEP_DUTY_PERIOD_CTRL);
HRPWM_enablePhaseShiftLoad(EPWM2_BASE);
HRPWM_enablePeriodControl(EPWM2_BASE);

SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_HRPWM);
while(u16status == SFO_INCOMPLETE)
{
u16status = SFO();
if(u16status == SFO_ERROR)
{
while(1);
//error(); // SFO function returns 2 if an error occurs & # of MEP
} // steps/coarse step exceeds maximum of 255.
}

请问这个配置哪里存在问题?

Best wishes

Vivian Gao:

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

,

Vivian Gao:

您是否只为ePWM2在PRD和ZRO上设置AQ事件?这违反了我们在ZRO/PRD边界内设置边缘的HRPWM限制。

,

QI DONG:

感谢,确实是这个问题

TMS320F28P550SJ: 关于如何使用syscfg配置用户软中断 INT_USER12

崔林阅读(172)

Part Number:TMS320F28P550SJOther Parts Discussed in Thread:SYSCONFIG

在syscfg1.21.2中  没看到用户软中断的配置界面
同时请问如何可以不让syscfg再次生成新的文件,因为我想在生成的board.c文件上做些修改

Vivian Gao:

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

,

崔林:

请问ccs是否有禁用syscfg的功能 我使用的是ccs12.8.1

,

崔林:

请问您有结果了吗

,

Daniel:

您好

请您澄清一下,您所说的“用户软中断配置”是什么意思。

您试图配置哪个中断?

没有阻止SysConfig生成代码的选项。

,

崔林:

 这个中断我没找到配置的地方我自己手动在board.c文件里配置 又会被自动生成覆盖掉所以想问如何通过syscfg配置

,

Daniel:

您好

Is it possible to share the board.c file with the manual configuration?

Pls note the board.c is generated and will be oversritten. You can move the code for this interrupt (INT_USER12) outside of this file.

,

崔林:

Right now, I can only configure it elsewhere, which is not very uniform.

,

Daniel:

您好

Sorry but right now it cannot be configured in board.c since it is generated each time. 

There is no other option but to have this code outside of board.c file

TMS320F28377D: TI的工程师你们好,我想咨询一下,CPU2算法的计算结果返回给CPU1有几种方式呢?

zhisheng xiong阅读(138)

Part Number:TMS320F28377D

如标题所示,我的CPU1负责接收数据,然后通过EMIF接口写如SRAM,写完之后利用IPC通信通知CPU2去读取SRAM中的数据,再进行算法的计算,现在呢我需要把计算结果返回给CPU1,除了IPC通信还有其他方式吗?

Lydia:

您好,

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

,

Lydia:

您好,

CPU2与CPU1的通讯您可以在下面F28 academy找到 https://www.ti2k.com/wp-content/uploads/ti2k/DeyiSupport_C2000_node

,

zhisheng xiong:

我知道IPC通信可以,我是想问除了IPC还有没有其他方式可以把计算结果给到CPU1

,

Lydia:

您好,

IPC是两个内核之间通信的主要方式。

您也可以尝试使用消息RAM (MSGRAM)来共享数据。 您可以在设备数据表第7.3.5.4 CPU Message RAM (CPU MSGRAM)中查看"CPU Message RAM "一章。 但是,它们通常用作IPC RAMs。

查看以下论坛帖子:

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/903883/ccs-tms320f28379d-transfer-data-between-two-cores-through-msgram-from-cpu1-to-cpu2-using-memcpy 

,

zhisheng xiong:

好的,我去尝试一下

TMS320F280039C: 芯片 LSRAM 和 GSRAM 的使用方法

Light阅读(248)

Part Number:TMS320F280039C

为了实现中断内部程序的快速计算能力,在系统运行时,将存放在 FLASH 区域的中断程序搬移到 RAM 中运行。由于中断程序代码量庞大,导致 RAM 空间不足,对此产生了问题。

.cmd 文件中 RAM 分区如下:

MEMORY
{
PAGE 0 :

……

RAMLS_PROG : origin = 0x008000, length = 0x004000

RAMGS_PROG : origin = 0x00C000, length = 0x004000
……

}

这里产生了第一个问题:中断程序代码量庞大,但在运行时不是都会执行。实际测试结果来看,无论代码是否运行,都会搬移到 RAM 中去占一定的空间?

——————

中断代码运行时会搬移到 LSRAM中,当中断程序代码量超过 16K 时,系统程序编译时会直接报错。由此我尝试修改了 cmd 文件:

MEMORY
{
PAGE 0 :

……

RAMLS_PROG : origin = 0x008000, length = 0x008000
……

}

此时系统程序编译正常,但是烧录程序调试时发现系统死机无法正常工作,我不明白什么原因?

当cmd 文件使用第一种方式时,无法满足我中断程序代码量过大的需求(编译不通过),我应该怎样合理使用 RAM 空间来解决这个问题呢?

当前为了让我的系统正常运行,我只能控制自己的中断程序代码小于 16K,程序搬移到 LSRAM 运行,,此时 GSRAM 为空。

Lydia:

您好,

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

,

Light:

你好,这个问题可以解决吗?

,

Daniel:

您好

你能把这个的链接器cmd文件发给我们吗?

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