打印

项目调试遇到空前的困难,定时器会停止计数,请高手指点

[复制链接]
2899|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccjgalaxy|  楼主 | 2009-7-22 11:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在使用DM642开发板做实验
在bios中单独的网络通信程序,以及单独的定时器程序都运行正常,但是如果把这两个程序合在一块,定时器运行一瞬间就不运行了,不知怎么回事?
即前面我用LOG_printf来检验定时器的计数值cnt发现不行后,现在
我又用串口来检验定时器计数的cnt值(串口芯片为TL16C752B),发现电脑上的串口调试助手只能接收到
前面三个cnt的值,后面的就收不到了,与LOG_printf的情况一样,还请各位高手给指点一下!
#include <std.h>
#include <log.h>
#include <tsk.h>  
#include <sem.h>   
#include <gio.h>
#include <csl.h>
#include <csl_emifa.h>
#include <csl_timer.h>
#include <csl_irq.h>

#include "appData.h"
#include "scom.h"
#include "seeddm642.h"
#include "Tcpip_loopbackcfg.h" 
static TIMER_Handle hTimer1;

static Uint32 TimerEventId;

static int cnt = 0;
static Uint32 TimerControl = 

                        

        TIMER_CTL_RMK

        (

                TIMER_CTL_SPND_EMUSTOP,

                  TIMER_CTL_INVINP_NO,                 // TINP inverter control(INVINP)

                  TIMER_CTL_CLKSRC_CPUOVR8,        // Timer input clock source (CLKSRC)

                TIMER_CTL_CP_PULSE,                 // Clock/pulse mode(CP)

                TIMER_CTL_HLD_YES,                         // Hold(HLD)

                TIMER_CTL_GO_NO,                         // Go bit(GO)-

                                                                        //   resets & starts timer counter

                TIMER_CTL_PWID_ONE,                 // Pulse width(PWID)-

                                                                        //   used only in pulse mode

                TIMER_CTL_DATOUT_0,                 // Data output (DATOUT)

                TIMER_CTL_INVOUT_NO,                 // TOUT inverter control (INVOUT) 

                TIMER_CTL_FUNC_GPIO                 // Function of TOUT pin(FUNC)

        );     
SEEDDM642_UART_Config UartConfig ={
       0x01,/*寄存器IER*/
       0x5f,/*寄存器FCR*/
       0x03,/*寄存器LCR*/
       0x08,/*寄存器MCR*/
};

main()
{
              TIMER_Config myTimConfig;
        CSL_init();
/*.................网络通信部分.......................*/
    CACHE_enableCaching(CACHE_EMIFA_CE00);
    CACHE_enableCaching(CACHE_EMIFA_CE01);
    DAT_open(DAT_CHAANY, DAT_PRI_LOW, DAT_OPEN_2D);
    
    SCOM_init();
    
    CACHE_setL2Queue(0x3, 0x7);
    CACHE_setL2Queue(0x1, 0x7);
    CACHE_setPriL2Req(CACHE_L2PRIHIGH);
  // create all SCOM and message objects                   
    SCOM_create("NETOK", NULL); 
  /*..............................定时器部分............*/

        hTimer1 = TIMER_open(TIMER_DEV1, 0);
        TimerEventId = TIMER_getEventId(hTimer1);
        IRQ_globalDisable();
                IRQ_nmiDisable();
        IRQ_globalEnable();
        IRQ_nmiEnable();
        IRQ_map(TimerEventId, 15);
        IRQ_reset(TimerEventId);
             IRQ_reset(IRQ_EVT_EXTINT5);
    
          
     SEEDuartHandleA = SEEDDM642_UART_open(SEEDDM642_UARTA, 
                                          SEEDDM642_UART_BAUD9600, 
                                          &UartConfig);
   /* Open UARTB*/
    SEEDuartHandleB = SEEDDM642_UART_open(SEEDDM642_UARTB, 
                                          SEEDDM642_UART_BAUD9600, 
                                          &UartConfig);        

        myTimConfig.cnt = 0x0;
        myTimConfig.ctl = TimerControl;
        myTimConfig.prd = 0x00124f8;//1ms定时,即每1ms,cnt计数增1
        TIMER_config(hTimer1, &myTimConfig);
        IRQ_enable(TimerEventId);
        IRQ_enable(IRQ_EVT_EXTINT5);
        TIMER_start(hTimer1);
}
void CLK_cnt()
{
   cnt++;
    SEEDDM642_UART_putChar(0,cnt);//在串口调试助手中只能接收到前三个cnt的值,不知为什么?
}

