正常情況下,通過SWD在線調(diào)試時,一旦芯片進入低功耗模式(Stop或者Standby),調(diào)試就會斷開。原因是進入Stop或者Standby模式后,內(nèi)核時鐘就停止了。如果想在調(diào)試低功耗代碼時還可以正常通過調(diào)試接口debug,有沒有什么辦法呢?
以STM32F030 Stop模式為例,方法是將DBGMCU_CR寄存器的DBG_STOP位置1。
可以看到DBG_STOP置1時,F(xiàn)CLK和HCLK將處于開啟狀態(tài),由內(nèi)部RC振蕩器提供時鐘,所以還可以繼續(xù)debug。
之前在調(diào)試低功耗功能時,我都是通過加打印信息來調(diào)試的。所以在看到此功能時,就迫不及待的去試了一下。
使用官方HAL庫Examples\PWR\PWR_CurrentConsumption 工程,將原例程簡化了下,使能 DBG_STOP,之后通過WFI方式進入stop模式,然后while(1)里翻轉(zhuǎn)LED,通過按鍵方式喚醒。
理論上述代碼應該是先進入低功耗,之后按鍵喚醒的話,LED才開始閃爍。
但是實際現(xiàn)象卻是LED直接就閃爍了,這是怎么回事呢?
后來經(jīng)過分析,是因為HAL庫在初始化時,使用了systick同時開啟了中斷,當DBG_STOP設置位1時,systick 因為時鐘在,所以還繼續(xù)正常運行,導致了systick中斷喚醒了MCU,所以進入了到while(1)里,
當我們把systick中斷關掉
這時就進入了低功耗。因為HAL_Delay 函數(shù)也使用了systcik,所以這里也注釋掉,或者也可以換成其他的延時函數(shù)。HAL庫在時鐘初始化前就開啟了systick,原因是后面的延時函數(shù)用的就是systcik實現(xiàn)的。
這時我們?nèi)龠\行,可以看到debug連接沒有斷掉,也沒有再進入while(1)里,此時進入了低功耗函數(shù),可以通過調(diào)試窗口的stop來驗證,可以看到一直停在下面WFI里,需要注意的是,stop之后再單步或者全速運行,就會從WFI跳出繼續(xù)向下運行。所以執(zhí)行_WFI()函數(shù)時,必須是全速執(zhí)行,不可以單步執(zhí)行。
重新復位全速運行后,在while(1)里加斷點,可以看到?jīng)]有進入到斷點,這時按一下按鍵喚醒MCU,就跳入到斷點里了。這樣現(xiàn)象就正確了。
最后總結(jié)一下:
1) 通過將DBG_STOP置1,可以支持在低功耗模式下debug MCU。
2) HAL庫里使用systick中斷,使用WFI進入低功耗前,需要注意將中斷關掉。如果使用WFE進入低功耗,需要將systick使能計數(shù)標志位置0。