大家好
我在做capsense在deepsleep模式扫描唤醒时发现:当capsense通道数大于等于8时,判断while(CapSense_NOT_BUSY != CapSense_IsBusy());(等待扫描完成),使用MCWDT_SetMatch(CY_MCWDT_COUNTER0,319,93)配置MCWDT后不能立即生效,当通道数小于8或者不执行while(CapSense_NOT_BUSY != CapSense_IsBusy());时可以立即生效,(用LED闪烁看效果,附件是简化扫描过程后的逻辑)。但是while(CapSense_NOT_BUSY != CapSense_IsBusy());这个判断在整个扫描过程中好像是必不可少的,我该怎么改呢?
已解决! 转到解答。
1: 从代码的整体设计,我推测你是想在M0+上面设计,这一点也基于你之前建的几个问题。
2: 请删除在M4的文件里面写中断入口函数。把中断的入口函数写在M0+的main.c里面,因为你的中断都是M0+触发的。
3: 你LED亮的时间选的是match393,也就是12.31ms,这个时间不太适合做测试。建议选择和灭的时间选用一样的match18000。
5: 你代码里面用了三个counter,需要Enable一下:
Cy_MCWDT_Enable(MCWDT_0_HW, CY_MCWDT_CTR0|CY_MCWDT_CTR1|CY_MCWDT_CTR2, \
MCWDT_0_TWO_LF_CLK_CYCLES_DELAY);
6:另外,我需要解释的是: 深度睡眠之后第一次扫描,状态位是不是会改为ON,是要根据你debounce的设计的,如果你debounce是3,那么需要连续三次扫描一个sensor是ON的状态,最终才会check到active。
7:希望我的解释可以帮助你对CYPRESS芯片的理解。
@LinglingG_46你好,我之前没有把我想表达的意思表达完整,我想做低功耗检测按键,大致过程是当没有操作n秒后进入deepsleep,同时把MCWDT周期改为500ms来唤醒deepsleep,希望在500ms内如果有手指touch按键,就把MCWDT中断周期改为10ms,但是我发现以下几个问题:
1.当按键数量>=8个,在MCWDT周期为500ms是改为10ms时,在进入第一次deepsleep时,MCWDT是以比500ms更大的周期(用你写的测试代码进行过测试)才进入中断,我把个数改为6个时(其他条件不变),MCWDT设置后可以在进入下一个deepsleep后立即生效;还有就是在不改变按键个数(依然是8个),不去判断if(CapSense_NOT_BUSY == CapSense_IsBusy())这条语句也是能立即生效的,这个和我写的代码产生的结果一样。
2.我按照例程来修改的按键处理,过程就是扫描→等待扫描完成→处理→deepsleep这个过程,我在deepsleep下以500ms唤醒去执行扫描过程,发现手指touch后唤醒的第二次才能检测到capsense是active的。这个现象和唤醒周期时间无关。我CSD setting里面的modutor clock frequency 设为最低6250,如果把这个参数提高到一定数值,那么在500ms的周期唤醒下是永远检测不到touch的。
3.扫描→等待扫描完成→处理这个过程我实测耗时大约18ms,这点是否是正常的?
以上现象就好造成当检测到capsense是active的时,还需等待一个大于500ms的时间, 影响触摸体验感,如果把周期减少,功耗就好变得很大,我该怎么处理,或者我这样的处理方式是否不合理?
以下是我更改你给的测试代码(工程见附件,也是kit-062BLE板测试):
for(;;)
{
/* CM0+ is not used after enabling CM4. CM0+ is put into Deep Sleep mode
to save power. CM0+ does not wake up from Deep Sleep mode */
// Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
if(CapSense_NOT_BUSY == CapSense_IsBusy())
{
CapSense_ProcessAllWidgets();
if(CapSense_IsAnyWidgetActive())
{
//Cy_GPIO_Inv(LED_1_PORT, LED_1_NUM);
}
else
{
}
CapSense_RunTuner();
CapSense_Sleep();
MCWDT_0_SetMatch(CY_MCWDT_COUNTER0,319,93);
//CyDelay(100);
Cy_GPIO_Clr(LED_PORT, LED_NUM);//亮
Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
Cy_GPIO_Set(LED_PORT, LED_NUM);//灭 亮灭这个过程周期应该是319,但实际是比18000还大(这点更奇怪)
MCWDT_0_SetMatch(CY_MCWDT_COUNTER0,18000,93);
Cy_SysPm_DeepSleep(CY_SYSPM_WAIT_FOR_INTERRUPT);
CapSense_Wakeup();
CapSense_ScanAllWidgets();
}
1: 第一个问题,你deepsleep的扫描周期是500ms的话,在500ms之内是检测不到手指触摸的。
2: 我一直不懂你说的不能生效是什么意思?从机器的执行上面,不存在什么不能生效这一说。
3: 你首先要保证你的触摸是在active的状态下执行的,才能被检测到。
4: 你不要把问题总是放在sensor少于8或者大于8上面。
5: GPIO在deepsleep的情况下是保留的,所以我不知道你是怎么检测18000?
6: 非常建议你一个问题一个问题的解决,你这个低功耗的demo可以参考我们PSoC4 low power的历程。
6: 请问你这个案子有没有代理商跟。
很抱歉描述不清对你造成过多的困扰。
1: 我只是想知道在做低功耗扫描按键时手指按下后第一次从deepsleep唤醒,能不能检测到手指触摸,根据我的方法是要第二次唤醒才可以,因为这涉及到我在不影响体验感的同时能做到多低的功耗。
2: 生效的意思是当我配置MCWDT后的下一个中断周期是按我刚配置好的周期参数进入中断,而实际并不是(你可以把我的附件里面的capsense使能的通道数删除2个(8-2),其他不作任何改变去看LED闪烁的效果就很明显,kit-062BLE板)。
3: 我在中断用一个LED闪烁来看是否发生了中断,手指是一直触摸的。
4: 我并没关注通道数量,我只是在找问题时做过很多测试,发现这是影响到结果的一个原因,但是我不知道为什么会影响到。
5: 18000只是测试代码的MCWDT的周期,这可以是任何数字,比如我设置中断周期是10ms,异常情况下明显大于500ms?
6: 有参考过相应例程,也做过几乎不做改动下去测试,结果是一样的。
6: 暂时没找到FAE。
1: 从代码的整体设计,我推测你是想在M0+上面设计,这一点也基于你之前建的几个问题。
2: 请删除在M4的文件里面写中断入口函数。把中断的入口函数写在M0+的main.c里面,因为你的中断都是M0+触发的。
3: 你LED亮的时间选的是match393,也就是12.31ms,这个时间不太适合做测试。建议选择和灭的时间选用一样的match18000。
5: 你代码里面用了三个counter,需要Enable一下:
Cy_MCWDT_Enable(MCWDT_0_HW, CY_MCWDT_CTR0|CY_MCWDT_CTR1|CY_MCWDT_CTR2, \
MCWDT_0_TWO_LF_CLK_CYCLES_DELAY);
6:另外,我需要解释的是: 深度睡眠之后第一次扫描,状态位是不是会改为ON,是要根据你debounce的设计的,如果你debounce是3,那么需要连续三次扫描一个sensor是ON的状态,最终才会check到active。
7:希望我的解释可以帮助你对CYPRESS芯片的理解。