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.

[参考译文] TMS320F28377S:TMS320F28377S

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/813535/tms320f28377s-tms320f28377s

器件型号:TMS320F28377S

您好!

该程序不会在中断时停止。

*****


#include "F28x_Project.h"
//
//函数原型
//
void ConfigureADCB (void);
void SetupADCBEpwm (uint16通道);
中断空 ADCB_ISR (空);
void ePWM_initEpwm (void);


UINT16 TBPRD = 5000;

void main (void)

InitSysCtrl();
Dint;
InitPieCtrl();
IER = 0x0000;
IFR = 0x0000;
InitPieVectTable();
EALLOW;
PieVectTable.ADCB1_INT =&ADCB_ISR;// ADCB 中断1的函数
EDIS;
ePWM_initEpwm();
SetupADCBEpwm (0);
ConfigureADCB();


IER |= M_INT1;//启用组1中断
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM
//
//启用 PIE 中断
//
组中的 PieCtrlRegs.PIEIER1.bit.INTx2 = 1;// ADCB INT
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式
EDIS;
//
//循环无限地进行转换
//
操作
{}
while (1);

中断空 ADCB_ISR (空)

AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


空配置 ADCB (空)

EALLOW;

//
//写入配置
//
AdcbRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

//
//将脉冲位置设置为晚期
//
AdcbRegs.ADCCTL1.bit.INTPULSEPOS = 1;

//
//为 ADC 加电
//
AdcbRegs.ADCCTL1.bit.ADCPWDNZ = 1;

//
//延迟1ms 以允许 ADC 加电时间
//
DELAY_US (1000);

EDIS;

void SetupADCBEpwm (uint16通道)

uint16 acqps;

//
//根据分辨率确定最小采集窗口(在 SYSCLKS 中)
//
if (adc_resolution_12bit = AdcbRegs.ADCCTL2.bit.resolution)

acqps = 14;//75ns

否则、//分辨率为16位

acqps = 63;//320ns

//
//选择要转换的通道和转换结束标志
//
EALLOW;
AdcbRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
AdcbRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
AdcbRegs.ADCSOC0CTL.bit.TRIGSEL = 0x5;// ePWM1 SOCA 上的触发
AdcbRegs.ADCINTSEL1N2.bit.INT1SEL = 0x0;// SOC0结束将设置 INT1标志
AdcbRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
AdcbRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
EDIS;


//
// ConfigureEPWM -配置 ePWM SOC 并比较值
//
void ePWM_initEpwm (void)

EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;//关闭 ePWM 时钟
EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
EPwm1Regs.TBPRD = TBPRD;//将周期设置为 TBPRD 计数
EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//清零 PWM1A
EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
EDIS;

//
//文件结束
//

小图标

