公告

大中华汽车电子生态圈社区并入开发者社区- 更多资讯点击此

Tip / 登入 to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

你好

该程序可执行普通提取的所有提取功能。 它被配置为外设。 连接间隔最小/最大为 100 毫秒,从属延迟为 0。 我从传感器读取电压,将其送入板载运算放大器,然后通过 ADC 读取输出。 问题是 adc 结果不准确。 我得到的读数略高几个计数,有时还会切换。 如果我不调用该函数,读数就会准确无误,不会发生切换。

我觉得在事件之间让设备进入深度休眠状态是个问题,但我不知道如何解决。 我已经阅读了低功耗应用说明,但我对深睡眠在幕后的作用感到困惑。 GPIO 是否保留其状态? 模拟外设是否有任何改变? VREF 是否受到影响?

谢谢您的帮助。

 

void ManageLowPower(void)
{   
    CYBLE_LP_MODE_T bleMode;
    uint8 interruptStatus;
    
    if((CyBle_GetState() == CYBLE_STATE_ADVERTISING) || 
       (CyBle_GetState() == CYBLE_STATE_CONNECTED))
    {
        /* Request BLE subsystem to enter into Deep-Sleep mode between connection and advertising intervals */
        bleMode = CyBle_EnterLPM(CYBLE_BLESS_DEEPSLEEP);
        /* Disable global interrupts */
        interruptStatus = CyEnterCriticalSection();
        
        
        /* When BLE subsystem has been put into Deep-Sleep mode */
        if(bleMode == CYBLE_BLESS_DEEPSLEEP)
        {
            /* And it is still there or ECO is on */
            if((CyBle_GetBleSsState() == CYBLE_BLESS_STATE_ECO_ON) || 
               (CyBle_GetBleSsState() == CYBLE_BLESS_STATE_DEEPSLEEP))
            {
                /* Put the CPU into the Deep-Sleep mode */
                CySysPmDeepSleep();
            }
        }
        else /* When BLE subsystem has been put into Sleep mode or is active */
        {
            /* And hardware doesn't finish Tx/Rx opeation - put the CPU into Sleep mode */
            if(CyBle_GetBleSsState() != CYBLE_BLESS_STATE_EVENT_CLOSE)
            {
                CySysPmSleep();
            }
        }
        /* Enable global interrupt */
       CyExitCriticalSection(interruptStatus);
     
    }
    
    
}

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSOC-4-BLE-DeepSleep-interfering-with-analog-peripherals/td-p/736465

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

我认为 TCPWM 只能由 HFCLK 域驱动。 我还想知道是否可以绕过这个问题。 另一方面,UDB 定时器可由任何时钟或数字输入驱动。

计时器的功能是什么? 能否用低频域的 WDT 定时器来替代?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSOC-4-BLE-DeepSleep-interfering-with-analog-peripherals/m-p/740731

在原帖中查看解决方案

0 点赞
6 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

您好@shge_4395051,

在深度睡眠状态下,GPIO 将被保留。
必须禁用 TxFIFOADC 也是如此,因为 ADC 将使用 HFCLK 作为时钟源。

在调用 CySysPmDeepSleep() 之前,请使用组件的特定 API 函数 _Sleep() 来存储当前组件状态;从 DeepSleep 唤醒后,请使用 _WakeUp() 来存储当前组件状态。
例如:

... 
 ADC_Sleep();
 CySysPmDeepSleep();
 ADC_Wakeup();
...

请参阅应用说明AN86233,3.2.3 外设深度休眠配置部分(第 8 页)。

谢谢& ,问候
Andri

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSOC-4-BLE-DeepSleep-interfering-with-analog-peripherals/m-p/737432

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

感谢您的建议。 简单地将 ADC 置于休眠状态并唤醒它并不能直接解决我的问题。 我还将多路复用器置于休眠状态,这样问题就解决了。 我使用模拟多路复用器为运算放大器切换增益电阻。

我遇到的另一个与睡眠有关的问题是,从深度睡眠中醒来时,我的定时器不再触发中断。 它们由 HFCLK 驱动。 我试图将时钟源改为其他时钟源,如 32.768 LFCLK,但在编译时出现了这个错误:

Error: mpr.M0139: Invalid connection for clock input"\Timer_1min:cy_m0s8_tcpwm_1\:clock" driven from"ClockBlock:lfclk". 该组件需要时钟块提供时钟。 (App=cydsfit)

理想情况下,我希望使用外部 32.768KHz 时钟。 有什么建议吗?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSOC-4-BLE-DeepSleep-interfering-with-analog-peripherals/m-p/739757

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

我认为 TCPWM 只能由 HFCLK 域驱动。 我还想知道是否可以绕过这个问题。 另一方面,UDB 定时器可由任何时钟或数字输入驱动。

计时器的功能是什么? 能否用低频域的 WDT 定时器来替代?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSOC-4-BLE-DeepSleep-interfering-with-analog-peripherals/m-p/740731

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

您好@shge_4395051,

正如@odissey1所说,TCPWM 将使用 HFCLK 作为源,而由于 HFLCK 在深度睡眠模式下将被禁用,因此您无法使用 TCPWM 作为触发唤醒的计时器。

您可以将 WDT 用作定时器,而不是使用 TCPWM,因为 WDT 将使用 LFCKL 作为时钟源。

谢谢& ,问候
Andri

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSOC-4-BLE-DeepSleep-interfering-with-analog-peripherals/m-p/740888

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

这些定时器用于更新电池监控和报告,以及了解何时因不使用而断开连接。 一个是 4 秒计时器,另一个是一分钟计时器。 我将研究使用带有 WDT 时钟源的 UDB 定时器。

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/PSOC-4-BLE-DeepSleep-interfering-with-analog-peripherals/m-p/741843

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager
100 likes received

因此,我花了两周时间尝试实现 WDT 定时器,以便在两分钟内未建立连接时执行断电操作,以及在一分钟后传感器读数未发生变化时断开连接。 我已经让它正常工作了,但并不是没有神秘错误导致过早断开连接。 我实在想不通。 我已经要求应用程序开发人员在一分钟没有活动后从中央端断开连接。 这就解决了问题。 我真希望能从 FW 做到这一点。 我觉得我对这个产品没有太多的控制权。 我查阅了有关 WDT 的示例程序和文献。 充其量只是模棱两可。 每个示例程序所做的事情都不尽相同,要了解使用哪些 API 命令简直是个谜。

0 点赞