微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 在SimpleBLEMulti工程中看门狗初始化问题

在SimpleBLEMulti工程中看门狗初始化问题

时间:10-02 整理:3721RD 点击:

参考网上代码在SimpleBLEMulti工程中对看门狗进行如下初始化操作后:

Watchdog_Handle watchdog;

void wdtCallback(UArg handle)
{
Watchdog_clear((Watchdog_Handle)handle);
}

void wdtInitFxn(void)
{
Watchdog_Params wp;
//Watchdog_Handle watchdog;
Watchdog_Params_init(&wp);
wp.callbackFxn = wdtCallback;
wp.debugStallMode = Watchdog_DEBUG_STALL_ON;
wp.resetMode = Watchdog_RESET_ON;

watchdog = Watchdog_open(Board_WATCHDOG, &wp);
Watchdog_setReload(watchdog, 1500000); // 1sec (WDT runs always at 48MHz/32)
}

在一个Util_constructClock线程中添加一个不喂狗的while循环:

while(1)
{
uDelay(30000000);//10000表示1ms
SimpleProfile_SetParameter(SIMPLEPROFILE_CHAR6, 3, "zls");
}

但是看门狗并不会重启,多谢帮忙分析一下原因。请教有没有在串口透传代码中添加看门狗功能的demo提供学习一下。

你好,

之前有用到过watchdog,有几篇文章你可以参考一下

http://blog.csdn.net/gyb510/article/details/50778654

http://blog.csdn.net/zzfenglin/article/details/52253536

测试环境

协议栈版本:BLE-STACK V2.1

IAR开发环境版本:IAR for Arm 7.40

硬件设备:Amo-SmartRF v2.0 开发板(对应TI官方的SmartRF06EB 开发板)

示例测试Demo工程:simpleBLEPeripheral工程

系统驱动层RTOS配置

1.打开“C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID”目录下的“Board.c”文件,在文件的最后添加如下代码:

[cpp] view plain copy

 

  1. /* 
  2. *  ============================= WatchDog Begin=========================== 
  3. */  
  4. #include <ti/drivers/Watchdog.h>  
  5. #include <ti/drivers/watchdog/WatchdogCC26XX.h>  
  6.   
  7. /* Watchdog objects */  
  8. WatchdogCC26XX_Object watchdogCC26XXObjects[SENSORTAG_CC2650_WATCHDOGCOUNT];  
  9.   
  10. /* Watchdog configuration structure */  
  11. const WatchdogCC26XX_HWAttrs watchdogCC26XXHWAttrs[SENSORTAG_CC2650_WATCHDOGCOUNT] = {  
  12.     /* SENSORTAG_CC2650_WATCHDOG0 with 1 sec period at default CPU clock freq */  
  13.     {WDT_BASE, INT_WATCHDOG},  
  14. };  
  15.   
  16. const Watchdog_Config Watchdog_config[] = {  
  17.     {&WatchdogCC26XX_fxnTable, &watchdogCC26XXObjects[0], &watchdogCC26XXHWAttrs[0]},  
  18.     {NULL, NULL, NULL},  
  19. };  
  20.   
  21. /* 
  22. *  ============================= WatchDog End============================ 
  23. */  

2.打开“C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID”目录下的“Board.h”文件,在文件的最后添加如下代码:

[cpp] view plain copy

 

  1. /*! 
  2. *  @def    CC2650_WatchdogName 
  3. *  @brief  Enum of Watchdogs on the CC2650 dev board 
  4. */  
  5. typedef enum CC2650_WatchdogName {  
  6.     CC2650_WATCHDOG0 = 0,  
  7.     CC2650_WATCHDOGCOUNT  
  8. } CC2650_WatchdogName;  
  9.   
  10. /*! 
  11. *  @def    SENSORTAG_CC2650_WatchdogName 
  12. *  @brief  Enum of Watchdogs on the SENSORTAG_CC2650 dev board 
  13. */  
  14. typedef enum SENSORTAG_CC2650_WatchdogName {  
  15.     SENSORTAG_CC2650_WATCHDOG0 = 0,  
  16.     SENSORTAG_CC2650_WATCHDOGCOUNT  
  17. } SENSORTAG_CC2650_WatchdogName;  

