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.

[参考译文] RTOS/CC2640:看门狗定时器不工作

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/786524/rtos-cc2640-watchdog-timer-not-working

器件型号:CC2640
主题中讨论的其他器件:CC2650STKLAUNCHXL-CC2650CC2650

工具/软件:TI-RTOS

环境:

CC2640F128 (我们基于 LSR 可寻址 x R3的定制板)

TI\simplelink\ble_sdk_2_02_02_25

TI RTOS 2.21.1.08

编译器 TI v 16.9.11 LTS

CCS 8.2.0.00007

已将 TI-RTOS 中的看门狗驱动程序添加至 SimplePeripheral 示例。 还添加了以下代码段。

在应用中

静态 Watchdog_handle wdtHandle=NULL;

#define ENABLE_WDT 1
#define WDT_TICKs (200)
// 1200000 => 1分钟??
// 15000 => 1sec (WDT 始终以48MHz/32运行)
// 2000 =>超时周期到100ms?

void watchdogTimerCallback (UArg handle)
{
Watchdog_clear (wdtHandle);
//执行等效的 PIN 重置(硬重置)。
// cc26xx 系统尚未设计为处理软复位。
//进行软复位会使系统不稳定。
//所有软复位都需要替换为硬复位。

SysCtrlSystemReset();// SysCtrlSystemReset()而不是 HAL_SYSTEM_RESET()
}


void watchdogtimer_init()
{

Watchdog_Params wdParams;
uint32_t tickValue;

//打开看门狗
Watchdog_init();
Watchdog_Params_init (wdParams);

wdParams.resetMode = Watchdog_reset_off;//或 Watchdog_reset_off?
wdParams.debugStallMode = Watchdog_debug_star_on; //或 Watchdog_debug_stard_on??
wdParams.callbackFxn = watchdogTimerCallback;

wdtHandle = Watchdog_open (Board_watchdog、&wdParams);// CC2650STK_WATCHDOG0

tickValue = Watchdog_convertMsToTicks (wdtHandle、WDT_TICKs);

Watchdog_setReload (wdtHandle、tickValue);

}

板头文件

/*!
*@def CC2650STK_WatchdogName
*@CC2650STK 开发板上看门狗的简短枚举
*/
typedef 枚举 CC2650STK_WatchdogName{
CC2650STK_WATCHDOG0 = 0、
CC2650STK_WATCHDOGCOUNT
}CC2650STK_WatchdogName;

//通用看门狗实例标识符*/
#define Board_watchdog CC2650STK_WATCHDOG0

板级 C 文件

#if defined (_TI_Compiler_version__)
#pragma DATA_SECTION (Watchdog_config、".const:Watchdog_config")
#pragma DATA_SECTION (watchdogCC26XXHWAttrs、".const:watchdogDogWDogWAttrs")
#endif

#include "WatchdogCC26XHCC26XHWD_CC26XHOT_CC26XHOT_CC2620_CC26XHOT_CC26XHOT_Dog_CC2620_DogDog_Dog_CC2620_CC2620_CC2620_CC2620_CC2620_CC26XHOT_CC2620_DogDog_Dog_Dog_




{
baseAddr = WDT_BASE、
.intNum = INT_WDT_IRQ、
.reloadValue = 1000 //重新加载值(以毫秒为单位)*/
}、
};

