This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

C6747看门狗问题



如果喂狗一切都挺好,但是如果不喂狗,为什么没有出现-复位cpu,程序重新开始运行,而是整个ccs卡了

如果我运行的是c6748的程序的话,就是能重新开始的,好奇怪。是哪里有问题?程序如下:

/*
* main.c
*/

#include "C6747.h"
#include "C6747_gpio.h"
#include "stdio.h"

void TimerInit(void)
{
TIMER1_TGCR = 0x0000001B; // 启用新特性;64Bit看门狗模式;定时器12,34退出复位
TIMER1_TIM12 = 0;
TIMER1_TIM34 = 0; // 计数寄存器timer counter register0
TIMER1_PRD12 = 0x0fff; // 设定的周期值timer period register
TIMER1_PRD34 = 0;
TIMER1_WDTCR = (TIMER1_WDTCR & ( 0x0000ffff ) | ( 0xA5C60000 ));
TIMER1_WDTCR = (TIMER1_WDTCR & ( 0x0000ffff ) | ( 0xDA7E0000 ));
TIMER1_WDTCR = 0x0000C000; // 使能看门狗定时器
// 清除看门狗标识位
}

void TimerWatchReactivate(void)
{
TIMER1_WDTCR = (TIMER1_WDTCR & ( 0x0000ffff ) | ( 0xA5C60000 ));
TIMER1_WDTCR = (TIMER1_WDTCR & ( 0x0000ffff ) | ( 0xDA7E0000 ));
}

int main(void)
{
/*初始化C6747核*/
C6747_init();//此处仅初始化EMIFA,GPIO
GPIO_DIR23=0;//设置IO为输出
/*配置定时器*/
TimerInit();
printf("%d\n",1);

for(;;)
{
GPIO_OUT_DATA23 = 0x0800;
printf("%d\n",2);
TimerWatchReactivate();
}
}

  • 你应该不是脱机从flash boot运行的吧。这样的话,watchdog reset后就什么都没有了。

  • 请参考下面的wiki网站。
    The watchdog will force a hardware reset. If you try to halt the processor you will see that the CCS needs to disconnect because the hardware reset occured.
    processors.wiki.ti.com/.../C6747_Watchdog_example
  • 额。。可是为什么c6748的可以呢,我把c6748的starterware里的看门狗例程烧到了c6747里,然后用ccs观察,它能不断重新运行,因为设了断点,可以看到定时器过一会就初始化了
    程序如下,串口部分我什么也没做:
    /****************************************************************************/
    /* */
    /* 看门狗定时器测试 */
    /* */
    /* 2014年06月03日 */
    /* */
    /****************************************************************************/
    // 注意:I2C0, Timer64P0/P1, RTC, USB2.0 PHY, McASP0 serial clock 这些外设
    // 包括看门狗定时器(定时器 / 计数器 1)的时钟来源于 PLL 旁路时钟
    // 即 晶体振荡器的时钟 24MHz

    #include "TL6748.h" // 创龙 DSP6748 开发板相关声明

    #include "hw_types.h" // 宏命令
    #include "hw_syscfg0_C6748.h" // 系统配置模块寄存器
    #include "soc_C6748.h" // DSP C6748 外设寄存器
    #include "psc.h" // 电源与睡眠控制宏及设备抽象层函数声明
    #include "gpio.h" // 通用输入输出口宏及设备抽象层函数声明
    #include "timer.h" // 定时器 / 计数器宏及设备抽象层函数声明
    #include "interrupt.h" // DSP C6748 中断相关应用程序接口函数声明及系统事件号定义

    #include "uartStdio.h" // 串口标准输入输出终端函数声明

    /****************************************************************************/
    /* */
    /* 宏定义 */
    /* */
    /****************************************************************************/
    // 软件断点
    #define SW_BREAKPOINT asm(" SWBP 0 ");

    // 看门狗定时器周期
    // 定时时间 5秒
    // 低32位
    #define TMR_PERIOD_LSB32 (0x07270E00)
    // 高32位
    #define TMR_PERIOD_MSB32 (0x0)

    /****************************************************************************/
    /* */
    /* 全局变量 */
    /* */
    /****************************************************************************/

    /****************************************************************************/
    /* */
    /* 函数声明 */
    /* */
    /****************************************************************************/
    // 定时器 / 计数器初始化
    void TimerWatchDogInit(void);

    /****************************************************************************/
    /* */
    /* 主函数 */
    /* */
    /****************************************************************************/
    int main(void)
    {
    // 初始化串口终端 使用串口2
    UARTStdioInit();

    // 定时器 / 计数器初始化
    TimerWatchDogInit();

    // 打印串口终端信息
    UARTPuts("\r\n\r\nTronlong WatchDog Application......\r\n\r\n", -2);
    UARTPuts("System is Reset!\r\n\r\n", -2);
    UARTPuts("If not any character inputs in every 5 seconds, I will reset......\r\n", -2);

    // 主循环
    for(;;)
    {
    // 等待输入字符
    UARTPutc(UARTGetc());

    // 复位看门狗定时器 “喂狗”
    TimerWatchdogReactivate(SOC_TMR_1_REGS);
    }
    }

    /****************************************************************************/
    /* */
    /* 定时器 / 计数器初始化 */
    /* */
    /****************************************************************************/
    void TimerWatchDogInit(void)
    {
    // 配置 定时器 / 计数器 1 为 看门狗模式
    TimerConfigure(SOC_TMR_1_REGS, TMR_CFG_64BIT_WATCHDOG);

    // 设置周期 64位
    TimerPeriodSet(SOC_TMR_1_REGS, TMR_TIMER12, TMR_PERIOD_LSB32);
    TimerPeriodSet(SOC_TMR_1_REGS, TMR_TIMER34, TMR_PERIOD_MSB32);

    // 使能看门狗定时器
    TimerWatchdogActivate(SOC_TMR_1_REGS);
    }