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.

[参考译文] CCS/TMS320F28377S:TMS320F28377S

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

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

器件型号:TMS320F28377S
Thread 中讨论的其他器件:controlSUITE

工具/软件:Code Composer Studio

大家好、当我运行第二个中断例程下面的代码时、会被忽略。 如果我设置了一个断点、重新启动程序并执行步进、则第二个 ISR 正在工作、第一个 ISR 不工作。 我该怎么做?

谢谢 Vadim

*****

//! EPWM2A/B (PA2_GPIO2引脚80和 PA3_GPIO3引脚79)

//包含的文件
//
#include "F28x_Project.h"
#include "math.h"
#define FREQUENCY 20// TBPRD = FCPU /(2* fpwm * CLKDIV * HSPCLKDIV)
// TBPRD = 200MHz /(2 * 500kHz * 1 * 1)= 200
#define delay 50000
#define reference 1
define cpufreq_MHz 200
#define DAC_NUM 1.
//
uint16k = 0;
uint32 n = 0;
uint16 sine_table[频率];
uint32 samplingFreq_Hz = 1500000;
uint32 MAX = 2048;
uint32长度= 127;
uint16 buff [128];
uint16 sgen_out = 0;
uint16 ndx=0;
float cpuPeriod_us = 0;
浮点采样 Period_us = 0;

void configureDAC (uint16 DAC_num);
中断 void epwm2_ISR (void);
中断空 CPU_timer0_ISR (空);
//
//主函
//
void main (void)

//
//步骤1. 初始化系统控制:
// PLL、安全装置、启用外设时钟

//
InitSysCtrl();

//
//步骤2. 初始化 GPIO:
//说明了如何将 GPIO 设置为其默认状态。
//
// InitGpio();


//在这种情况下、只需初始化 ePWM1、ePWM2、ePWM3的 GPIO 引脚
//这些函数位于 F2837xS_ePWM.c 文件中
//

InitEPwm2Gpio();


//
//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
//
Dint;

//
//将 PIE 控制寄存器初始化为默认状态。
//默认状态为禁用所有 PIE 中断和标志
//被清除。
//此函数位于 F2837xS_PIECTRL.c 文件中。
//
InitPieCtrl();

//
//禁用 CPU 中断并清除所有 CPU 中断标志:
//
IER = 0x0000;
IFR = 0x0000;

//
//使用指向 shell 中断的指针初始化 PIE 矢量表
//服务例程(ISR)。
//这将填充整个表,即使是中断也是如此
//在本例中未使用。 这对于调试很有用。
//可以在 F2837xS_DefaultIsr.c 中找到 shell ISR 例程
//此函数可在 F2837xS_PieVect.c 中找到
//
InitPieVectTable();

//
//此示例中使用的中断被重新映射到
//此文件中的 ISR 函数。
//
EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.EPWM2_INT =&epwm2_ISR;
//将 CPU Timer0中断函数映射到 PIE 矢量表
PieVectTable.TIMER0_INT =&CPU_timer0_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的

//
//对于此示例,只初始化 ePWM
//
EALLOW;
CpuSysRegs.PCLKCR0.bit.TBCLKSYNC=0;
EDIS;

对于(k=0;<FREQUENCY; k++) 0.0.8

