1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
正常情况下,通过SWD在线调试时,一旦芯片进入低功耗模式(Stop或者Standby),调试就会断开。原因是进入Stop或者Standby模式后,内核时钟就停止了。如果想在调试低功耗代码时还可以正常通过调试接口debug,有没有什么办法呢? 以STM32F030 Stop模式为例,方法是将DBGMCU_CR寄存器的DBG_STOP位置1。 可以看到DBG_STOP置1时,FCLK和HCLK将处于开启状态,由内部RC振荡器提供时钟,所以还可以继续debug。 之前在调试低功耗功能时,我都是通过加打印信息来调试的。所以在看到此功能时,就迫不及待的去试了一下。 使用官方HAL库Examples\PWR\PWR_CurrentConsumption 工程,将原例程简化了下,使能 DBG_STOP,之后通过WFI方式进入stop模式,然后while(1)里翻转LED,通过按键方式唤醒。 理论上述代码应该是先进入低功耗,之后按键唤醒的话,LED才开始闪烁。 但是实际现象却是LED直接就闪烁了,这是怎么回事呢? 后来经过分析,是因为HAL库在初始化时,使用了systick同时开启了中断,当DBG_STOP设置位1时,systick 因为时钟在,所以还继续正常运行,导致了systick中断唤醒了MCU,所以进入了到while(1)里, 当我们把systick中断关掉 这时就进入了低功耗。因为HAL_Delay 函数也使用了systcik,所以这里也注释掉,或者也可以换成其他的延时函数。HAL库在时钟初始化前就开启了systick,原因是后面的延时函数用的就是systcik实现的。 这时我们全速运行,可以看到debug连接没有断掉,也没有再进入while(1)里,此时进入了低功耗函数,可以通过调试窗口的stop来验证,可以看到一直停在下面WFI里,需要注意的是,stop之后再单步或者全速运行,就会从WFI跳出继续向下运行。所以执行_WFI()函数时,必须是全速执行,不可以单步执行。 重新复位全速运行后,在while(1)里加断点,可以看到没有进入到断点,这时按一下按键唤醒MCU,就跳入到断点里了。这样现象就正确了。 最后总结一下: 1) 通过将DBG_STOP置1,可以支持在低功耗模式下debug MCU。 2) HAL库里使用systick中断,使用WFI进入低功耗前,需要注意将中断关掉。如果使用WFE进入低功耗,需要将systick使能计数标志位置0。 原作者:wuyage |
|
相关推荐
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
飞凌嵌入式-ELFBOARD 硬件知识分享-ELF 2电源电路讲解
563 浏览 0 评论
1515 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程介绍之烧写所需镜像
1357 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-mfgtools烧录流程之烧写方法
793 浏览 0 评论
飞凌嵌入式ElfBoard ELF 1板卡-内核编译之初次编译
1239 浏览 0 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 21:46 , Processed in 0.473116 second(s), Total 40, Slave 34 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号