CC2640之看門狗

測試環境


協議棧版本: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文件,在文件的最後添加如下代碼:

/*
*  ============================= WatchDog Begin===========================
*/
#include <ti/drivers/Watchdog.h>
#include <ti/drivers/watchdog/WatchdogCC26XX.h>

/* Watchdog objects */
WatchdogCC26XX_Object watchdogCC26XXObjects[SENSORTAG_CC2650_WATCHDOGCOUNT];

/* Watchdog configuration structure */
const WatchdogCC26XX_HWAttrs watchdogCC26XXHWAttrs[SENSORTAG_CC2650_WATCHDOGCOUNT] = {
    /* SENSORTAG_CC2650_WATCHDOG0 with 1 sec period at default CPU clock freq */
    {WDT_BASE, INT_WATCHDOG},
};

const Watchdog_Config Watchdog_config[] = {
    {&WatchdogCC26XX_fxnTable, &watchdogCC26XXObjects[0], &watchdogCC26XXHWAttrs[0]},
    {NULL, NULL, NULL},
};

/*
*  ============================= WatchDog End============================
*/

2.打開C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\boards\SRF06EB\CC2650EM_7ID目錄下的Board.h文件,在文件的最後添加如下代碼:

/*!
*  @def    CC2650_WatchdogName
*  @brief  Enum of Watchdogs on the CC2650 dev board
*/
typedef enum CC2650_WatchdogName {
	CC2650_WATCHDOG0 = 0,
	CC2650_WATCHDOGCOUNT
} CC2650_WatchdogName;

/*!
*  @def    SENSORTAG_CC2650_WatchdogName
*  @brief  Enum of Watchdogs on the SENSORTAG_CC2650 dev board
*/
typedef enum SENSORTAG_CC2650_WatchdogName {
	SENSORTAG_CC2650_WATCHDOG0 = 0,
	SENSORTAG_CC2650_WATCHDOGCOUNT
} SENSORTAG_CC2650_WatchdogName;

這樣,RTOS中看門狗部分就配置好了,下面我們來看看應用層是如何配置的。




應用層配置


1.將驅動中看門狗相關的文件添加到編譯選項中,選擇CC2640App--->右鍵點擊Drivers--->Add--->Add Files...,操作截圖如下:



2.上述操作之後,會彈出文件添加的對話框,找到C:\ti\tirtos_simplelink_2_13_00_06\packages\ti\drivers目錄下的Watchdog.cWatchdog.h文件,選中之後,點擊打開添加到工程中。操作顯示如下:



3.選擇CC2640App--->右鍵點擊Drivers--->Add--->Add Group...,操作截圖如下:



在彈出的對話框中輸入WATCHDOG,操作顯示如下:



點擊OK之後,結果如下:



Drivers”文件夾下生成WATCHDOG文件夾。


4.在剛生成的WATCHDOG”文件夾下添加WatchdogCC26XX.cWatchdogCC26XX.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文件,在該文件中添加頭文件引用:

#include <ti/drivers/Watchdog.h>

並添加我們封裝的兩個函數,源碼如下:

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

void wdtInitFxn() 
{
	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)
}

然後,在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的由來。

 

 

通過上述配置,我們的看門狗功能就添加完成了,通過實測,該看門狗配置方式可以起作用。另外,可能還有別的看門狗配置方法,後面研究出來之後,我們再繼續討論。








發佈了66 篇原創文章 · 獲贊 207 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章