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.

[参考译文] TMS320F28069M:TMS320F28069:在地址"0x3f207e&quot 处中断;没有可用的调试信息、或者在程序代码之外。

Guru**** 2524460 points
Other Parts Discussed in Thread: TMS320F28069

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/774182/tms320f28069m-tms320f28069-break-at-address-0x3f207e-with-no-debug-information-available-or-outside-of-program-code

器件型号:TMS320F28069M
主题中讨论的其他器件:TMS320F28069

您好!

我将 Tapas 板与 TMS320F28069搭配使用、并尝试使用 code composer studio 在 EPWM5上生成具有固定占空比和死区的互补 PWM。 我的大多数代码都是从示例复制的、并进行了一些调整。 遗憾的是、只要我使用 SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1、微控制器就会卡住;-如果该行被注释掉、它就会运行无问题。 奇怪的是,它在这条指令之前就被卡住了,并不总是在同一个地方。 我无法确切地知道它在做什么、它似乎在三条指令之间跳跃。

这是我的代码:

/**
* main.c
*/
#include "DSP28x_Project.h"

extern void InitPll (uint16 val、uint16 divsel);

int main (void)
{
EALLOW;
SysCtrlRegs.WDCR= 0x0068;
SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;
SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL=0;// Clk src = INTOSC1
SysCtrlRegs.CLKCTL.bit.XCLKINOFF=1; //关闭 XCLKIN
SysCtrlRegs.CLKCTL.bit.XTALOSCOFF=1;//关闭 XTALOSC
SysCtrlRegs.CLKCTL.bit.INTOSC2OFF=1;//关闭 INTOSC2
EDIS;


InitPll (DSP28_PLLCR、DSP28_DIVSEL);

EALLOW;
SysCtrlRegs.LOSPCP。all = 0x0002;
SysCtrlRegs.XCLK.bit.XCLKOUTDIV=2;
SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 1;// ePWM5
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1; //在 ePWM 内启用 TBCLK
EDIS;

EALLOW;

//
//为所选输出引脚禁用内部上拉以降低功耗
//消耗。 用户可启用或禁用上拉电阻。
//这将启用指定引脚的上拉电阻。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAPUD.bit.GPIO8 = 1;//禁用 GPIO8上的上拉电阻(EPWM5A)
GpioCtrlRegs.GPAPUD.bit.GPIO9=1;//禁用 GPIO9上的上拉电阻(EPWM5B)

//
//使用 GPIO 寄存器配置 EPWM-5引脚
//这指定哪个可能的 GPIO 引脚将是 EPWM5功能
//引脚。
//注释掉其他不需要的行。
//
GpioCtrlRegs.GPAMUX1.bit.GPIO8=1;//将 GPIO8配置为 EPWM5A
GpioCtrlRegs.GPAMUX1.bit.GPIO9=1;//将 GPIO9配置为 EPWM5B

EDIS;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

EPwm5Regs.TBPRD = 375;
EPwm5Regs.TBPHS.Half.TBPHS = 0;
EPwm5Regs.TBCTR = 0x0000;
EPwm5Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN;
EPwm5Regs.TBCTL.bit.PHSEN = TB_DISABLE;
EPwm5Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1;
EPwm5Regs.TBCTL.bit.CLKDIV = TB_DIV1;
EPwm5Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm5Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;//零负载
EPwm5Regs.CMPA.half.CMPA = 200;
EPwm5Regs.AQCTLA.bit.CAU = AQ_SET;
EPwm5Regs.AQCTLA.bit.CAD = AQ_CLEAR;
EPwm5Regs.AQCTLB.bit.CAU = AQ_CLEAR;
EPwm5Regs.AQCTLB.bit.CAD = AQ_SET;
EPwm5Regs.DBCTL.bit.OUT_MODE = DB_FUL_ENABLE;
EPwm5Regs.DBCTL.bit.POLSEL = DB_ACTV_LO;
EPwm5Regs.DBCTL.bit.IN_MODE = DBA_ALL;
EPwm5Regs.DBRED = 20;
EPwm5Regs.DBFED = 20;

EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=1;
EDIS;

int test = 0;
while (1)
{
test++;
}

void InitPll (uint16 val、uint16 divsel)
{
易失性 uint16 iVol;

//确保 PLL 没有在跛形模式下运行
if (SysCtrlRegs.PLLSTS.bit.MCLKSTS!= 0)
{
EALLOW;
//检测到 OSCCLKSRC1故障。 PLL 以跛形模式运行。
//重新启用缺少的时钟逻辑。
SysCtrlRegs.PLLSTS.bit.MCLKCLR = 1;
EDIS;
//将此行替换为对相应行的调用
// SystemShutdown();函数。
_asm (" ESTOP0"); //出于调试目的取消注释
}

// DIVSEL 必须为0才能将 PLLCR 从更改为
// 0x0000。 通过外部复位 XRSn 将其设置为0
//这使我们进入1/4
if (SysCtrlRegs.PLLSTS.bit.DIVSEL!= 0)
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = 0;
EDIS;
}

//
//更改 PLLCR
//
if (SysCtrlRegs.PLLCR.bit.DIV!= val)
{
EALLOW;

//
//在设置 PLLCR 之前关闭缺少的时钟检测逻辑
//
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1;
SysCtrlRegs.PLLCR.bit.DIV = val;
EDIS;

//
//可选:等待 PLL 锁定。
//在此期间,CPU 将切换到 OSCCLK/2,直到
// PLL 是稳定的。 一旦 PLL 稳定、CPU 将会执行该操作
//切换到新的 PLL 值。
//
//此锁定时间由 PLL 锁定计数器监控。
//
//无需代码来等待 PLL 锁定。
//但是,如果代码执行任何对计时至关重要的操作,
//并要求锁定正确的时钟,则最好锁定
//等待此切换完成。
//

//
//等待 PLL 锁定位被置位。
//

//
//应在该循环之前禁用看门狗,或在其中馈送看门狗
//通过 ServiceDoG()的循环。
//

//
//取消注释以禁用看门狗
//

while (SysCtrlRegs.PLLSTS.bit.PLLLOCKS!= 1)
{
//
//取消注释以处理看门狗
//
//ServiceDoG();
}

EALLOW;
SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0;
EDIS;
}

//
//如果切换到1/2
//
if (((divsel ==1)||(divsel ==2))
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = DIVsel;
EDIS;
}

//
//如果切换到1/1
//*首先转到1/2并让功率稳定下来
//所需的时间取决于系统,这只是一个示例
//*然后切换到1/1
//
if (divsel == 3)
{
EALLOW;
SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;
DELAY_US (50L);
SysCtrlRegs.PLLSTS.bit.DIVSEL = 3;
EDIS;
}
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    直接运行其中一个示例时是否会看到此问题?

    在 PLL 锁定后添加以下代码是否会有所不同?

    //
    //等待 PLL 锁定位被置位。
    //

    //
    //应在该循环之前禁用看门狗,或在其中馈送看门狗
    //通过 ServiceDoG()的循环。
    //

    //
    //取消注释以禁用看门狗
    //

    DisableDog ();

    此致。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我无法运行示例、因为我使用的电路板上有三个逆变器半桥、因此我需要不同的参数、不同的 PWM 通道等 我可以尝试更改一个示例以满足我的需求、但这基本上就是我尝试执行的操作(减去中断)。

    禁用看门狗没有什么不同。 我从其中一个示例中复制了 DisableDog ()函数。

    是否可能由于某种原因触发 ITRAP 中断?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚刚运行了 EPwmDeadBand 示例的修改版本、我似乎遇到了同样的问题。 启用 EPWM 时钟后、UC 进入无限循环。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好,

    是的,这是可能的。
    如果是这样,如果看到了 ITRAP,就会调用 ISR Interrupt_illegalOperationHandler。

    EPwmDeadBand 示例的修改版本是什么?

    您能否检查是否有任何 NMI 被调用?

    进行了哪些更新?

    此致。