簡體   English   中英

未配置時 STM32 WWDG 中斷觸發

[英]STM32 WWDG interrupt firing when not configured

由於許可證問題,我有一個應用程序從 Keil IDE 移植到 GNU 工具鏈。 我已經成功地能夠在設備上設置、構建、刷新和運行應用程序。

GNU 端的應用程序由於某種原因卡在 WWDG 的弱鏈接 IRQ 處理程序中,這是一個無限循環。 應用程序不啟用 WWDG,默認情況下它在復位時被禁用。 我還驗證了配置寄存器處於默認啟動值。

除了編譯器之外,唯一的區別是鏈接器和啟動文件。 但是,兩個工具鏈使用的啟動文件和鏈接器文件都是 STM 生成的默認值。

知道是什么原因造成的嗎? 我快到此為止了。

使用 stm32f103XX,讓我知道是否有任何其他信息會有所幫助。

編輯:使用下面的評論,我能夠確定它實際上是被觸發的 HardFault_Handler。 如果可能有幫助,我已經在下面包含了回溯輸出

GDB BT:

0 HardFault_Handler ()

1(調用的信號處理程序)

2 0x720a3de 在 ?? ()

3 0x80005534 在 foo ()

回溯停止:前一幀與此幀相同(堆棧損壞?)

有兩件事對我來說很突出,盡管我不是 gdb 專家。 1) foo 不是函數,它是一個常量字符數組 2) 0x0720a3de 不是有效的內存地址,閃存地址范圍從 0x08000000 開始

所以多虧了 D Krueger 的一腳踢球。 我能夠弄清楚 HardFault_Handler 是實際被調用的。 所以,任何偶然發現這篇文章的人,通過編寫臨時函數來覆蓋可能的罪魁禍首,即 HardFault,驗證哪個 IRQ 真正被調用。 IRQ 調用的真正問題是 memcpy 的內存訪問錯誤,我正在解決下一個問題。

在移植 STM32F3 探索板的示例以在帶有 STM32Cube F3 庫 (v1.1.0) 的 CooCox CoIDE 1.7.7 中編譯時,我遇到了與 OP 完全相同的錯誤(明顯的 WWDG 中斷,但實際上是 HardFault_Handler 觸發)。 只要我沒有嘗試使用任何中斷,代碼就可以正常運行,但是一旦我打開 SysTick 計時器中斷,HardFault 異常就會觸發。

問題是我忽略了在項目中包含 stm32f3xx_it.h 和 stm32f3xx_it.c 文件。 他們的缺席不會導致任何編譯器警告/錯誤。 一旦它們被編譯和鏈接,帶有中斷的代碼運行良好。

由於與awilhite相同的根本原因,我遇到了這個問題。 我正在使用 Atollic TrueStudio 8.0.0。 我用它來為 STM32F030 啟動一個項目,並(可能手動)添加了帶有 stm32f0xx.h 的庫文件夾,它定義了 ADC1_IRQn(NVIC 設置中使用的 IRQ 通道號)。

我在我的 main.c 中實現了 ADC1_IRQHandler(void)(因為我已經習慣了,到目前為止它一直有效——x_IRQn -> x_IRQHandler)

但是經過 2 天的挫折后,我發現我的項目中的 startup_stm32f0xx.s 定義了 ADC1_COMP_IRQHandler。

所以,最終,我的 ADC 中斷處理程序是未定義的,當 ADC 產生中斷時,程序崩潰(WWDG 中斷)。

我希望這對像我這樣的人有所幫助,他們認為他們確實實施了他們的處理程序,但實際上他們沒有。

在合並由 STM32CubeMX 為 STM32F2XX 處理器分別生成的兩個項目時,我遇到了一個非常相似的問題。 一個項目正在使用以太網外圍設備,而另一個則沒有。 除了這一點不同之外,這兩個項目使用了相同的外圍設備。

通過手動復制文件將兩個項目集成在一起后,應用程序將在啟動第一個任務(第一次啟用中斷時)后最終在 WWDG_IRQHandler 中。 我首先確認 WWDG 寄存器的 WDGA 位確實沒有設置,因此,WWDG 外設被禁用。 接下來,我驗證了中斷向量表是否正確初始化。 最后,經過幾個小時的挖掘,我意識到我沒有在 stm32f2xx_it.c 中定義 ETH_IRQHandler 函數,這會引發以太網中斷由默認處理程序處理,將自己偽裝成 WWDG_IRQHandler —— 可能是由於優化。