这样,RTOS中看门狗部分就配置好了,下面我们来看看应用层是如何配置的。



应用层配置

1.将驱动中看门狗相关的文件添加到编译选项中,选择“CC2640App”--->右键点击“Drivers”--->“Add”--->“Add Files...”,操作截图如下:

2.上述操作之后,会弹出文件添加的对话框,找到“C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\drivers”目录下的“Watchdog.c”和“Watchdog.h”文件,选中之后,点击“打开”添加到工程中。操作显示如下:


3.选择“CC2640App”--->右键点击“Drivers”--->“Add”--->“Add Group...”,操作截图如下:


在弹出的对话框中输入“WATCHDOG”,操作显示如下:


点击“OK”之后,结果如下:


在“Drivers”文件夹下生成“WATCHDOG”文件夹。

4.在刚生成的“WATCHDOG”文件夹下添加“WatchdogCC26XX.c”和“WatchdogCC26XX.h”,这两个文件所在的路径为“C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\drivers\watchdog”,操作显示如下:



选中文件,点击“打开”,即可成功添加文件。

5.应用层初始化中调用看门狗的接口,打开“C:\ti\simplelink\ble_cc26xx_2_01_00_44423\Projects\ble\SimpleBLEPeripheral\CC26xx\Source\Application”目录下的“simpleBLEPeripheral.c”文件,在该文件中添加头文件引用:

[cpp] view plain copy

  1. #include <ti/drivers/Watchdog.h>  

并添加我们封装的两个函数,源码如下:

[cpp] view plain copy

  1. void wdtCallback(UArg handle)   
  2. {  
  3.     Watchdog_clear((Watchdog_Handle)handle);  
  4. }  
  5.   
  6. void wdtInitFxn()   
  7. {  
  8.     Watchdog_Params wp;  
  9.     Watchdog_Handle watchdog;  
  10.     Watchdog_Params_init(&wp);  
  11.     wp.callbackFxn    = wdtCallback;  
  12.     wp.debugStallMode = Watchdog_DEBUG_STALL_ON;  
  13.     wp.resetMode      = Watchdog_RESET_ON;  
  14.   
  15.     watchdog = Watchdog_open(Board_WATCHDOG, &wp);  
  16.     Watchdog_setReload(watchdog, 1500000); // 1sec (WDT runs always at 48MHz/32)  
  17. }  

然后,在“simpleBLEPeripheral.c”文件的开头部分声明“wdtInitFxn”函数,截图如下:


最后,在“simpleBLEPeripheral.c”文件的初始化函数“SimpleBLEPeripheral_init”中调用看门狗“wdtInitFxn”函数。截图如下:


下面,我们来说明一下上述封装的两个函数,首先,我们可以看到“wdtInitFxn”函数中“wp.callbackFxn”的配置,该回调函数的配置是用来清除看门狗计时的,其实也就相当于我们常说的喂狗操作。在没有软件错误、程序正常允许的情况下,会定时触发该回调来喂狗,如果程序运行出现问题,该回调无法触发,看门狗达到设定的超时时间就会触发重启。

 

至于看门狗超时时间设置的问题,有的人会问为什么设置1500000就是1s呢?我们知道CC2640运行在48MHZ的频率,通过查阅资料,如下:


我们可以看到,计算看门狗超时时间的时候,需要除以32,也就是48MHZ除以32等于1.5MHZ,看门狗运行在1.5MHZ的频率上,也就是每计数一次等于1/1500000秒的时间,所以要实现1s超时时间,需要计数1500000次。这就是上面设置计数1500000即为1s的由来。

 

通过上述配置,我们的看门狗功能就添加完成了,通过实测,该看门狗配置方式可以起作用。另外,可能还有别的看门狗配置方法,后面研究出来之后,我们再继续讨论。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top