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.

[参考译文] TM4C129ENCPDT:看门狗

Guru**** 2386620 points
Other Parts Discussed in Thread: EK-TM4C1294XL, UNIFLASH
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1231778/tm4c129encpdt-watchdog

器件型号:TM4C129ENCPDT
Thread 中讨论的其他器件:EK-TM4C1294XLUNIFLASHSYSBIOS

您好  

如何在 ti RTOS 中配置看门狗计时器。 以便我可以在指定的时间刷新看门狗计时器。 我在 TI RTOS 中找到了一个看门狗的示例、但我 找不到任何方法来控制它。 有人能帮我解决这个问题吗。任何说明它的文档或教程都是受欢迎的  

提前感谢!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     今天是美国公众假期。 请期待延迟回复。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    [quote userid="564247" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1231778/tm4c129encpdt-watchdog 如何在 ti rtos 中配置看门狗计时器。 以便我可以在指定的时间内刷新看门狗计时器。

     我想您是在问如何配置 WD 计时器值。 请查看项目中的 EK-TM4C1294XL.c。 默认情况下、重载值设置为120000000、超时时间为1秒。 您可以根据应用程序进行更改。  

    /*
    *=================================================== 看门狗===================================
    */
    /*放置在子段中以允许 TI 链接器正确删除项目*/
    #if defined (__TI_Compiler_version__)
    #pragma DATA_SECTION (Watchdog_config、".const:Watchdog_config")
    #pragma DATA_SECTION (watchdogTivaHWAttrs、".const:watchdogTivaHWAttrs")
    #endif

    #包含
    #包含

    WatchdogTiva_Object WatchdogTivaObjects [EK_TM4C1294XL_WATCHDOGCOUNT ];

    const WatchdogTiva_HWAttrs 观察装置 TivaHWAttrs[EK_TM4C1294XL_WATCHDOGCOUNT ={
    {
    .baseAddr = WATCHDOG0_BASE、
    .intNum = INT_WATCHDOG、
    .intPriority =(~0)、
    .reloadValue = 120000000 //默认的 CPU 时钟频率具有1秒的周期
    }、
    };

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles:

    感谢您的回复、 看门狗固件出现了问题。运行固件后、无法调试或连接到任何其他工具。 我已经尝试使用 uniflash 工具擦除闪存、但失败。我在尝试调试时收到的消息是"Cortex_M4_0:连接到目标时出错 "

    以下是我的代码。

    *=========== watchdog.c =========
    */

    #包含

    /* XDCtools 头文件*/
    #包含
    #包含

    /* BIOS 头文件*/
    #包含
    #包含

    /* TI-RTOS 头文件*/
    #包含
    #包含

    /*示例/板头文件*/
    #include "board.h"

    #定义 TASKSTACKSIZE 512

    bool flag = false;

    Task_Struct task0Struct;
    char task0Stack[TASKSTACKSIZE];
    Watchdog_Handle watchdogHandle;

    /*
    *=========== WatchdogCallback =========
    *看门狗中断回调函数。 它会切换、LED 也会亮起、
    *未被按下、清除看门狗中断标志。
    */
    void watchdogCallback (uintptr_t 未使用)
    {
    /*清除看门狗中断标志*/
    System_printf ("咬狗...");
    system_flush();
    WATCHDOG_CLEAR (watchdogHandle);
    GPIO_toggle (Board_LED0);

    /*
    *=========== gpioButtonFxn =========
    * Board_BUTTON0上 GPIO 中断的回调函数。
    */
    void gpioButtonFxn (unsigned int index)
    {
    flag ^= true;
    GPIO_WRITE (Board_LED0、BOARD_LED_ON);

    /*
    *=========== taskFxn ===========
    *如果按钮已被按下、则设置标志并清除看门狗计时器。
    */
    void taskFxn (UArg arg0、UArg arg1)
    {

    while (真){
    /*如果按下按钮,则阻止触发看门狗 ISR */
    if (flag){
    WATCHDOG_CLEAR (watchdogHandle);


    /*
    *=========== 主线====
    */
    int main (空)
    {
    Task_Params taskParams;
    WATCHDOG_PARAMS 参数;

    /*调用板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initWatchdog();

    /*构造 BIOS 对象*/
    Task_Params_init (&taskParams);
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =&task0Stack;
    Task_structure (&task0Structurt、taskFxn、&taskParams、NULL);

    /*打开用户 LED */
    GPIO_WRITE (Board_LED0、BOARD_LED_ON);

    /*安装按钮回调*/
    GPIO_setCallback (Board_BUTTON0、gpioButtonFxn);

    /*启用中断*/
    GPIO_enableInt (Board_BUTTON0);

    System_printf ("启动看门狗示例\n 系统提供程序设置为"
    "SysMin。 Halt the target to view any SysMin contents in "(停止目标以查看中的任何 SysMin 内容)
    " ROV.\n");

    /* SysMin 仅在您调用 flush 或 exit 时打印到控制台*/
    system_flush();

    /*创建并启用禁用复位的看门狗*/
    WATCHDOG_PARAMS_INIT (&params);
    params.callbackFxn =(Watchdog_Callback)看门狗回调;
    params.resetMode = Watchdog_reset_on;

    WatchdogHandle = Watchdog_open (Board_WATCHDOG0、&params);
    if (watchdogHandle == NULL){
    system_abort ("打开看门狗时出错!\n");

    WATCHDOG_setReload (watchdogHandle、2000);//将超时设置为5秒
    // uint32_t ticks =(毫秒* Clock_tickPeriod)/ 1000;
    /*启动 BIOS */
    BIOS_start();

    返回(0);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Watchdog_setReload (watchdogHandle、2000);//将超时设置为5秒
    [/报价]

    虽然您的注释显示5秒超时、但您实际上输入了2000、CPU 周期在120MHz 时等于16.5uS。 这意味着它将每16.5us 置位一次 WD 复位。 这一次可能太短、无法连接调试器。  如果您可以 在 WD 到期之前刚好按 BOARD_BUTTON0足够快的顺序、您可能有机会停止 WD 生成未来的复位。 但我不知道你成功的机会。 您可能需要使用函数发生器来强制 Board_BUTTON0为低电平、而不是使用您的手指。  

    您也可以尝试解锁器件以使器件进入出厂设置。 我在这里也不知道成功率、如前所述、WD 复位出现得太快。 如果您使用的是 XDS 调试探头、请按照本应用手册中的第5.3.2节使用 dbgjtag.exe 来解锁器件。  https://www.ti.com/lit/pdf/spma075

    如果可以解锁器件、我会建议将来在启用 WD 之前添加一些依赖于 GPIO 输入引脚状态的代码。 如果未满足预期的引脚状态、它只会旋转、不会进一步进行。 这样、您就可以防止任何 导致调试器无法连接的错误 WD 设置。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charles:

    感谢您的答复,我使用的是自定义开发板。 那么、在这种情况下、如何恢复到出厂设置呢?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

     您有什么调试探针? 在我上次的回复中、我说过如果使用 XDS200等调试探针、您可以使用 dbgjtag.exe 来解锁器件。 请再次参阅应用手册的第5.3.2节。  https://www.ti.com/lit/pdf/spma075

     另请参阅第4.8节中的相同应用手册、其中您可以使用 LaunchPad 调试定制板。 使用 LaunchPad 时、可以使用 LM 闪存编程器或 Uniflash 通过选择 ICDI 调试探针来解锁器件。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    感谢您的答复。 我能够通过添加和重置按钮擦除闪存。但我的代码卡在"Task_SupportProxy_swap ((ptr)&prepTask -> context、
    (ptr)&Task_module->curTask->context);"。  

    这是我的代码、

    void watchdogCallback (uintptr_t 未使用)
    {
    /*清除看门狗中断标志*/
    WATCHDOG_CLEAR (watchdogHandle);
    System_printf ("咬狗...");
    system_flush();
    UartWrite (((char*)"\n\n\rdog bit...\n\n");
    WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000
    GPIO_WRITE (Board_LED0、1);

    void taskFxn (UArg arg0、UArg arg1)
    {

    while (1)
    {
    WATCHDOG_CLEAR (watchdogHandle);
    GPIO_toggle (Board_LED1);
    UartWrite (((char*)"\n\r 来自任务函数的 Hello ...\n\r");
    WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000


    /*
    *=========== 主线====
    */
    int main (空)
    {
    /*调用板初始化函数*/
    Board_initGeneral();
    Board_initGPIO();
    Board_initWatchdog();
    watchdog_init();


    /*构造 BIOS 对象*/
    Task_Params_init (&taskParams);
    taskParams.STACKSIZE = TASKSTACKSIZE;
    taskParams.stack =&task0Stack;
    Task_structure (&task0Structurt、taskFxn、&taskParams、NULL);

    GPIO_setConfig (Board_LED1、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_HIGH);
    GPIO_setConfig (Board_LED0、GPIO_CFG_OUTPUT | GPIO_CFG_OUT_HIGH);

    GPIO_WRITE (Board_LED0、1);
    GPIO_WRITE (Board_LED1、0);

    System_printf ("启动看门狗示例\n 系统提供程序设置为"
    "SysMin。 Halt the target to view any SysMin contents in "(停止目标以查看中的任何 SysMin 内容)
    " ROV.\n");

    /* SysMin 仅在您调用 flush 或 exit 时打印到控制台*/
    system_flush();
    /*创建并启用禁用复位的看门狗*/
    WATCHDOG_PARAMS_INIT (&params);
    params.callbackFxn =(Watchdog_Callback)看门狗回调;
    params.resetMode = Watchdog_reset_on;

    WatchdogHandle = Watchdog_open (Board_WATCHDOG0、&params);
    if (watchdogHandle == NULL){
    system_abort ("打开看门狗时出错!\n");

    WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000
    // uint32_t ticks =(毫秒* Clock_tickPeriod)/ 1000;
    /*启动 BIOS */
    BIOS_start();


    返回(0);

    您能帮助我解决这个问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在您的任务 Fxn 中、您处于永久 while 循环中、不断清除看门狗、切换 GPIO 并将数据发送到 UART。 您将造成系统崩溃。 与此函数中的任何事件没有同步。 为什么不尝试使用库存示例、只需使用  Watchdog_setReload 将看门狗超时更改为5秒。 首先获取基本的工作,并根据您的应用要求逐渐修改。

    void taskFxn (UArg arg0、UArg arg1)
    {

    while (1)
    {
    WATCHDOG_CLEAR (watchdogHandle);
    GPIO_toggle (Board_LED1);
    UartWrite (((char*)"\n\r 来自任务函数的 Hello ...\n\r");
    WATCHDOG_setReload (watchdogHandle、600000000);//将超时设置为5秒((120000000*5000/1000))= 600000000