痞子衡嵌入式:聊聊系統看門狗WDOG1在i.MXRT1xxx系統啟動中的應用及影響

痞子衡發表於2022-04-21

  大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是系統看門狗WDOG1在i.MXRT1xxx系統啟動中的應用及影響

  軟體看門狗模組(WDOG)在 MCU 應用裡可以說是非常基礎的功能模組。對於一個產品級的應用程式,如果它沒有使能主控內部的看門狗模組,一般都不能算是一個合格的軟體設計。有的時候,硬體工程師覺得軟體看門狗不可靠,還會在板級設計裡再加入外部看門狗電路。總之看門狗對於產品工作穩定性具有很重要的意義。

  最近有一個 i.MXRT 客戶注意到了晶片手冊 System Boot 章節裡提及了 WDOG 應用,想使能這個功能,並且要確認該功能真實生效以及評估對後續應用程式的影響。藉助客戶的問題,我們來細聊下這個話題。

一、WDOG模組簡介

  首先我們來了解一下 i.MXRT1xxx 系列內部的 WDOG 模組,在i.MXRT1xxx 內部 WDOG 模組一共有三個(WDOG1/2/3),雖然 WDOG 本質上就是個特殊功能定時器,但因為晶片設計時為其賦予的超時觸發行為不同,所以其應用場合並不一樣。

1.1 系統看門狗WDOG1/2

  WDOG1 和 WDOG2 屬於系統看門狗,前者用於系統級復位(產生 WDOG_RESET_B_DEB 訊號給 SRC 模組)防止系統發生異常,後者用於系統 SNVS 域安全警報(不會產生復位效果)。不過從模組暫存器角度,WDOG1 和 WDOG2 是一樣的,因此除了超時觸發行為外,它們其餘方面特性是一樣的:

1. 模組內部兩個計數時鐘源是固定的,來自 ipg_clk_32k 以及 anatop_xtal32k_clk 。
2. 模組內部 8bit 定時器(Time-Out Counter)用於產生 WDOG_RESET_B_DEB 復位訊號,計時精度固定為 0.5 秒,超時可設範圍為 0.5 秒到 128 秒。
3. 模組內部定時器(Power Down Counter)用於產生對外輸出的復位訊號 WDOG_B,其超時時間固定為 16 秒。
4. 模組對外輸出的訊號最多有三個: WDOG_RST_B_DEB、WDOG_B、WDOG_ANY(僅 WDOG1)。
5. 模組使能訊號 WDOGx->WCR[WDE] 可多次設定(並不是一次復位期間僅可 write one once)。
6. 模組配置暫存器與定時器計數值可直接修改。
7. 模組 Time-Out Counter 預設是關閉的,Power Down Counter 預設是開啟的。

1.2 核心看門狗WDOG3(4)

  WDOG3 有時候又叫 RTWDOG(對於 RT1170,還存在用於預設 CM4 從核的 WDOG4),屬於核心看門狗,主要用於復位核心,防止程式陷入死迴圈。其模組暫存器跟 WDOG1/2 完全不同,更接近於一般的定時器模組設計:

1. 模組內部計數時鐘源有四種選擇,Bus clock / LPO clock / INTCLK / ERCLK 。
2. 模組內部 16bit 定時器(Time-Out Counter)用於產生核心復位訊號。
3. 模組使能訊號 WDOGx->CS[EN] 可多次設定(但是其屬於 write-once 屬性)。
4. 模組配置暫存器 write-once bits 與定時器計數值需要特殊 unlock 時序才可以修改。
5. 模組 Time-Out Counter 預設是開啟的。

二、系統ROM裡對WDOG的使用

  i.MXRT1xxx 系列晶片上電預設都是先執行系統 BootROM,在 BootROM 裡會有對看門狗的處理。預設情況下 BootROM 是不啟用看門狗做程式碼執行守護的,只有當使用者燒寫了指定的 eFuse 位,看門狗功能才會生效。BootROM 並沒有使用預設開啟的 WDOG3,而是將其關閉並開啟了 WDOG1 作為看門狗。

