退出深度睡眠时延迟的频率计算不正确?

公告

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

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

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

我有一个基于 CM4 上运行的 CY8C6137BZI-F14 的自定义 BSP(我们没有对 CM0 做任何事情)。 在这个项目中,CLK_FAST 初始化为 8 MHz,CLK_HF0 为 96 MHz,源自 FLL(也是 96 MHz),后者来自 16 MHz 的 ECO。 我们确实在 8 MHz/24 MHz /48 MHz 之间更改了快速时钟,这样做后会对 cy_syslib_setWaitStates () 和 SystemCoreClockUpdate () 进行适当的调用。 我们的项目使用 FreeRTOS,在 vApplicationSleep () 中,在我们通过 cy_syspm_cpuenterDeepSleep (CY_SYSPM_WAIT_FOR_INTRUPT) 进入深度睡眠之前,我们会禁用 LVD。 退出深度睡眠后,我们重新启用 LVD。 根据英飞凌PDL手册和TRM,它必须有20uS的最小延迟,以避免误中断(从经验中吸取教训)。 在我们的开发中,20 u似乎还不够,因此最终将其增加到35个。

我刚刚从 Deep Sleep 中出来后又遇到了虚假 LVD 跳闸的问题,所以我又在研究这个问题。 只有在未连接调试器时才会出现此问题(通常在优化级别设置为-O1 的情况下运行自定义配置)。 我已经将延迟增加到 50uS 但仍然可以重置。 为了弄清楚原因,我在 cy_syslib_Delayus (50) 之前添加了一个 GPIO 低位切换,之后又返回 GPIO 的高位。 令我惊讶的是,延迟只需要24U! 我尝试将延迟增加到 75 uS,但在我的逻辑分析仪上,它需要 32.5 uS! 在再次仔细研究手册之后,我没有想出任何理由,我尝试将 PSoC SystemCoreClock 变量设置为不稳定,行为没有变化。 出于好奇,我在退出 Deep Sleep 后立即调用了 systemCoreClockUpdate (),所以在启用 LVD 并调用 cy_syslib_Delayus () 之前。 看哪,现在的延迟是应有的样子!

 

我一直在社区中四处闲逛,但没有找到其他人遇到这个问题的任何直接例子。https://community.infineon.com/t5/PSoC-6/Frequency-Calculation-bug-when-using-ExtClk-but-ok-with-IMO...看起来很相似,但不完全一样。 某处有没有说退出 Deep Sleep 时应该调用 SystemCoreClockUpdate ()? cy_syspm_cpuenterDeepSleep () 的手册指出,"此函数在进入系统深度睡眠之前立即更改慢速和快速时钟分频器,并在唤醒后恢复这些分频器,"以便时钟恢复到我们预期的状态,但是是否可能存在未重新计算系统延迟函数中使用的变量的错误?

干杯

0 点赞
1 解答
Translation_Bot
Community Manager
Community Manager
Community Manager

我会自己解决的问题,它和 https://community.infineon.com/t5/PSoC-6/PSoC62-Wrong-delay-in-CM4-with-Cy-SysLib-Delay-if-ECO-used/... 一样-我们仍在使用 Modus 2.4,在我手动添加并调用 ecosetFrequency () 函数之后,现在我的延迟按预期工作了。

在原帖中查看解决方案

0 点赞
2 回复数
Translation_Bot
Community Manager
Community Manager
Community Manager

编辑:在玩了更多游戏之后,在将调用添加到 SystemCoreClockUpdate () 之后,我再也看不到同样的 “积极” 结果了。 我把这个例行程序定为在我们的系统上消耗28U。 使用 SystemCoreClockUpdate () 之后的跟踪输出,在启用 LVD 中断之前使用 cy_syslib_Delayus (75),我仍然看到预期延迟时间约为一半,本应为 75uS 时为 32.5uS,我的 CLK_FAST 设置为 24MHz。

如果我将 CLK_FAST 更改为以 8 MHz 运行,则延迟需要 92uS。 如果我将 CLK_FAST 更改为以 48MHz 运行,则延迟需要 17uS。

所以,我的问题仍然存在,从 Deep Sleep 回来后调用 cy_syslib_delayus (x) 会产生与美国应有的系统延迟不符。 连接调试器时不会发生这种情况。 我甚至尝试将 systemCoreClock 变量更改为易失性然后用它来计算周期数而不是依赖 delayUS () 函数,还在调用延迟之前调用 systemCoreClockUpdate () 但我仍然获得 19U 而不是所需的 50U:systemCoreClockUpdate () cy_lvd_disab
le ();cy_lvd_clearInterructMask ();cy_lvclockUpdate () d_setThreshold (CY_LVD_TH

RESHOLD_2_7_V);cy_lvd_setInterruptConfig (CY_LVD_INTR_FALLING);cy_lvd_enable ();



volatile uint32_t 延迟;延
迟 = systemCoreClock * .000050;
portsetPinValue(TEST_WAKEUP_PORT、TEST_WAKEUP_PIN、pv_port_LOW);//将 GPIO 引脚切换到低位 cy_syslib_DelayCycles(延迟);//将 GPIO 引脚切换到高位

//Pin LOW 到 Pin HIGH 需要 19uS,内核时钟为 24MHz。

0 点赞
Translation_Bot
Community Manager
Community Manager
Community Manager

我会自己解决的问题,它和 https://community.infineon.com/t5/PSoC-6/PSoC62-Wrong-delay-in-CM4-with-Cy-SysLib-Delay-if-ECO-used/... 一样-我们仍在使用 Modus 2.4,在我手动添加并调用 ecosetFrequency () 函数之后,现在我的延迟按预期工作了。

0 点赞