天天看點

物聯網-移遠M26子產品OpenCPU開發第3講(看門狗)

之前在物聯網-移遠M26子產品OpenCPU開發第1講中提到過需要給外部看門狗晶片喂狗才能正常工作,閱讀過的讀者應該知道,我是通過周期性的控制M26的一個GPIO引腳電平變化來實作喂狗的。關于其硬體參考設計如下圖:

物聯網-移遠M26子產品OpenCPU開發第3講(看門狗)
物聯網-移遠M26子產品OpenCPU開發第3講(看門狗)

其實,移遠M26 OpenCPU自帶看門狗管理器,可以使用其内部看門狗管理器來進行喂狗,軟體實作的原理如下圖:

物聯網-移遠M26子產品OpenCPU開發第3講(看門狗)

除了執行使用者應用期間的喂狗,還可以在晶片啟動時和遠端更新軟體時主動喂狗(沒有驗證過,後期會試一下遠端更新軟體功能),如下圖:

物聯網-移遠M26子產品OpenCPU開發第3講(看門狗)

當然在執行應用期間也需要用到定時器,調用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

繼續閱讀