Part Number:CC1310
请问CC1310 nortos裸机如何实现standby模式休眠?并可以用IO外部中断随时立刻唤醒,从唤醒后的程序点开始恢复执行(不复位)。
我已经设置了一个IO口(IOID_4)作为外部中断,如下代码:
然后按照这个链接 (www.ti.com.cn/…/swra486a.pdf) 的低功耗设置说明,试了很久都没法实现(程序如下图片),进入休眠就唤醒不了了
Galaxy Yue:
您好,进入standby
https://dev.ti.com/tirex/content/simplelink_cc13x0_sdk_2_40_00_20/docs/simplelink_mcu_sdk/Users_Guide.html#nortos-power-management
可以看一下这个
,
Galaxy Yue:
唤醒可以看一下这个
https://e2echina.ti.com/support/machine-translation/mt-sub-1-ghz/f/mt-sub-1-ghz-forum/238023/cc1310-i-o
,
zhang wei:
试了一下,我的程序里面如果只用Power_idleFunc()这个休眠函数,是可以用IO外部中断唤醒的,但是我们想要实现的应用的是(如下面代码所示):前期有一段确定的休眠时间,所以使用SDK里面的usleep函数,中期会工作一段时间,而后期的休眠时间不确定,由外部中断什么时候来决定,所以使用Power_idleFunc()函数,然后测试发现这样组合用了两个休眠函数后,程序跑到后期Power_idleFunc()函数那里就无法唤醒了,这是什么原因呢?
,
Galaxy Yue:
如果你只使用usleep(5000);可以唤醒吗?
可能是两个组合起来,对外部中断难以响应
,
zhang wei:
1、只使用usleep(5000)可以唤醒,只是usleep函数,中途唤醒的话,仍然要等待5000us超时,程序才能往下运行;
2、组合之后,外部中断难以响应的问题怎么解决?
,
Galaxy Yue:
usleep是一个阻塞函数,会阻塞当前线程的进行
建议把usleep()函数改成使用定时器
,
wei zhang:
怎么样改?
,
Galaxy Yue:
不用usleep 改用定时器
,
wei zhang:
standby休眠就只用Power_idleFunc()函数吗,然后用定时器唤醒?Power_idleFunc休眠的电流是否与usleep休眠的电流是一样的呢?
,
Galaxy Yue:
1.
wei zhang 说:standby休眠就只用Power_idleFunc()函数吗,然后用定时器唤醒
用定时器实现类似usleep的功能,这个我再想一下
2.
电流测量需要你根据你的项目去测
nortos可以参考SDK中的例程C:\ti\simplelink_cc13x0_sdk_4_20_01_03\examples\nortos\CC1310_LAUNCHXL\drivers\pinStandby测量
它已经设置好了电源策略,会在休眠期间自动进入standby模式,测量时注意断开调试器,仅使用外部的VDD和GND供电
3.
你再调试一下程序,看看程序跑到哪一行 就停止
,
wei zhang:
好的,麻烦帮忙看看定时器怎么样实现usleep,我们的产品对功耗要求比较高,还有一个问题就是Power_idleFunc()是进入idle模式还是standby模式呢,如果开了射频后调用Power_idleFunc(),是不是直接跳过不进入休眠了?
,
Galaxy Yue:
Power_idleFunc()函数描述:
要添加到应用程序空闲循环的电源功能。
应将此函数添加到应用程序空闲循环中。 (执行此操作的方法取决于所使用的操作系统。)此函数将在适当的时候调用配置的电源策略函数。 要调用的特定策略函数在应用程序定义的 Power 配置对象中配置为“policyFxn”。
进入idle模式还是standby模式应该和您使用的电源方式有关
,
wei zhang:
我现在板卡上的CC1310是1.8V供电,LDO模式
,
Galaxy Yue:
前期使用看门狗会比较符合你们的前期需求吗?
,
wei zhang:
进入休眠后,让看门狗超时复位一下?
,
Galaxy Yue:
Power_idleFunc()是进入idle模式
前期这个处理我再想一下
,
Galaxy Yue:
明确一下你们的流程
前期:由正常工作状态进入休眠状态 (确定的休眠时间)
中期:由休眠状态唤醒然后工作一段时间
后期:再进入休眠是可以用IO外部中断唤醒的(休眠时间不确定)
是这样吗
,
wei zhang:
是的,就是这样的流程
,
Galaxy Yue:
前期可以考虑
1.task_sleep() 是让当前任务停止,并未进入低功耗
task_sleep(n)可以让当前task处于block状态,然后在设定的n时间后,该task变为ready状态。
当所有user task都处于blocking状态时,系统就进入休眠状态。当有task处于ready状态时,系统就退出休眠,继续执行
2.Power_setConstraint和Power_releaseConstraint 不过是在rtos中的
https://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/tirtos/2_14_03_28/exports/tirtos_full_2_14_03_28/docs/doxygen/html/_power_8h.html
提供思路,具体实现还是看你的项目
,
wei zhang:
哦哦,好的,上面的第2点是什么意思?
,
Galaxy Yue:
是两个api 不过是在ti-rtos系统中的api
,
wei zhang:
今天下午试了一下,下面这样的代码操作,也能满足我们的那个流程要求,你看看这样操作有没有什么问题?
,
Galaxy Yue:
这个只有函数调用,看不出来更多信息,您可以运行尝试一下。符合您的流程能正常休眠然后工作就可以
,
wei zhang:
我想问一下Power_idleFunc()进入休眠,可以用普通的定时器唤醒吗
,
Galaxy Yue:
可以的