void Uart_isr(void)
{
    
     Uint16 Data_Temp;    //Int16 status;
      Data_Temp = SEEDDM642_UART_rget(SEEDuartHandleA,0);
      SEEDDM642_UART_putChar(0, Data_Temp);
      
}

相关帖子

沙发
ccjgalaxy|  楼主 | 2009-7-22 14:39 | 只看该作者

用bios 编写的定时和串口程序合在一起时是没问题的

真奇怪为什么一加上网络通信的程序,定时器就运行一瞬间就停止了.
渴望各位前辈给指点一下!

使用特权

评论回复
板凳
yxwsz| | 2009-7-23 09:39 | 只看该作者

RE

你写的ISR代码,和下面的效果差不了多少

void Uart_isr(void)
{
    
    while(1);      
}

使用特权

评论回复
地板
ccjgalaxy|  楼主 | 2009-7-23 13:35 | 只看该作者

好像与Uart_isr没关系

我的Uart_isr代码没有问题,与网络通信放在一起测试过,就是
void CLK_cnt()
{
   cnt++;
    SEEDDM642_UART_putChar(0,cnt);//在串口调试助手中只能接收到前三个cnt的值,不知为什么?
}
这个代码有问题,如果没有网络通信部分的话,在电脑的串口调试助手里能正确的测试到cnt的值
但是一旦加上网络通信,就只能接收到三个cnt的值为 01 02 03

如果我在cnt++处设个断点的话,先全速运行到断点处,然后按F10单步运行过去,然后再全速运行,如此反复,就可以得到所有cnt的值
但是为什么不设断点的时候全速运行就只能得到3个值呢?

yxwsz谢谢您的多次指点,再多帮分析一下,非常感谢!
各位大侠也请给指点一下!

使用特权

评论回复
5
ccjgalaxy|  楼主 | 2009-7-23 15:24 | 只看该作者

加点延时就可以了,郁闷,原来咋就没发现呢?

void CLK_cnt()
{
   cnt++;
   timedelay();//加的一段延时
    SEEDDM642_UART_putChar(0,cnt);
}
现在虽然可以了,但我不明白为什么必须加上一段延时,
yxwsz再给分析一下,谢谢!

使用特权

评论回复
6
ccjgalaxy|  楼主 | 2009-7-24 10:18 | 只看该作者

哎,郁闷

加延时以后,串口通了,但网络又不通了,真郁闷
还请哪位高手给指点一下

使用特权

评论回复
7
yxwsz| | 2009-7-29 22:40 | 只看该作者

RE

SEEDDM642_UART_putChar(0,cnt);
函数里面应该是一个循环判断发送状态的语句,会void CLK_cnt()
在等待。

使用特权

评论回复
8
zhangsifu| | 2009-8-2 13:17 | 只看该作者
本帖最后由 zhangsifu 于 2009-8-2 13:33 编辑

看看停的时候的寄存器内容,是不是有的被改写了。
就像调查犯罪现场一样,先把现场证据搜集齐全。做程序调试也是一样,遇到很难想通的问题,先别去猜测,先把原始数据打印出来,一般你看到原始数据就知道错在哪里了。

使用特权

评论回复
9
ccjgalaxy|  楼主 | 2009-8-5 10:55 | 只看该作者
zhangsifu请问下,我设置的Timer1的相关寄存器的值为:
myTimConfig.cnt = 0x0;
myTimConfig.ctl = 0x00000305;
myTimConfig.prd = 75000;
运行程序停止后寄存器值变为:
CTL1        00000385
PRD1        000124F8
CNT1        00000000
请问这应该怎么分析?

使用特权

评论回复
10
ccjgalaxy|  楼主 | 2009-8-12 11:21 | 只看该作者
等待高手归来!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

37

帖子

0

粉丝