》》》使用PWM实现定时中断 void main() { InitSysCtrl();
// LED_Init();//该工程不是开发板,io口不对应,led应用取消
InitECanGpio(); //自带can.c配置文件
InitECan(); //自带can.c配置文件
InitEPwm();//epwm初始化
InitAdc();//ADC初始化
//配置epwm前,先关闭时钟
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 0:Disable TBCLK within the ePWM,先关闭时基模块时钟,待配置好后再开启,可以保证同步
SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; // ePWM3的A,B通道时钟是同步的
SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 1; // ePWM4的A,B通道时钟是同步的
EDIS;
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // Stop all the TB clocks
EDIS;
//*****************对要使用的PWM通道进行配置*******************************************
EPWM3_Init(7500); //主拓扑开关管,x=150MHz/(频率:20kHz)=7500,,,f=150M/时钟周期
EPWM4_Init(7500); //泄放电路开关管
//中断相关
InitPieCtrl();
IER = 0x0000;//中断禁止
IFR = 0x0000;//中断标志清零
InitPieVectTable();//初始化终端向量表
EALLOW;
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; //使能epwm时基计数器时钟,与定时器时钟同步
SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // 使能CPU Timer 0
PieVectTable.TINT0 = &TIM0_IRQn;//设置定时器0的中断入口地址为中断向量表的INT0
EDIS;
CpuTimer0.RegsAddr = &CpuTimer0Regs;//指向定时器0的寄存器地址
TIM0_Init(150,100);//频率设置为150MHz,定时周期单位是us,100us
//先配置时钟初始化,再开启定时器中断
//开始定时器功能
CpuTimer0Regs.TCR.bit.TSS=0;
//开启CPU第一组中断并使能第一组中断的第7个小中断,即定时器0
IER |= M_INT1;
PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
//使能总中断
EINT;
ERTM;
while(1)
{
// LED1_ON; //EcanbTXdata(CanTemp1,CanTemp2,CanTemp3,CanTemp4); //delay(); }
} void TIM0_Init(float Freq, float Period) { //定时周期计算:dt=Freq*Period/150000000;按照默认的150MHz时钟
//设置定时器0的周期寄存器值
CpuTimer0Regs.PRD.all = 0xFFFFFFFF;
//设置定时器预定标计数器值为0
CpuTimer0Regs.TPR.all = 0;
CpuTimer0Regs.TPRH.all = 0;
//确保定时器0为停止状态
CpuTimer0Regs.TCR.bit.TSS = 1;
//重载使能
CpuTimer0Regs.TCR.bit.TRB = 1;
// Reset interrupt counters:
CpuTimer0.InterruptCount = 0;
ConfigCpuTimer(&CpuTimer0, Freq, Period);
}
interrupt void TIM0_IRQn(void) { Timer0Count++; if(Timer0Count>=1000) { // LED7_TOGGLE; Timer0Count=0; } EALLOW; PieCtrlRegs.PIEACK.bit.ACK1=1;//写1清0中断标志 EDIS; }
|