|
TMS320LF2407 看门狗问题,请大侠帮助,谢谢
[复制链接]
/*SPI-TLC5620 DA转换程序*/
#include \"register.h\"
void SystemInit();
void Timer1Init();
void KickDog();
void SPI_Init();
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA);
unsigned int t0=0,i=0;
int numled0=200;
int Voltage=0;
main()
{
SystemInit(); //系统初始化
*MCRA=*MCRA & 0xC0FF; //IOPB0-6设为IO口模式
*PBDATDIR=0xFFC2; //所有LED=0
*PBDATDIR=*PBDATDIR|0x003D; //所有LED=1
SPI_Init();
Timer1Init(); /*定时器初始化*/
asm(\" CLRC INTM \"
while(1)
{
DA_OUT(0,0,Voltage); //Voltage范围0-255对应0-3.3V
DA_OUT(1,0,Voltage); //Voltage范围0-255对应0-3.3V
DA_OUT(2,0,192); //2.475V,Voltage范围0-255对应0-3.3V
DA_OUT(3,0,128); //1.65V,Voltage范围0-255对应0-3.3V
}
}
void SystemInit()
{
asm(\" SETC INTM \" /* 关闭总中断 */
asm(\" CLRC SXM \" /* 禁止符号位扩展 */
asm(\" CLRC CNF \"); /* B0块映射为 on-chip DARAM*/
asm(\" CLRC OVM \"); /* 累加器结果正常溢出*/
*SCSR1=0x87FE; /* 系统时钟CLKOUT=20*2=40M */
/* 打开ADC,EVA,EVB,CAN和SCI的时钟*/
*WDCR=0x002F; /* 禁止看门狗,看门狗时钟64分频 */
KickDog(); /* 初始化看门狗 */
*IFR=0xFFFF; /* 清除中断标志 */
*IMR=0x0003; /* 打开中断2*/
}
void Timer1Init()
{
*EVAIMRA=0x0080; // 定时器1周期中断使能
*EVAIFRA=0xFFFF; // 清除中断标志
*GPTCONA=0x0000;
*T1PER=2500; // 定时器1初值,定时0.4us*2500=1ms
*T1CNT=0;
*T1CON=0x144E; //增模式, TPS系数40M/16=2.5M,T1使能
}
void SPI_Init() //SPI-DA初始化
{
*MCRB=*MCRB|0x0014; //SPISIMO,SPICLK特殊功能方式
*PBDATDIR=*PBDATDIR|0x0002; //CS_DA=1
*SPICCR=0x004a; //11bit数据
*SPICTL=0x0006; //禁止中断
*SPIBRR=0x0027; //1M波特率,40M/40=1M
*SPICCR=*SPICCR|0x80;
}
void DA_OUT(unsigned CHANNEL,unsigned int RNG,unsigned int SPI_DATA)
{
unsigned char flag=0;
*SPITXBUF=(CHANNEL<<14)|(RNG<<13)|(SPI_DATA<<5) ; //bit10,9~CHANNEL;bit8~RNG倍数
while(1)
{
flag=*SPISTS&0x40;
if(flag==0x40) break;
}
*SPIRXBUF=*SPIRXBUF;/*虚读寄存器以清除中断标志*/
*PBDATDIR=*PBDATDIR & 0xFFFD; //CS_DA=0,更新模拟信号输出
for(i=0;i<5;i++); //延时
*PBDATDIR=*PBDATDIR|0x0002; //CS_DA=1,锁存数据
}
void interrupt c_int2() /*定时器1中断服务程序*/
{
int int_flag;
int_flag=*EVAIFRA&0x80;
if(int_flag!=0x80)
{ asm(\" CLRC INTM \");
return;
}
*T1CNT=0;
numled0--;
if(numled0==0)
{
numled0=200;
if((*PBDATDIR & 0x0001)==0x0001)
*PBDATDIR=*PBDATDIR & 0xFFFE; //IOPB0=0;LED灭
else
*PBDATDIR=*PBDATDIR |0x0101; //IOPB0=1;LED亮
}
if(Voltage<0) Voltage=0;
//DA_OUT(0,0,Voltage); //Voltage范围0-255对应0-3.3V
//DA_OUT(1,0,Voltage); //Voltage范围0-255对应0-3.3V
//DA_OUT(2,0,192); //2.475V,Voltage范围0-255对应0-3.3V
//DA_OUT(3,0,128); //1.65V,Voltage范围0-255对应0-3.3V
if(t0<255) Voltage++;
else Voltage--;
if(Voltage<0) Voltage=0;
if(t0==508) t0=0;
t0++;
*EVAIFRA=0x80;
asm(\" CLRC INTM \");
}
void KickDog() /*复位看门狗计数寄存器WDCNTR */
{
*WDKEY=0x5555; /*写入55h使能WDCNTR复位*/
*WDKEY=0xAAAA; /*继55h后接着写AAh,进行WDCNTR复位*/
}
/*除了55h和AAh(两值任何顺序都不会引起系统复位)外,其它任何值写入该寄存器都会引起系统复位*/
void interrupt nothing()
{
asm(\" CLRC INTM \");
return;
}
我在调试上述程序时,如果打开看门狗,则程序只输出三角波的前半个周期,后面半个周期由于看门狗的系统复位,不能输出。
分析原因:在中断服务程序里设置了一个计数器t0,当t0计数到255时,看门狗就复位了,所以只输出了三角波的前半个周期。
问题:感觉看门狗计数器好像跟主程序同时运行似的,而且看门狗计数寄存器同t0同步计数,这是为什么?正常情况下,看门狗计数器应该是在程序跑飞或者意外情况下才开始计数,谢谢哪位大侠帮助
[ 本贴由 xgzseu 于 2007-8-10 09:14 PM 最后编辑 ]
|
|