這樣的問題都是發生在除錯那些可以在cpu不干預的時候自動執行的模組、或在除錯低功耗模式的程式的時候。
所謂「可以在cpu不干預的時候自動執行的模組」包括:dma、定時器、連續轉換模式下的adc、看門狗等模組。
這個問題的根源是:
2)低功耗是通過停止cpu的時鐘而實現,jtag除錯是通過與cpu的通訊實現,停止了cpu的時鐘致使偵錯程式會失去與cpu的通訊。
有人說「我停止除錯的時候,這些模組已經停止了執行,應該不會干擾到後續的除錯」,這個問題要從幾方面看:
一、偵錯程式是通過停止cpu核心的時鐘來停止被除錯程式的執行,實際上被除錯晶元的硬體模組並沒有被復位,它們還處於使能狀態,那些能夠自動執行的模組只是處於暫停狀態,一旦恢復了時鐘之後,它們仍會繼續執行。
二、目前常用的除錯軟體,不管是iar ewarm還是keil mdk,除錯軟體介面上的"復位"按鈕都不能對晶元執行硬體的復位,這個"復位"按鈕只能對晶元內的程式執行軟體復位,即把執行指標重新指向復位位址。
三、使用板上的復位按鈕可以手動地進行硬體復位,使所有模組(包括那些能夠自動執行的模組)停止工作並恢復到復位狀態。但是當偵錯程式需要控制cpu之前,它需要先為cpu核心提供時鐘,然後需要較長的一段時間做一些初始化的動作,然後才能接管cpu核心的控制權。在偵錯程式為cpu核心提供時鐘之後,使用者程式就已經開始執行起來,如果使用者程式在偵錯程式接管cpu核心的控制權之前,就初始化好硬體模組並啟動執行,則仍然會產生與偵錯程式的衝突。
根據以上的分析,解決這個問題的關鍵是,在偵錯程式接管cpu核心的控制權之前,必須停止所有能夠自動執行模組的操作,使它們處於關閉狀態,要做到這一點,可以有以下幾種方案;
1)每次退出除錯狀態時,先停止所有模組的執行,比如執行該模組的deinit()操作。
**:
STM32的CAN匯流排除錯
1.使用stm32的can匯流排,回環程式寫好之後,在無外接收發晶元的情況下,使程式不斷發資料,使用示波器可以看到tx引腳有波形,而rx引腳沒有波形 2.模式改為正常模式,在沒有接收發晶元的情況下再次測一下tx與rx的波形,但是發現使用示波器採集不到波形,而且在發了幾次資料後會進行標準庫的斷言,一直...
STM32的SWD除錯方式
swd 模式概念簡述 一 swd 和傳統的除錯方式區別 二 器對 swd 模式支援情況 1.市面上的常用 器對 swd 模式支援情況 1 jlinkv6 支援 swd 模式,速度較慢。2 jlinkv7 比較好的支援 swd 模式,速度有了明顯的提高,速度是 jlinkv6 的 6 倍。3 jlin...
stm32 卡到b 這裡 STM32的儲存器結構
看完這篇文章你會有什麼收穫?1.理解什麼是記憶體和io統一編址 2.知道stm32的4g記憶體是如何使用的 3.理解變數和記憶體的關係 4.理解對齊編址的必要性 下面進入正文 1.因為記憶體和io統一編址,所以你可以直接操控暫存器來讓io口工作,這是由硬體決定的。編址的工作由位址線來完成,stm32...