在ENV里面添加了PM 组件之后,随便使能了一个外部中断,然后在finsh申请进入深度睡眠模式,但是不能通过外部中断唤醒,但是在finsh申请进入轻度睡眠模式下可以通过外部中断唤醒,在外部中断里面写了这两条:
rt_pm_request(PM_SLEEP_MODE_IDLE); rt_pm_release_all(0);
rt_pm_request(PM_SLEEP_MODE_IDLE);
rt_pm_release_all(0);
查看更多
外部中断唤醒 能不能唤醒 深度睡眠 是 MCU 的行为,可以查看 MCU 的手册
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
感谢大佬的回复,我在查询了之后发现深度睡眠模式应该是进入的STOP2,然后手册给出的是在STOP2模式下所有的IO事件都可以唤醒

嗯,那就先裸机验证睡眠的进入与唤醒操作(时钟等恢复)通过后,再使用 RT-Thread PM 框架会更好。
我在裸机上验证了在STOP模式下可以通过外部中断唤醒,但是在RTT中不行,同时我在外部中断的处理函数中增加了一个串口打印函数,在使用示波器查看之后发现在触发外部中断的时候串口上有电平信号,但是不是我程序中是输出,也就是说在STOP状态下确实是进入了外部中断的,但是没有完成唤醒
@张世争
外部中断唤醒MCU 是【硬件行为】,但是需要去完善唤醒后的时钟、外设等的恢复操作
在drv_pm.c这从STOP模式出来之后不是已经进行了时钟重新配置了吗
@张世争
你用的什么MCU 呢? 不同的 MCU,这部分需要完善处理的,这个 drv_pm.c 只能算是 demo。
STM32L452RET6@张世争
唤醒的时钟配置需要认真的根据 MCU 认真的完善,可以调试一下,看看系统唤醒后卡在什么位置
我看了下源码
_pm_change_sleep_mode
中进了临界区关了中断再调用的ops->sleep
,似乎会导致sleep
中WFI
后不能被中断唤醒?是关了【中断响应】,而不是【关闭中断】,中断依旧可以触发,只是延后响应
但是实测翠花的V203在进入临界区后RTC中断就不能唤醒了
建议先用裸机测明白睡眠与唤醒
上面代码,第一个断点可以执行到,第二个断点无法执行到。后经过分析,按键按下后是响应了中断,并重新执行了:
SystemClock_ReConfig(pm->run_mode);
代码执行后就是上面第二个断点,问题出在这两个地方。然后,我将做如下替换后,问题解决
所以是中断能正常触发唤醒,只是唤醒后时钟重新设置失败造成的。
如果使用 这个
SystemClock_ReConfig
中可能需要完善或重写一下,尤其是 PLL 配置部分,比如立即唤醒(未进入深睡眠)后, PLL(状态没有停止)不能重新配置,需要先 反初始化或者停掉才能 配置,也就是死在 时钟初始化的Error_Handler
中,建议干掉Error_Handler
,之前在 STM32L476 平台上验证过。