const Watchdog_Config Watchdog_config[CC2650STK_WATCHDOGCOUNT]={
{
fxnTablePtr =&WatchdogCC26XX_fxnTable、
.object =&watchdogCC26XX 对象[Board_watchdog]、// CC2650STK_WATCHDOG0 *
hwAttrs =&watchdogCC26XXHWAttrs[Board_Watchdog]/* CC2650STK_WATCHDOG0 *
}、
};

const uint_least8_t Watchdog_count = CC2650STK_WATCHDOGCOUNT;

这不奏效。  

在 CC2640R2F、LAUNCHXL-CC2640R2评估板环境中对相同代码进行了细微的相关修改(如电路板 LAUNCHXL 而不是 CC2650STK)- simplelink_cc2640r2_sdk_2_40_00_32、编译器 TI v 18.1.5 LTS、SimpleLink R2 SDK 2.40.32  

正常工作。 我能够看到示波器探测红色/绿色 LED。 发生看门狗复位的情况。  

解决方案是什么? (适用于 我们的定制板 -已经在 CC2640F128上进行了设计)

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

    如何判断它在 CC2640定制板上不起作用?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当我探测 GPIO (IOID_8)时不会发生复位 0x00000008 // IO ID 8)信号。 在 init 中切换。
    这是我在评估套件板 LAUNCHXL 中添加的类似测试代码(在该代码中会发生复位。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尝试在观察程序 TimerCallback 和跟踪/调试中设置断点、以查看是否命中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不幸的是,它没有达到回调函数!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    执行 Watchdog_open 后、尝试检查您是否获得正确的 wdtHandle。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的。 请参阅下面的附件。

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

    我也做了一些更改。

    "。  .resetMode = Watchdog_reset_on"。  

    wdParams.resetMode = Watchdog_reset_on;//或 Watchdog_reset_off?
    wdParams.debugStallMode = Watchdog_debug_star_on; //或 Watchdog_debug_stard_on??
    

    和"INT_NMI_FAULT"。  

    const WatchdogCC26XX_HWAttrs watchdogCC26XXHWAttrs[CC2650STK_WATCHDOGCOUNT]={
    {
    baseAddr = WDT_BASE、
    .intNum = INT_NMI_FAULT、/* INT_WDT_IRQ 或 INT_NMI_FAULT? *
    .reloadValue = 150 //重新加载值(以毫秒为单位)*/
    },
    };
    

    但是,不会生成中断!

    寄存器...  

    还添加了  

    GRP( WDT ).REG( RIS ).BFLD( WDTRIS )

    至观察表达式,连续刷新设置为200ms。

    似乎没有中断!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您是否有适用于 CC2640F128的任何"有效"看门狗示例代码!? (不是任何其他 CC26/5 xx)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    1.尝试设置 wdParams.resetMode = Watchd_reset_off
    2.更改以下代码
    const WatchdogCC26XX_HWAttrs watchdogCC26XXHWAttrs[CC2650STK_WATCHDOGCOUNT]={

    baseAddr = WDT_BASE、
    .intNum = INT_NMI_FAULT、/* INT_WDT_IRQ 或 INT_NMI_FAULT? *
    .reloadValue = 150 //重新加载值(以毫秒为单位)*/
    }、
    };

    更改为

    const WatchdogCC26XX_HWAttrs watchdogCC26XXHWAttrs[CC2650STK_WATCHDOGCOUNT]={

    baseAddr = WDT_BASE、
    .reloadValue = 150、//重新加载值(以毫秒为单位)*/
    .intNum = INT_NMI_FAULT /* INT_WDT_IRQ 或 INT_NMI_FAULT? *
    }、
    };

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

    感谢您的支持。

    但是,尚未收到 INT!

    在建议的更改之前、

    Watchdog_config结构 Watchdog_Config[2][{fxnTablePtr=0x00008F60{watchdogel=0x00008A5D、watchdogClose =0x00001933、watchdogControl=...、object=...、...0x00008F7C
    [0]struct watchdog_Config{fxnTablePtr = 0x00008F60{watchdogClear = 0x00008A5D、watchdogClose = 0x00001933、watchdogControl =……、object=……0x00008F7C
    fxnTablePtr结构 Watchdog_FxnTable *0x00008F60{watchdogClear = 0x00008A5D、watchdogClose = 0x00001933、watchdogControl = 0x00008BDogInit=……0x00008F7C
    *(fxnTablePtr)结构 Watchdog_FxnTable{watchdogClear = 0x00008A5D、watchdogClose = 0x00001933、watchdogControl = 0x00008B03、watchdogInit=……0x00008F60
    看门狗空(*)(WatchdogClear *)(Watchdog_Config**) 0x00008A5D0x00008F60
    看门狗空(*)(Watchdog_Config**
    ) 0x00008F68看门
    
    狗空(*) 0x00008F64*看门狗空(*)(0x000087320*看门狗空)
    (0x0000Dog_Dog_Dog_Dog_Dog_Doget*)(0x0000846C
    )(0x000087320*看门狗空(0x00005*看门狗空)(0x00008F6*)(0x00005*)0x00007AB10x00008F78
    对象空*0x20001FA00x00008F80
    hwAttrs空*0x0000900C0x00008F84
    [1]struct Watchdog_Config{fxnTablePtr=0x00000000{dogwatchdogel=0x20003F20、watchClose = 0x000072D1、watchdogControl= 0x0000....对象...0x00008F88
    fxnTablePtr结构 Watchdog_FxnTable *0x00000000{watchdogClear = 0x20003F20、watchdogClose = 0x000072D1、watchdogControl = 0x1001CA01、watchdogInit=……0x00008F88
    对象空*0x000000000x00008F8C
    hwAttrsvoid *0x000000000x00008F90
    
    0x0000900CwatchdogCC26XXHWAttrs
    0x0000900C000840020000 960000
    
    0x20001FA0dogwatchCC26XX 对象
    0x20001FA0010000 0000 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00000001000000 0000 0000007C8F00001188000000 000000FF0002000000 0000000000 00
    
    0x00008F60看门狗 CC26XX_fxnTable
    0x00008F605D8A0000331900038B000000 F58A0000395200657800B17A00
    
    

    和更改之后

    Watchdog_config结构 Watchdog_Config[2][{fxnTablePtr=0x00008F60{watchdogel=0x00008A5D、watchdogClose =0x00001933、watchdogControl=...、object=...、...0x00008F7C
    [0]struct watchdog_Config{fxnTablePtr = 0x00008F60{watchdogClear = 0x00008A5D、watchdogClose = 0x00001933、watchdogControl =……、object=……0x00008F7C
    fxnTablePtr结构 Watchdog_FxnTable *0x00008F60{watchdogClear = 0x00008A5D、watchdogClose = 0x00001933、watchdogControl = 0x00008BDogInit=……0x00008F7C
    *(fxnTablePtr)结构 Watchdog_FxnTable{watchdogClear = 0x00008A5D、watchdogClose = 0x00001933、watchdogControl = 0x00008B03、watchdogInit=……0x00008F60
    看门狗空(*)(WatchdogClear *)(Watchdog_Config**) 0x00008A5D0x00008F60
    看门狗空(*)(Watchdog_Config**
    ) 0x00008F68看门
    
    狗空(*) 0x00008F64*看门狗空(*)(0x000087320*看门狗空)
    (0x0000Dog_Dog_Dog_Dog_Dog_Doget*)(0x0000846C
    )(0x000087320*看门狗空(0x00005*看门狗空)(0x00008F6*)(0x00005*)0x00007AB10x00008F78
    对象空*0x20001FA00x00008F80
    hwAttrs空*0x0000900C0x00008F84
    [1]struct Watchdog_Config{fxnTablePtr=0x00000000{dogwatchdogel=0x20003F20、watchClose = 0x000072D1、watchdogControl= 0x0000....对象...0x00008F88
    fxnTablePtr结构 Watchdog_FxnTable *0x00000000{watchdogClear = 0x20003F20、watchdogClose = 0x000072D1、watchdogControl = 0x1001CA01、watchdogInit=……0x00008F88
    对象空*0x000000000x00008F8C
    hwAttrsvoid *0x000000000x00008F90
    
    0x0000900CwatchdogCC26XXHWAttrs
    0x0000900C000840020000 960000
    
    0x20001FA0dogwatchCC26XX 对象
    0x20001FA0010000 0000 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 0000000000 000000000000 007C8F00001188000000 0000 0000FF0002000000 0000000000 00
    
    0x00008F60看门狗 CC26XX_fxnTable
    0x00008F605D8A0000331900038B000000 F58A0000395200657800B17A00
    
    

    两种情况 下的观察 dogCC26XXHWAttrs[]似乎具有相同的效果。

    我认为这应该是正确的。 因为结构体成员是  

    /*!
    *@CC26XX 的看门狗硬件属性简介
    */
    typedef 结构体 WatchdogCC26XX_HWAttrs{
    unsigned int baseAddr; /*!<看门狗的基本地址*/
    unsigned int Num; /*!<看门狗中断号*/
    unsigned long reloadValue;/*!<看门狗的重新加载值、以毫秒为单位*
    }WatchdogCC26XX_HWAttrs; 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您测试哪种 BLE 堆栈? 我只需在 LAUNCHXL-CC2650上使用 BLE 栈2.2.2 simple_peripheral 示例进行测试、它工作正常。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我的环境是
    BLE_SDK_2_02_02_25
    tirtos_cc13xx_cc26xx_2_21_01_08
    cc2650stk (非 CC2650_LAUNCHXL)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    不要使用 CC2640F128定制板。 为何现在成为 CC2650STK? 无论如何、我认为使看门狗在 cc2650stk 上正常工作没有问题。 当我可以访问我的 CC2650STK 时、我可以对此进行测试。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    它是定制板、但与 STK 基本相似。 因此、我们使用的板级配置文件只需进行少量修改。

    您是否怀疑任何可能影响的更改?? 请提供任何指示!?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    由于您使用的是 cc2650stk 示例、我假设您应该设置 wdParams.resetMode = Watchdog_reset_off
    并使用以下代码
    const WatchdogCC26XX_HWAttrs watchdogCC26XXHWAttrs[CC2650STK_WATCHDOGCOUNT]={

    baseAddr = WDT_BASE、
    .intNum = INT_NMI_FAULT、/* INT_WDT_IRQ 或 INT_NMI_FAULT? *
    .reloadValue = 150 //重新加载值(以毫秒为单位)*/
    }、
    };
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持。

    在注释掉代码后...  

    //#if defined (__TI_Compiler_version__)
    //#pragma DATA_SECTION (Watchdog_config、".const:Watchdog_config")
    //#pragma DATA_SECTION (watchCC26XHWAttrs、".const:dogDogCC26XHWAttrs")
    //#endif 

    它发挥了作用。 现在、我将进入回调函数。

    无法到达单独的分区!? 无法访问地址!??  

    我不知道。

    但相同的代码在 CC2640R2F 平台中工作。 (将 pragma 添加到数据段!)  

    想知道!  

    你明白为什么??