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;
}
//
//文件结束
//