谢谢 Vadim

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

    抱歉、

    我没有正确放置它。 如果我放置一个断点、它将在断点处停止、并且它将在 大约2000年的时间内显示 AdcbResultRegs.ADCRESULT0中的值。 在我的板上、ADCB0和 ADCA0均连接到1.6V。 如果我删除断点、运行它并暂停、则该值始终为0。 ADCB0只能在软件中断断点时读取电压、如果我暂停并运行它、它始终为0、永不改变。 我对 ADC0没有这样的问题,因为它的电压是相同的。 无论我使用暂停还是断点、ADCA0都可以读取正确的值。 在我的 ADCB0代码中应该有什么不同

    这是适用于 ADCA 的代码

    ****


    #include "F28x_Project.h"
    //
    //函数原型
    //
    void ConfigureADCA (void);
    void SetupADCAEpwm (uint16通道);
    中断 void adca_isr (void);
    void ePWM_initEpwm (void);


    UINT16 TBPRD = 5000;

    void main (void)

    InitSysCtrl();
    Dint;
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();
    EALLOW;
    PieVectTable.ADCA1_INT =&adca_ISR;// ADCB 中断1的函数
    EDIS;
    ePWM_initEpwm();
    SetupADCAEpwm (0);
    ConfigureADCA();


    IER |= M_INT1;//启用组1中断
    EINT;//启用全局中断 INTM
    ERTM;//启用全局实时中断 DBGM
    //
    //启用 PIE 中断
    //
    组中的 PieCtrlRegs.PIEIER1.bit.INTx1 = 1;// ADCB INT
    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=1;
    EPwm1Regs.TBCTL.bit.CTRMODE = 0;//取消冻结、并进入递增计数模式
    EDIS;
    //
    //循环无限地进行转换
    //
    操作
    {}
    while (1);

    中断 void adca_isr (void)

    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//清除 INT1标志
    PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;


    空配置 ADCA (空)

    EALLOW;

    //
    //写入配置
    //
    AdcaRegs.ADCCTL2.bit.prescale = 6;//将 ADCCLK 分频器设置为/4
    AdcSetMode (ADC_ADCB、ADC_Resolution、12位、ADC_SIGNALMODE_SINGLE);

    //
    //将脉冲位置设置为晚期
    //
    AdcaRegs.ADCCTL1.bit.INTPULSEPOS=1;

    //
    //为 ADC 加电
    //
    AdcaRegs.ADCCTL1.bit.ADCPWDNZ = 1;

    //
    //延迟1ms 以允许 ADC 加电时间
    //
    DELAY_US (1000);

    EDIS;

    void SetupADCAEpwm (uint16通道)

    uint16 acqps;

    //
    //根据分辨率确定最小采集窗口(在 SYSCLKS 中)
    //
    if (adc_resolution_12bit = AdcaRegs.ADCCTL2.bit.resolution)

    acqps = 14;//75ns

    否则、//分辨率为16位

    acqps = 63;//320ns

    //
    //选择要转换的通道和转换结束标志
    //
    EALLOW;
    AdcaRegs.ADCSOC0CTL.bit.CHSEL =通道;//SOC0将转换引脚 A0
    AdcaRegs.ADCSOC0CTL.bit.ACQPS = acqps;//采样窗口为100个 SYSCLK 周期
    AdcaRegs.ADCSOC0CTL.bit.TRIGSEL = 0x5;// ePWM1 SOCA 上的触发
    AdcaRegs.ADCINTSEL1N2.bit.INT1SEL = 0x0;// SOC0结束将设置 INT1标志
    AdcaRegs.ADCINTSEL1N2.bit.INT1E = 1;//启用 INT1标志
    AdcaRegs.ADCINTFLGCLR.bit.ADCINT1 = 1;//确保 INT1标志被清除
    EDIS;


    //
    // ConfigureEPWM -配置 ePWM SOC 并比较值
    //
    void ePWM_initEpwm (void)

    EALLOW;
    CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;//关闭 ePWM 时钟
    EPwm1Regs.ETSEL.bit.SOCASEL = 4;//在递增计数时选择 SOC
    EPwm1Regs.ETPS.bit.SOCAPRD = 1;//在发生第一个事件时生成脉冲
    EPwm1Regs.TBPRD = TBPRD;//将周期设置为 TBPRD 计数
    EPwm1Regs.TBCTL.bit.CTRMODE = 3;//冻结计数器
    EPwm1Regs.ETSEL.bit.SOCAEN = 1;//启用 SOCA
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET;//清零 PWM1A
    EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR;
    EDIS;

    //
    //文件结束
    //

    *****

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

    我使用 XDS100V2在 Launchpad 上运行了代码、没有任何问题。 我在电路板上使用 XDS110

    谢谢 Vadim

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

    您好!

    只需确认一下,此问题是否与定制板有关,而不是与 Launchpad 有关?

    谢谢

    Vasudha

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

    这是管道。 我必须将 JTAG 的 nTRST 从2.2k 更改为10k、因为电路板上没有通信。 此外、当我将示波器 GND 连接到电路板 GND 以探测某个时间时、电路板会挂起并给出以下错误:

    C28xx_CPU1:GEL 输出:
    内存映射初始化完成
    C28xx_CPU1:错误:(错误-1137 @ 0x0)器件保持在复位状态。 使器件退出复位状态、然后重试此操作。 (仿真包8.1.0.00005)
    C28xx_CPU1:20次尝试后无法确定目标状态
    C28xx_CPU1:在断开连接之前无法从目标中删除调试状态。 程序存储器中仍可能嵌入了断点运算代码。 建议您在连接之前重置仿真器、并在继续调试之前重新加载程序

    谢谢 Vadim

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

    您好!

    由于代码在 Launchpad 上工作、因此电压基准生成电路可能存在一些问题。 您能否检查定制板中是否正确提供了 ADC 的 Vref。

    谢谢

    Vasudha

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

    Vasudha、您好!

    这似乎是一个奇怪的问题、可能与 JTAG 复位有关。 它突然消失了

    谢谢 Vadim