2.1 看門狗使能

  i.MXRT10xx 系列晶片 BootROM 看門狗在 eFuse 裡配置如下,包含 eFuse 0x460[21] 使能位與 eFuse 0x6D0[15:13] 超時時間設定。

  i.MXRT1160/1170 晶片 BootROM 看門狗在 eFuse 裡配置如下,包含 eFuse 0x9A0[15] 使能位與 eFuse 0x9B0[2:0] 超時時間設定,以及多了 eFuse 0x9B0[5:3] 關於 WDOG_B 外部訊號腳選擇設定。

  當 Fuse 裡使能了看門狗功能後,BootROM 對看門狗模組的配置如下:

void ROM_WDOG_init(void)
{
    uint16_t timeout = get_timeout_value_from_fuse();

    WDOG1->WCR = (uint16_t)(WDOG_WCR_WT(timeout)
                           | WDOG_WCR_WDW_MASK
                           | WDOG_WCR_SRE_MASK
                           | WDOG_WCR_WDA_MASK
                           | WDOG_WCR_WDBG_MASK
                           | WDOG_WCR_SRS_MASK);

    WDOG1->WCR |= (uint16_t)WDOG_WCR_WDE_MASK;
}

2.2 看門狗作用

  對於 i.MXRT10xx 系列,BootROM 看門狗主要用於 Serial Downloader 分支程式下(SDP 模式 BT_MODE = 2'b01,或者 Device Boot 模式 BT_MODE = 2'bx0 下啟動失敗進入了 Serial Downloader)檢測與主機通訊情況,只要在設定的超時時間裡沒有通訊互動行為,看門狗就會復位整個系統(並不是單次通訊就可以的,任意超時時間內都得保持互動)。如果在 Device Boot 模式下能夠正常啟動程式,則看門狗不會被使能。

  對於 i.MXRT1160/1170 系列,BootROM 看門狗不僅在 Serial Downloader 分支程式中有效,其在 Device Boot 模式下(BT_MODE = 2'bx0)也同樣被使能了,這樣做主要有兩個用意:

  • 用意1: 如果因板級電路干擾導致首次啟動程式失敗,BootROM 正常是直接跳轉到了 SDP 模式不會再做啟動程式行為。但是使能了看門狗,則在 SDP 模式下等待超時時間後系統復位會重新嘗試啟動程式,這樣不斷嘗試直到板級干擾消失。
  • 用意2: 如果啟動程式成功,BootROM 會直接跳轉到目標應用程式,但無法檢驗目標程式是否能夠正常執行。但是使能了看門狗,如果應用程式不對看門狗做有效處理,系統還是會復位回來,這樣相當於做了應用程式是否執行的驗證。

三、WDOG使能後對i.MXRT開發的影響

  現在回到文章開頭提到的客戶問題,如何判斷 BootROM 中 WDOG 已經生效了,這個其實特別簡單,在 SDP 模式下插上 USB 線,在資源管理器裡觀察是不是有 HID 裝置每隔一段時間就會重新列舉一次,沒錯就是 WDOG 搗的鬼。

  那麼對於應用程式的開發,有什麼注意事項呢?對於 i.MXRT10xx 其實沒有任何影響,而對於 i.MXRT1160/1170,則必須在應用程式裡增加對 WDOG1 的處理。在恩智浦提供的標頭檔案 system_MIMXRT1xxx.c 檔案裡 SystemInit() 函式中其實有關於看門狗相關程式碼,預設是將全部的看門狗都關一遍(DISABLE_WDOG=1),這部分程式碼對於 i.MXRT10xx 程式是可以不做的,但是對於 i.MXRT1160/1170 就必須要做了。

  至此,系統看門狗WDOG1在i.MXRT1xxx系統啟動中的應用及影響痞子衡便介紹完畢了,掌聲在哪裡~~~

歡迎訂閱

文章會同時釋出到我的 部落格園主頁CSDN主頁知乎主頁微信公眾號 平臺上。

微信搜尋"痞子衡嵌入式"或者掃描下面二維碼,就可以在手機上第一時間看了哦。

相關文章