sine_table[k]=roundf (.5*(frequency)*(1+sinf (6.28/(frequency)*k));
//sine_t[k]=.5* frequency *(1+sinf (6.28/frequency *k));


K = 0;

//
//设置 TBCLK
//
EPwm2Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP;//向上计数
EPwm2Regs.TBPRD =频率;//设置计时器周期500kHz PWM 频率
// TBPRD = FCPU /(2 * fpwm * CLKDIV * HSPCLKDIV)
// TBPRD = 200MHz /(2 * 500kHz * 1 * 1)= 200
//
//设置比较值
//
EPwm2Regs.CMPA.bit.CMPA = frequency /2;//设置占空比50%的比较值200/2
EPwm2Regs.TBCTL.bit.PHSEN = TB_DISABLE;//禁用相位加载
EPwm2Regs.TBPHS.bit.TBPHS = 0x0000;//相位为0
EPwm2Regs.TBCTR = 0x0000;//清除计数器
EPwm2Regs.TBCTL.bit.HSPCLKDIV = 0;//时钟与 SYSCLKOUT 之比
EPwm2Regs.TBCTL.bit.CLKDIV = 0;

//
//将影子寄存器加载设置为零
//
EPwm2Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW;
EPwm2Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO;
EPwm2Regs.CMPCTL.bit.LOADBMODE = CC_CTR_ZERO;


//
//设置操作
//
EPwm2Regs.AQCTLA.bit.PRD = AQ_CLEAR;//清除 PWM2A 导通周期
EPwm2Regs.AQCTLA.bit.CAU = AQ_SET;//在事件 A 上设置 PWM2A、
//向上计数


//
//中断,我们将在其中更改比较值
//
EPwm2Regs.ETSEL.bit.INTSEL = ET_CTR_ZERO;//选择零事件时的 INT
EPwm2Regs.ETSEL.bit.INTEN = 1;//启用 INT
EPwm2Regs.ETPS.bit.INTPRD = et_3rd;//在第三个事件发生时生成 INT


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

//
//步骤4. 特定于用户的代码、启用中断:

IER |= M_INT3;//启用连接到 EPWM1-3 INT 的 CPU INT3:
PieCtrlRegs.PIEIER3.bit.INTx2 = 1;// ePWM2
IER |= M_INT1;//启用连接 TIMER0的 CPU INT1:
PieCtrlRegs.PIEIER1.bit.INTx7=1;// TIMER0
//
//启用全局中断和更高优先级的实时调试事件:
//
EINT;//启用全局中断 INTM
ERTM;//启用全局实时中断 DBGM

//DAC 部分


//
//初始化变量
//
cpuPeriod_us =(1.0/cpufreq_MHz);
samplingPeriod_us =(1000000.0/samplingFreq_Hz);


//
//配置 DAC DACOUTA/ADCINA1引脚27外部参考引脚28 3_3V
//
configureDAC (DAC_NUM);


//计算缓冲区
for (ndx=0;ndx <length+1; ndx++)

buff [ndx]=(round (MAX+(MAX-1)* sin (6.28*ndx/length)));
// buff [ndx]=(1*sin (6.28*ndx/length));

NDX = 0;

//初始化 CPU 计时器
//
InitCpuTimer();

//
//将 CPU Timer0配置为以指定的采样频率中断
//
ConfigCpuTimer (&CpuTimer0、cpufreq_MHz、samplingPeriod_us);

//
//启动 CPU 定时器0
//
CpuTimer0Regs.TCR.ALL = 0x4000;


//
//步骤5. 空闲循环。 只需坐下来循环(可选):
//
for (;;)

ASM (" NOP");

//
// configureDAC -启用并配置请求的 DAC 模块
//
void configureDAC (uint16 DAC_num)

EALLOW;

DacaRegs.DACCTL.bit.DACREFSEL =基准;
DacaRegs.DACOUTEN.bit.DACOUTEN = 1;
DacaRegs.DACVALS.ALL = 0;

DELAY_US (10);//缓冲 DAC 加电延迟

EDIS;

//
// epwm2_ISR -用于更新比较值的 EPWM2 ISR
//
中断空 epwm2_ISR (空)

//
//更新 CMPA
//
如果(k++=frequency -1) k = 0;
对于(n = 0;n <延迟;n++)

EPwm2Regs.CMPA.bit.CMPA = sine_table[k];

//
//清除此计时器的 INT 标志
//
EPwm2Regs.ETCLR.bit.INT = 1;

//
//确认此中断以接收来自组3的更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_Group3;

//
// cpu_timer0_isr -将正弦值写入 DAC 的计时器 ISR
//
中断空 CPU_timer0_ISR (空)

//
//将当前正弦值写入缓冲 DAC
//
sgen.calc(&sgen);
NDX++;

sgen_out = buff [ndx];
DacaRegs.DACVALs.all = sgen_out;
NDX = ndx %长度;
//
//确认此中断以从组1接收更多中断
//
PieCtrlRegs.PIEACX.ALL = PIEACK_Group1;

//
//文件结束
//

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

    我们没有资源在论坛上调试或运行每个人的代码。 我们建议社区成员对照各种 controlSUITE 示例交叉检查他们的代码并查看差异。 我向所有人推荐的一种良好的调试策略是在段中添加/注释他们的代码。 这是一项非常强大的技术。 请告诉我们这是否有效、或者至少将其缩小到导致问题的代码的特定部分。