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