4144|4

66

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

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 最后编辑 ]

最新回复

上述问题已经解决,在while{1}循环中给看门狗计数器清零即可,也即每次循环结束之前调用 Kick_Dog()  详情 回复 发表于 2008-8-12 13:07
 
点赞 关注

回复
举报

53

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
你只要打开看门狗,它就开始计数.
你应该关掉看门狗.
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
一般的程序中都关闭了开门狗,那么怎么防止程序是否跑飞呢?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

4
 
程序跑飞可能是程序有问题.
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

5
 
上述问题已经解决,在while{1}循环中给看门狗计数器清零即可,也即每次循环结束之前调用
Kick_Dog()
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表