我参照例程“CE210291_CapSense_P4_One_Button01”写了一个CapSense按键相关的定时休眠唤醒程序,在CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit上,调试可以正常工作,烧录无法正常工作。能帮看一下吗?
另外,这个CapSense按键状态切换有点慢,有什么改进的地方?
多谢!
已解决! 转到解答。
- 标记:
- psoc 6 ble
你看到的现象并不是真正的原因,我可以确认M0+ 是否进入深睡眠不会影响 M4核执行 CapSense 和 LED 操作。
比如用你的工程(使能 M0+核深睡眠),把 compile 模式从 DEBUG 改为 RELEASE, 或者使用 MDK 编译器(DEBUG 和RELEASE 都可以),你会发现触摸时可以工作的。再比如说 main_cm4.c 中的打印信息稍微改一下(如下代码),触摸也可以回复正常。
capSenseApiResult = CapSense_Start();
if (capSenseApiResult== CY_RET_SUCCESS)
{
DEBUG_PRINTF("CAPSENSE INIT PASS\r\n");
}
else
{
DEBUG_PRINTF("CAPSENSE INIT FAIL\r\n");
}
while(1)
我解释不了这个现象,可能是你当前的代码在编译过程中正好触发了 gcc 编译器的某个 bug,导致代码没有正常执行,因为用你的原始工程(使能 M0+核深睡眠),我在 while(1) 循环里闪灯,我发现灯根本就不闪动,也就是 while(1)主循环根本就没执行。
就是单烧录的模式,没法正常工作。调试可以
把M0+的Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);注释掉,就能正常工作。
我现在的工程全部在M4+上运行。M0+不能进入DeepSleep吗?
M0+ 是否进入深睡眠不会影响 M4核执行 CapSense 和 LED 操作。使用的的附件工程,即使我屏蔽掉 main_cm0.c 中的 Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);, 代码也是不能执行的。 你的附件工程之所以不能运行,是因为 main_cm4.c ->line 206 用错了代码,这个位置应该使用 Cy_SysPm_Sleep(CY_SYSPM_WAIT_FOR_INTERRUPT); 这样在按键扫描完毕之后 CPU 可以马上唤醒执行后续的操作,如果在此处让 CPU 进入深睡眠的话,那就只能等到下一个 WDT 来唤醒了,而且在按键扫描的过程中让芯片进入 deepsleep 也会影响到按键的正常扫描,所以不得按键不能触发。
至于反应速度慢的问题,因为按键的 debounce 已经设置成了1,所以这里没有优化空间了,只能通过减小 WDT 的唤醒间隔以及减少 rawcount filter 的使用来提升反应速率。我尝试了一下吧 WDT Counter1 的 match 数值从 8000 改成 3200, 按键的反应速度马上有了明显的提升。
1、设备一秒唤醒一次,检测触摸按键有无按下,有就切换对应的LED灯状态,无则进入休眠的逻辑是可行的,但是仅用于 demo, 如果做产品的话,需要考虑慢扫描和快扫描混合的方式来保证待机状态下的低功耗和正常操作时的快速反应,主要是动态调整 WDT 的 match 值来调整芯片唤醒频率,待机状态下采用慢速扫描,检测到有 sensor 触发则切换到快速扫描,几秒钟无按键按下的话再切换会慢速扫描.
2、触摸按键的触摸时长判断,有什么好的方法吗?
我一般使用计数器来记录按键触发了多少个扫描周期来判定触摸时间。如果对其要求精准对较高,也可以使用 timer 做定时。
3、触摸按键可以实现休眠唤醒吗?
不可以
你看到的现象并不是真正的原因,我可以确认M0+ 是否进入深睡眠不会影响 M4核执行 CapSense 和 LED 操作。
比如用你的工程(使能 M0+核深睡眠),把 compile 模式从 DEBUG 改为 RELEASE, 或者使用 MDK 编译器(DEBUG 和RELEASE 都可以),你会发现触摸时可以工作的。再比如说 main_cm4.c 中的打印信息稍微改一下(如下代码),触摸也可以回复正常。
capSenseApiResult = CapSense_Start();
if (capSenseApiResult== CY_RET_SUCCESS)
{
DEBUG_PRINTF("CAPSENSE INIT PASS\r\n");
}
else
{
DEBUG_PRINTF("CAPSENSE INIT FAIL\r\n");
}
while(1)
我解释不了这个现象,可能是你当前的代码在编译过程中正好触发了 gcc 编译器的某个 bug,导致代码没有正常执行,因为用你的原始工程(使能 M0+核深睡眠),我在 while(1) 循环里闪灯,我发现灯根本就不闪动,也就是 while(1)主循环根本就没执行。
我参照例程“CE210291_CapSense_P4_One_Button01”写了一个CapSense按键相关的定时休眠唤醒程序,在CY8CKIT-062-BLE PSoC 6 BLE Pioneer Kit上,调试可以正常工作,烧录无法正常工作。能帮看一下吗?
Answer:
Source Reason: 问题的根本出在你用的Deepsleep的函数: Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
另外,你的代码是正常跑起来了,我在你的代码里面加了调试信息。
结论: 屏蔽了deepsleep函数之后,代码可以正常工作了。我在附件中加载了测试工程。
附加: 不清楚你的具体设计逻辑,目前我的代码里面没有启用deepsleep函数。
另外,这个CapSense按键状态切换有点慢,有什么改进的地方?
Answer: CE210291_CapSense_P4_One_Button01 这个code example里面用的 CySysPmSleep();的函数,到P6的代码里面你改成了DeepSleep。 在你的这个代码里面DeepSleep只能被WDT唤醒,你的唤醒周期最小1.09s,请check这一点。
补充一点: PSoC6 里面能把芯片从Deep Sleep唤醒的有下面几种中断:
GPIO interrupt, lowpower comparator,SCB, CTBm,watchdog timer, and RTC alarms
希望我的回复能给你提供一些帮助。
感谢解答,我还有一些疑问:
1、我的设计逻辑是:设备一秒唤醒一次,检测触摸按键有无按下,有就切换对应的LED灯状态,无则进入休眠,可行吗?
2、触摸按键的触摸时长判断,有什么好的方法吗?
3、触摸按键可以实现休眠唤醒吗?