調試

2015-09-11 31 views
6

期間禁用STM32 IWDG我有一個ChibiOS 3.x的程序上,我使用IWDG看門狗的錯誤復位MCU這樣的STM32F4微控制器:調試

int main() { 
    iwdgInit(); 
    iwdgStart(&IWDGD, &wd_cfg); 
    while(true) { 
     // ... do stuff 
    } 
} 

如果我現在附上我的調試器和,在任何時候,停止程序(手動或通過斷點),微控制器將在看門狗配置定義的超時後復位(並因此在調試過程中導致問題)

如何禁用此行爲由於調試器,核心停止時如何禁用IWDG?

我已經嘗試完全禁用它,但是,我需要讓它運行以捕獲不需要的IWDG重置。

+0

的IWDG默認是關閉的,所以你只要可以禁用它,直到你開始測試的最終代碼。如果你想爲STM編寫教程,那麼你在STM32 wiki上會更好。堆棧溢出是問答,而不是教程網站。 – Olaf

+0

@Olaf a)請放心,我的教程看起來完全不同於此。這是一個具體問題,具體答案,換句話說就是問答。你的意思是什麼STM32 wiki? b)你的假設是錯誤的。在早期開發中,這可能會起作用如果WDG計時器用完,我有很多用戶需要* IWDG重置。以獲取有關高負載網絡活動(錯誤)行爲的數據(看門狗是否被錯誤地重置?)。等到生產這個將是愚蠢的。對於生產測試來說,答案也是非常重要的。 –

+2

@Olaf所以,不要問STM32問題*因爲它全都在文檔中?我並不認爲這個觀點有效。如果您認爲這是一個沒有足夠研究的問題,請立即投票和/或投票結束。我假定你已經做到了。當你這樣做時,我會爲實際問題寫更多的解決方案,抱歉... –

回答

6

STM32 MCU包含一個稱爲調試凍結的功能。您可以停止幾個外設,包括I2C超時,RTC,當然還有看門狗。

STM32 reference manual中,請參閱第38.16.4ff節。

IWDG正在APB1總線上運行。因此,您需要修改DBGMCU_APB1_FZ,最具體的說是在該寄存器中的位DBG_IWDG_STOP

該寄存器的POR值(=默認值)爲0x0,即如果您沒有主動禁用它,則IWDG仍將繼續運行。

int main() { 
    // Disable IWDG if core is halted 
    DBGMCU->APB1FZ |= DBGMCU_APB1_FZ_DBG_IWDG_STOP; 
    // Now we can enable the IWDG 
    iwdgInit(); 
    iwdgStart(&IWDGD, &wd_cfg); 
    // [...] 
} 

注意,不能夠在軟件看門狗時,可能仍然在硬件啓用如果WDG_SW位在閃光燈選項字節復位。

如果您使用的是ST HAL(不包括在ChibiOS,見STM32CubeF4),你也可以使用這個宏:

__HAL_DBGMCU_FREEZE_IWDG() 

(基本上不象我們上面那樣完全一樣)

此外,您需要啓用APB2上的DBGMCU時鐘。

__HAL_RCC_DBGMCU_CLK_ENABLE(); 
3

當使用ST HAL,使用正確的宏:

__HAL_DBGMCU_FREEZE_IWDG() 
+0

好點,謝謝你添加這個。大多數情況下,我不使用HAL,至少對於簡單的東西,但我想大多數人通常使用ST HAL,所以這可能對他們很有幫助。 –