DSPF2812管脚T1PWM_GPIOA6不能输出PWM,是我设置不对吗?积分不够
时间:10-02
整理:3721RD
点击:
程序如下:void main(void) { InitSysCtrl();
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();
InitGpio();
//InitEv();
Init_Ev();
EINT;//使能全局中断
ERTM;//使能实时中断
int k=0;
while(1)
{
}
}
void InitSysCtrl(void)
{
Uint16 i;
EALLOW;
SysCtrlRegs.WDCR=0x0068;//禁止看门狗
SysCtrlRegs.PLLCR=0xA;//系统时钟120MHz
for(i=0;i++;i<5000)
{}//延时,使PLL初始化成功
SysCtrlRegs.HISPCP.all=0x0000;//高速时钟120MHz
SysCtrlRegs.LOSPCP.all=0x0002;//低速时钟30MHz
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
EDIS;
}void InitGpio(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1;
EDIS;
}
void InitEv(void)
{
//设置定时器控制器TICON
EvaRegs.T1CON.bit.TMODE=2;//连续增模式
EvaRegs.T1CON.bit.TPS=2;//EVA时钟频率37.5MHz
EvaRegs.T1CON.bit.TENABLE=0;//暂时禁止定时器,等全部设定完毕,在开启定时器
EvaRegs.T1CON.bit.TCLKS10=0;//定时器使用内部时钟
//EvaRegs.T1CON.bit.TCLD10=2;//如果给定时器赋值,则立即载入
EvaRegs.T1CON.bit.TECMPR=1;//使能定时器的比较操作
//设置GPTCONA
EvaRegs.GPTCONA.bit.TCOMPOE=1;//定时器比较输出T1PW或T2PWM由各自的定时器比较逻辑驱动
EvaRegs.GPTCONA.bit.T1PIN=1;//低电平有效
// 设置周期寄存器
EvaRegs.T1PR=29999;
EvaRegs.T1CMPR=12000;
EvaRegs.T1CNT=0;
EvaRegs.T1CON.bit.TENABLE=1;//启动定时器操作,开始产生PWM
}
DINT;
IER=0x0000;
IFR=0x0000;
InitPieCtrl();
InitPieVectTable();
InitGpio();
//InitEv();
Init_Ev();
EINT;//使能全局中断
ERTM;//使能实时中断
int k=0;
while(1)
{
}
}
void InitSysCtrl(void)
{
Uint16 i;
EALLOW;
SysCtrlRegs.WDCR=0x0068;//禁止看门狗
SysCtrlRegs.PLLCR=0xA;//系统时钟120MHz
for(i=0;i++;i<5000)
{}//延时,使PLL初始化成功
SysCtrlRegs.HISPCP.all=0x0000;//高速时钟120MHz
SysCtrlRegs.LOSPCP.all=0x0002;//低速时钟30MHz
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
EDIS;
}void InitGpio(void)
{
EALLOW;
GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1;
EDIS;
}
void InitEv(void)
{
//设置定时器控制器TICON
EvaRegs.T1CON.bit.TMODE=2;//连续增模式
EvaRegs.T1CON.bit.TPS=2;//EVA时钟频率37.5MHz
EvaRegs.T1CON.bit.TENABLE=0;//暂时禁止定时器,等全部设定完毕,在开启定时器
EvaRegs.T1CON.bit.TCLKS10=0;//定时器使用内部时钟
//EvaRegs.T1CON.bit.TCLD10=2;//如果给定时器赋值,则立即载入
EvaRegs.T1CON.bit.TECMPR=1;//使能定时器的比较操作
//设置GPTCONA
EvaRegs.GPTCONA.bit.TCOMPOE=1;//定时器比较输出T1PW或T2PWM由各自的定时器比较逻辑驱动
EvaRegs.GPTCONA.bit.T1PIN=1;//低电平有效
// 设置周期寄存器
EvaRegs.T1PR=29999;
EvaRegs.T1CMPR=12000;
EvaRegs.T1CNT=0;
EvaRegs.T1CON.bit.TENABLE=1;//启动定时器操作,开始产生PWM
}
你看了例程了,是一样的吗,是官方例程吗?
如果你测试的程序就是你贴上来的这个,那确实是有些问题的。
1. 初始化EV模块的函数名,到底是什么。InitEv还是Init_Ev,和调用的不一样啊。
2.既然使能了中断好像没有使能完全吧,你还要使能PIE中断(PieCtrl.PIEIER.bit.INTx4 = 1),开CPU中断啊(IER 对应为使能),只有使能全局中断是不够的(EINT;//使能全局中断ERTM;//使能实时中断)。
具体的你要有个仿真器,从main函数一步步打断点,然后通过CCS3.3 的view-Memory来看各个寄存器的值是否和你设定的一样了,这样才能找出故障。
网上好像有相关例程吧!
都试过,配置是一样的,就国平就是不行
谢谢查看。调用的时候调用的是InitEv,PIE中断是在PIE初始化函数中,我用的是CCS5.2,打断点查看寄存器都正常,计数器会变化。我把EVA的程序变成EVB,EVB就可以发出PWM。EVA就是不行。
问题解决了。CCS仿真时发现EVA寄存器的值与编写的不一致,evb是一致的。EVA必须要屏蔽中断PDPINTA,EVB不需要。