之前在物聯網-移遠M26子產品OpenCPU開發第1講中提到過需要給外部看門狗晶片喂狗才能正常工作,閱讀過的讀者應該知道,我是通過周期性的控制M26的一個GPIO引腳電平變化來實作喂狗的。關于其硬體參考設計如下圖:
其實,移遠M26 OpenCPU自帶看門狗管理器,可以使用其内部看門狗管理器來進行喂狗,軟體實作的原理如下圖:
除了執行使用者應用期間的喂狗,還可以在晶片啟動時和遠端更新軟體時主動喂狗(沒有驗證過,後期會試一下遠端更新軟體功能),如下圖:
當然在執行應用期間也需要用到定時器,調用Ql_WTD_Feed(wtd_id)函數,具體理論知識我就不過多的闡述了,煩請讀者自行閱讀參考手冊,裡面有詳細的操作方式和例程,詳情參考: Quectel_OpenCPU_Watchdog_Application_Note_V1.0
下面我上傳一下我項目應用中用到的配置代碼,如下:
// 定義定時器相關變量
static u32 g_myTimerId_wtd = TIMER_ID_USER_START+2; // 喂狗定時器ID 102
static u32 g_nInterval_wtd = 500; // 500ms中斷
void WTD_Program(void)
{
s32 ret;
s32 wtdid;
// Initialize external watchdog:
// specify the GPIO pin (PINNAME_NETLIGHT) and the overflow time is 600ms.
ret = Ql_WTD_Init(0, PINNAME_NETLIGHT, 600);
if (0 == ret)
{
Ql_memset(pchData, 0x0, sizeof(pchData));
dataLen = Ql_sprintf(pchData, "\r\n<--OpenCPU: watchdog init OK!-->\r\n");
Ql_UART_Write(UART_PORT1,(u8*)pchData,dataLen);
}
// Create a logic watchdog, the interval is 3s
wtdid = Ql_WTD_Start(3000);
// Register & start a timer to feed the logic watchdog.
// The watchdog id will be passed into callback function as parameter.
ret = Ql_Timer_Register(g_myTimerId_wtd, Callback_OnTimer, &wtdid);
if(ret < 0)
{
Ql_memset(pchData, 0x0, sizeof(pchData));
dataLen = Ql_sprintf(pchData, "<--main task: register fail ret=%d-->\r\n",ret);
Ql_UART_Write(UART_PORT1,(u8*)pchData,dataLen);
return;
}
// The real feeding interval is 2s
ret = Ql_Timer_Start(g_myTimerId_wtd, 2000,TRUE);
if(ret < 0)
{
Ql_memset(pchData, 0x0, sizeof(pchData));
dataLen = Ql_sprintf(pchData, "<--main task: start timer fail ret=%d-->\r\n",ret);
Ql_UART_Write(UART_PORT1,(u8*)pchData,dataLen);
return;
}
Ql_memset(pchData, 0x0, sizeof(pchData));
dataLen = Ql_sprintf(pchData, "<--main task: start timer OK ret=%d-->\r\n",ret);
Ql_UART_Write(UART_PORT1,(u8*)pchData,dataLen);
}
請大家不要過多糾結函數中用到的變量,可以自行定義或者更改。當然了,上面隻是初始化配置函數,還需在定時器回調函數裡調用Ql_WTD_Feed()函數,代碼如下:
// 定時器回調函數
void Callback_OnTimer(u32 timerId, void* param)
{
s32* wtdid = (s32*)param;
Ql_WTD_Feed(*wtdid);
Ql_memset(pchData, 0x0, sizeof(pchData));
dataLen = Ql_sprintf(pchData, "<-- time to feed logic watchdog (wtdId=%d) -->\r\n",*wtdid);
Ql_UART_Write(UART_PORT1,(u8*)pchData,dataLen);
}
關于定時器相關知識請參考:Quectel_M26-OpenCPU_User_Guide_V1.0定時器相關章節。
到此,m26的看門狗功能也就講完了,歡迎讀者提出疑問,可以加群讨論:838839442 微信公衆号:
版權聲明:本文為CSDN部落客「u014754841」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/u014754841/article/details/85221825