良许Linux教程网 干货合集 如何在低功耗模式下debug MCU?

如何在低功耗模式下debug MCU?

在正常情况下,当使用SWD在线调试时,一旦芯片进入低功耗模式(Stop或者Standby),调试会被断开。这是因为进入Stop或者Standby模式后,内核时钟停止运行。如果要在调试低功耗代码时仍然能够通过调试接口进行调试,有一个解决方法。

以STM32F030芯片的Stop模式为例,解决方法是将DBGMCU_CR寄存器中的DBG_STOP位置1。这样做可以使得芯片在进入低功耗模式后仍然保持与调试接口的连接,使得我们可以继续进行调试。

image-20231012205946688
image-20231012205946688
image-20231012205952262
image-20231012205952262

可以看到DBG_STOP置1时,FCLK和HCLK将处于开启状态,由内部RC振荡器提供时钟,所以还可以继续debug。

之前在调试低功耗功能时,我都是通过加打印信息来调试的。所以在看到此功能时,就迫不及待的去试了一下。

使用官方HAL库Examples\PWR\PWR_CurrentConsumption 工程,将原例程简化了下,使能 DBG_STOP,之后通过WFI方式进入stop模式,然后while(1)里翻转LED,通过按键方式唤醒。

image-20231012205956120
image-20231012205956120

理论上述代码应该是先进入低功耗,之后按键唤醒的话,LED才开始闪烁。

但是实际现象却是LED直接就闪烁了,这是怎么回事呢?

后来经过分析,是因为HAL库在初始化时,使用了systick同时开启了中断,当DBG_STOP设置位1时,systick 因为时钟在,所以还继续正常运行,导致了systick中断唤醒了MCU,所以进入了到while(1)里,

当我们把systick中断关掉

image-20231012210000197
image-20231012210000197

这时就进入了低功耗。因为HAL_Delay 函数也使用了systcik,所以这里也注释掉,或者也可以换成其他的延时函数。HAL库在时钟初始化前就开启了systick,原因是后面的延时函数用的就是systcik实现的。

这时我们全速运行,可以看到debug连接没有断掉,也没有再进入while(1)里,此时进入了低功耗函数,可以通过调试窗口的stop来验证,可以看到一直停在下面WFI里,需要注意的是,stop之后再单步或者全速运行,就会从WFI跳出继续向下运行。所以执行_WFI()函数时,必须是全速执行,不可以单步执行。

image-20231012210005489
image-20231012210005489

重新复位全速运行后,在while(1)里加断点,可以看到没有进入到断点,这时按一下按键唤醒MCU,就跳入到断点里了。这样现象就正确了。

最后总结一下:

1) 通过将DBG_STOP置1,可以支持在低功耗模式下debug MCU。

2) HAL库里使用systick中断,使用WFI进入低功耗前,需要注意将中断关掉。如果使用WFE进入低功耗,需要将systick使能计数标志位置0。

以上就是良许教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多干货等着你 !

137e00002230ad9f26e78-265x300
本文由 良许Linux教程网 发布,可自由转载、引用,但需署名作者且注明文章出处。如转载至微信公众号,请在文末添加作者公众号二维码。
良许

作者: 良许

良许,世界500强企业Linux开发工程师,公众号【良许Linux】的作者,全网拥有超30W粉丝。个人标签:创业者,CSDN学院讲师,副业达人,流量玩家,摄影爱好者。
上一篇
下一篇

发表评论

联系我们

联系我们

公众号:良许Linux

在线咨询: QQ交谈

邮箱: yychuyu@163.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部