核心問題是調用默認處理程序而不是另一個 irq 處理程序。 我懷疑我們的情況是否相同,但這是我的解決方案:

我正在做一個 C++ 項目,同樣的事情發生在我身上。 這是我第一次使用 CMSIS 從頭開始​​制作項目。 經過一些不成功的嘗試后,當我注意到stm32xxxx_it.h的 IRQ 處理程序函數原型受以下保護時,我瀏覽了一個生成的項目:

extern "C"
{
    void TIM7_IRQHandler(void);
}

有了這些守衛,鏈接器可以找到我自己的中斷處理函數。

我將詳細介紹是什么讓我來到這里,以及我如何使用來自@Mike的見解來糾正它。

我有一個項目在 Eclipse SW4STM32 中的演示項目上運行良好,但源代碼和標題散落在各處,因此我希望有一個更“緊湊”的項目,更易於定制和用作小修改的基礎(並且更容易在 Git 中遵循)。

我創建了一個針對同一塊板的空 AC6 項目。 它生成了 HAL 驅動程序、 startup_stm32.sLinkerScript.ld 然后我將原始項目中的所有.c和相應的.h復制到我的新項目中(這本身就很痛苦,因為它們分散在 BSP、CMSIS、組件、中間件等目錄中)。 一切都經過編譯並且似乎可以工作,直到我開始進行一些修改。

在調試器中,似乎所有函數調用都在工作,直到while(1)主循環,我最終進入了startup_stm32.s定義的Default_Handler ,似乎來自WWDG_IRQHandler 事實上,這WWDG_IRQHandler用戶定義處理程序的默認 IRQ 處理程序( WWDG_IRQHandler是第一個聲明的處理程序,它由 gdb 報告,如@D Krüger 所示)。

我開始尋找編譯器和連接選項或鏈接腳本,沒有太多的運氣,直到我意識到我沒有檢查是唯一的文件startup_stm32.s ,這的確不同的。

我盲目地復制粘貼它,瞧!

我可以給出的解釋是,當中斷發生時,STM32 正在調用startup_stm32.s定義的IRQ 處理程序,所有這些處理程序最初都指向Default_Handler() (后來被鏈接器覆蓋)。 因此,如果您復制的.c文件定義了一個名稱略有不同的處理程序(但與其自己的startup_xxx.s一致),您最終將調用Default_Handler() (這是一個無限循環)而不是一個你定義的。 事情出錯了。

有關更多信息,請參閱https://www.freertos.org/Debugging-Hard-Faults-On-Cortex-M-Microcontrollers.html

注意,我不喜歡在沒有完全理解的情況下盲目地復制粘貼,但是時間限制和里程碑通常會將您推向不喜歡探索的領域......

就我而言,我有一個用 GCC 程序集編寫的函數,該函數是從 ARM 程序集遷移而來的。 在我將.thumb_func行添加到程序集文件后,問題就消失了。

我收到此錯誤:

(gdb) c
+c
Continuing.

Program received signal SIGINT, Interrupt.
WWDG_IRQHandler () at ...startup_stm32f40_41xxx.s:121

(gdb) bt
#0  WWDG_IRQHandler () at ...startup_stm32f40_41xxx.s:12
#1  <signal handler called>
#2  RTOS_SysTick_Handler () at ...osKernel.s:18
#3  <signal handler called>
#4  0x0800021a in task0 () at ...main.cpp:10
#5  0x08000214 in frame_dummy ()
#6  0x00000000 in ?? ()

RTOS_SysTick_Handler是一個用匯編編寫的函數,並且WWDG_IRQHandler總是在該函數中的任何第一條匯編指令之前被觸發(嘗試了不同的指令,但它沒有改變任何東西)。

我正在對 C 代碼進行一些調整,在某個時候,我遇到了另一個處理程序: UsageFault ,這讓我找到了.thumb_func提示: ARM Cortex M4 SVC_Handler "UsageFault"

將添加我的 5 美分。 我在 stm32h7 上遇到了這個問題,但對我來說,原因是當 TIM16 用作時基源時,多維數據集“忘記”添加 TIM16_IRQHandler。 它不是在開始時發生,而是在幾次代碼重新生成之后發生。 看起來像多維數據集中的錯誤,因為 TIM16 仍然設置,但中斷處理程序被刪除。 所以切換到 TIM17 並返回解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM