ch582开启HAL_SLEEP睡眠模式,通过gpio中断唤醒,如何再次进入睡眠。

ch582开启HAL_SLEEP睡眠模式,通过gpio中断唤醒(就是按了一个按钮),执行中断函数,中断函数执行完后,我期望它继续进入睡眠,等待tmos的rtc调度唤醒。

但是看电流有1.6毫安,应该是系统处于空闲状态,并没有睡过去。

如何让他执行完中断后再次睡眠,以省电?



通过实验,在中断里加一个tmos_set_event(),让他随便进一个tmos任务,这样就能正常休眠。

但是,网上(https://www.cnblogs.com/iot-fan/p/13460082.html)有人说,不要再中断里操作tmos任务,是否有这个说法。是否能在中断函数里安全调用tmos_set_event。

image.png




1、开启睡眠可以通过BLE文件夹下面的peripheral例程进行使用,即开始HAL_SLEEP使能后,通过TMOS任务进行实时的唤醒操作;

2、不可以在中断中进行TMOS任务的调用,可以通过进入中断置标志,同时一直开启TMOS任务查询该标志,查询到则执行对应的任务。


感谢回复!

我的需求基本上可以简化为,功耗尽量低的情况下,通过一个按钮,启动一个TMOS任务A。

结合上述问答,我理解有如下解决方案:

      使用外部中断,按下按钮后在中断里置标志,TMOS有一任务,一直检查这个标志,查询到则执行任务A。

有问题:

1、假设每100毫秒检测一次这个标志,这么高的检测频率,会不会显著增加功耗。

2、假设每100毫秒检测一次这个标志,第0毫秒检测完毕后睡下,第1毫秒进入中断,之后结束中断函数。那么从这一刻到下一次检测之间的99毫秒内,整个系统是不是一直处于未睡眠的空闲状态,功耗在1毫安以上。

3、如果问题2成立,是不是应该改为完全不用gpio中断,直接用循环任务检测io口电平,以避免问题2。或者有什么更好的方案实现我的需求。




如果从楼主的描述,我理解的是楼主要设计一个按键后进入睡眠的功能。中断里置位信号来设置睡眠状态即可。至于你要通过全局变量还是信号量还是别的方式来处理,加快睡眠功能的调用,这是楼主自己考虑的问题吧。RTOS中考虑这个,至少比你原设计的100毫秒检测一次要简单的多。建议去学习一下RTOS中断和线程间通信的知识。以及RTOS线程调度的原理。


1、sleep是由协议栈管理的,其唤醒后处理完成任务后会自动进入睡眠;

2、睡眠唤醒有两种:GPIO唤醒和TMOS中断唤醒;

3、每100ms检测一次电平信号,MCU会每隔100ms醒来一次,进行检测,检测完成立马睡眠;、

4、检测到标志后再进行函数的执行。


TMOS下的自动sleep,如果在TMOS中断唤醒前,先由GPIO唤醒,完成gpio中断函数后,此时没到TMOS中断唤醒的时间点,系统会继续sleep吗,等待下次TMOS中断唤醒吗?

我的测试结果是不会,但是我想让他休眠


使用官方的例程如peripheral进行测试,开启HAL_SLEEP,不管是GPIO唤醒还是TMOS任务唤醒,唤醒后会执行你的任务,执行完成之后会由协议栈管理自动进入睡眠的状态。最简单的验证方法就是在CH57X_LowPower这个函数加一个打印,看看是不是一直都在打印,进入睡眠就是这个函数。

提供一个博客关于睡眠的讲解,参考一下:

CH573芯片Sleep说明(RTC程序说明) - SweetTea_lllpc - 博客园 (cnblogs.com)


只有登录才能回复,可以选择微信账号登录