DA1468X延长睡眠呼吸定时器和LED

⚠️
大家好. .谢谢你来参加论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台,它将提供更好的功能,并包含在Dialog主网站中。所有的帖子和账户都已迁移。我们现在只接受新论坛的流量-请张贴任何新的线程//www.wsdof.com/support.我们将在未来几天修复漏洞/优化搜索和标签。
17个帖子/ 0个新
最后发表
bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
DA1468X延长睡眠呼吸定时器和LED

你好

由于free_rtos的空闲任务,我愿意让我的设备进入延长睡眠状态。到目前为止,我面临着一些问题。

我的代码是基于Dialog的示例代码。系统启动,freertos启动,任务加载正常。

我在主任务中运行了一个循环,其中我闪烁一个指示灯来检查系统是否活着,并执行1秒的睡眠。

我可以跟踪系统,直到WFI被正确执行。此时,呼吸计时器被关闭并关闭。

在WFI出口,呼吸计时器没有唤醒。

目前breath_config breath_cfg, hw_led_set_ledX_src(…),hw_breath_init(&breath_cfg);和hw_breath_enable ();都位于prvSetupHardware中。如果我把这些放在外围init中,即使在活动或空闲模式下,也没有led灯亮起。

你能向我确认吗

呼吸计时器的初始化顺序是什么?

-呼吸计时器寄存器在睡眠时被保留?

呼吸计时器的状态和依赖是由当前固件管理的?

调试这种情况的步骤是什么?

先谢谢你

致以最亲切的问候

关键词:
设备:
PW_Dialog
离线
最后看到:2个月前3个星期前
工作人员
加入:2019-04-03 02:54
你好,

你好,

请问你的代码是基于哪些样例代码,你做了哪些修改?您正在实现的功能是为外部LED制作自动呼吸功能吗?

对于LED的呼吸功能,下面的代码显示了一个例子:

Breath_config config = {
.dc_min = dc_min,
.dc_max = dc_max,
.dc_step = dc_step,
.freq_div = freq_div,
.极性= HW_BREATH_PWM_POL_POS
};

/*
*设置呼吸计时器配置,因此硬件可以自动驱动LED。
* /
hw_breath_init(配置);

/*
*设置LED1输出由定时器驱动。
* /
hw_led_set_led1_src (HW_LED_SRC1_BREATH);
hw_led_enable_led1(真正的);

/*
*然后启动呼吸计时器。
* /
hw_breath_enable ();

更多细节可以在SDK的peripherals_demo中找到。

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你好

你好

我的代码是基于freertos_retarget源代码。

我用的正是你给我的

prvsetuhardware (void)

//激活中断

....

Breath_config breath_cfg = {

.dc_min = 9, //光功率- 1
.dc_max = 10, //光功率设置为10/255
.dc_step = 255,
.freq_div = 255,
.极性= HW_BREATH_PWM_POL_POS
};

/*初始化硬件(OTPC, Cache, ADC, DCDC, USB pad, RF,适配器,总线,设备,看门狗)*/
pm_system_init (periph_init);

// Init中断控制器
hw_wkup_init (&wkup_cfg);

//配置LED1,红色
hw_led_set_led1_src (HW_LED_SRC1_BREATH);
hw_led_enable_led1(假);
//配置LED2,绿色
hw_led_set_led2_src (HW_LED_SRC2_BREATH);
hw_led_enable_led2(真正的);
//配置LED3,蓝色
hw_led_set_led3_src (HW_LED_SRC3_BREATH);
hw_led_enable_led3(假);
//配置RGB Led所需的呼吸定时器
hw_breath_init (&breath_cfg);
hw_breath_enable ();

如果我确实把前面的代码放在了外围初始化中,就没有发光二极管亮起。

醒来后,从延长睡眠牵头停留。

先谢谢你

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
这似乎比麻烦更深

这似乎比LED更麻烦。

睡眠前:WFI后0x50000066=0x3, pm_system_wake_up后0x50000066=0x2。

数据表指出安全引导(我正在测试生产模式,看门狗正在使用,但还没有安全引导)。

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
新增提示0x500030D0=0 before

其他提示睡觉前0x500030D0=0,睡觉后0x500030D0=1。醒来后,这一功能似乎无法正常恢复。

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
下一个提示是0x50000022 =

下一步提示是:睡觉前0x50000022 = 0x54B7,睡觉后0x54B6。RC16在延长睡眠期间停止,在延长睡眠后不再启动。依靠它的DCDC在行动中被杀死。(睡眠后0x5000002A = 0x20D2: 1V8和1V8P down)

我尝试将系统置于dg_configUSE_DCDC = 0中以停止使用DCDC。

因此,在睡眠前后0x50000022 = 0xE7D3。我睡觉后再也不会崩溃了。

但是我还是没有LED

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
新的提示。呼吸计时器

新的提示。LED_CONTROL_REG正在被sys_tcs擦除。如果在外围init中设置了我的led源,它们将在引导和唤醒时被sys_tcs擦除。

我没有使用OTP,为什么这个寄存器是sys_tcs在这2个时刻设置的唯一寄存器?

在UM-B-044的附录H中,似乎在生产过程中使用了LED_CONTROL_REG。

你能检查一下在DA14683上运行的freertos_retarget示例代码吗?

到目前为止我还不能使用睡眠模式。能源对我的产品至关重要。

谢谢你!

PM_Dialog
离线
最后看到:6天14小时前
工作人员
加入:2018-02-08 11:03
嗨,鲍勃,

嗨,鲍勃,

你能试着在使用睡眠模式的SDK的BLE例子中实现它吗?如何测试设备无法休眠?另外,你在外围init中的配置是什么?

谢谢,PM_Dialog

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你好

你好

我还没有时间在我的原型上使用ble。BSP现在非常大,所以这个集成已经被移走了,因为蓝牙不在我们的最小可行产品中。

外围init目前只有GPIO IN/OUT配置,GPIO高/低的一些OUT在执行期间是固定的,现在呼吸计时器init。

我设法延长了睡眠时间:

-通过禁用DCDC

你能向我确认为什么RC16在睡眠时停止,而不是重新启动吗?

—从电源管理中移除sys_tcs。

——>你能向我确认如何让它停止从OTP重新加载LED_CONTROL_REG与重置值(0x80)吗?(DA14683在自定义板上,OTP从未使用)

-通过移动呼气定时器init / config在外围init

->个LED在睡眠时关闭。因此,我只能在执行期间使用LED。

-通过在主任务中使用一个简单的循环

如果我加载比主循环更多的代码,我就会得到各种崩溃/麻烦:

—如果使用hw_i2c

——>硬故障。(我需要移动到ad_i2c,让它在唤醒后重新加载控制器状态)。

-如果UART在CPU即将休眠或正在休眠时接收数据(我认为外部调制解调器发送时钟更新)

——UART中断处理程序中的>中断位于case HW_UART_INT_BUSY_DETECTED中。我可以在代码中看到与RBR_THR_DLL相关的注释。如果你有什么想法,我很乐意。

- UART错过了一些与外部调制解调器的通信,所以我的应用程序不能正常运行。

——>我确实需要硬件流控制在这里,但我的硬件是不行的。如果您有在UART上使用硬件流控制的异步通信的参考实现,我会很高兴。我目前轮询ad_uart_read线程等待数据时,与外部调制解调器通信,但它似乎错过了一些字节。

睡眠功能可能还会带来更多麻烦。到目前为止,我还不能可靠地使用它。

先谢谢你

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你好

你好

我将代码从hw_i2c移动到ad_i2c。我这边没什么问题了。

在UART方面,

-我禁用了在睡眠期间为我的外部调制解调器服务的电平转换,所以我在睡眠期间没有消息进来。这不会改变任何事情。

-我使用JTAG探针来检查该中断的上下文。似乎这个问题与uart控制台有关,因为我的代码不使用异步通信,所以在我用来与外部调制解调器通信的uart上没有生成IRQ。我得到的唯一IRQ来自控制台服务。

你能谈谈以下问题吗?

-唤醒后RC16 / DCDC关闭

—sys_tcs在未使用OTP时从OTP重新加载值

-控制台服务中断结束于__BRK

先谢谢你

PM_Dialog
离线
最后看到:6天14小时前
工作人员
加入:2018-02-08 11:03
嗨,鲍勃,

嗨,鲍勃,

对不起,我有点糊涂了。我强烈建议你不要修改SDK文件。hw_i2c是LLD (Low Level Driver), ad_i2c是I2C的适配器。我强烈建议使用适配器来访问硬件外设,因为不仅提供对外设的访问,而且还确保当前正在访问它的其他任务暂停其操作,直到外设再次释放。因此,如果另一个任务同时尝试访问同一外围设备,您不必担心。此外,在睡眠模式下,所有外围模块都是关闭的。

谢谢,PM_Dialog

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你能说一下吗

你好

你能看一下下面这些吗?

1.控制台服务生成以__BRK结尾的uart中断。一旦我启动延长睡眠,这个问题就会发生。

Hardfault分析:

—LR指向UART_Interrupt_Handler(HW_UART1),用于控制台服务。

- PC指向CONFIG_UART_IGNORE_BUSY_DETECT case中的void UART_Interrupt_Handler(HW_UART_ID uart)

我尝试为uart使用无dma配置。没有变化。

2.sys_tcs在未使用OTP时从OTP重新加载值。为了避免修改BSP文件,需要解决此问题。

-见我之前的分析。我可以计算出使用JTAG探针LED_CONTROL_REG是唯一的寄存器由sys_tcs_apply(tcs_system)重新加载;功能。重新加载的值是0x80。它清楚地保留了我的led的状态。

3.唤醒后RC16 / DCDC关闭。在启用DCDC并使用延长睡眠之前,ldo可以完成这项工作。

在这里,我只看到睡觉前/睡觉后RC16位变成零,永远不会回到1。在DS v3.1规范第6章中,DCDC依赖于RC16,所以它不能在唤醒后存活。

先谢谢你

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你好

你好

新的硬错误:在睡眠发生后,我在ad_gpadc_read()中获得了一个新的错误。我检查了GPADC寄存器,它们处于重置状态。

你能否证实

所有的适配器都在休眠模式后测试过了?

-我可以在构造器中有适配器“打开”功能?

-在正常操作期间,我不需要再次调用“open”。(包括起床后)?

先谢谢你

PM_Dialog
离线
最后看到:6天14小时前
工作人员
加入:2018-02-08 11:03
嗨,鲍勃,

嗨,鲍勃,

我对你所做的改变感到困惑。

  1. SDK文件,如适配器和LLD驱动程序不能修改。
  2. 所有的适配器都经过了测试
  3. 在使用适配器之前,您应该初始化并关闭它们。
  4. 对于WDOD,您应该调试程序并找到代码卡住的地方。
  5. 在主动模式下,系统将以16MHz时钟运行。在睡眠模式下,它以32KHz时钟运行。

我的建议是阅读UM-B-044: DA1468x软件平台参考而且UM-B-056: DA1468x软件开发人员指南以便理解SDK架构。您也可以在DA1468x支持门户的“教程”部分中找到“适配器”示例。

谢谢,PM_Dialog

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你好

你好

你可以启动freertos_retaget,点亮一个led并激活DA14683上的extended_sleep(与printf/控制台重定向到uart, dcdc和dma启用)?

- LED_CONTROL_REG在睡觉前的值是多少?后吗?

- RC16睡前使能位是多少?后吗?疾控中心还活着吗?

谢谢你的建议,阅读手册,但它看起来像漏洞在SDK,我会很高兴,你检查它在你的一方。我从单板支持包中得到了硬故障。

谢谢你!

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你好

你好

好消息。我终于设法让睡眠功能正常工作,没有崩溃。

在保留LDO时,由于电源故障,我正在击中3.3V的BOD。

事情是OK后,激活Flash 1V8开关关闭功能,从而卸载3V3 RET LDO。

坏消息n°1。几分钟后系统停止休眠。还没有发现故障。

坏消息n°2。如果我启用外部外设,我仍然会达到3V3的BOD。

你知道3.3V RET LDO在长时间睡眠时的功率预算是多少吗(请不要回答10mA,因为上面有很多东西)?

我在1V8P上有1.2mA,在3V3上有300 μ A的理论绝对最大值,但当启用睡眠时,我确实会命中BOD,最终会启动复位。

谢谢你!

bobspam@free.fr
离线
最后看到:3个月前3个星期前
加入:2018-06-20 08:07
你好

你好

我终于设法解决了最后一个问题

-我不得不手动驱动开关到extended_sleep的时刻,我知道什么都没有发生在系统上(和控制台!)我还必须手动切换到空闲模式,以避免正常操作期间的小睡眠(比如在等待适配器事件时睡觉)。

-我必须将VBAT上的电容器提高到20 μ F,以避免3V3上的BOD(唤醒时的电流峰值,使VBAT下降)。

-我的一个外部外围设备在完全关机模式下,在1V8P上消耗高达8mA。10mA的预算不太好!我不得不在手术后重置它,使它在睡觉时消耗更少。

—未激活pm_set_wakeup_mode(true),系统未唤醒休眠任务。如果没有它,我就会在睡觉后被困在一个稳定的系统中,但什么都不做。

在旅程的最后,睡眠模式似乎起作用了,但是

-我不再从电源管理器重新加载OTP值,因为sys_tcs_apply(tcs_system)在执行外围init后重新加载LED_CONTROL_REG。

我再次请求帮助,至少在OTP问题上,这样我就可以在不修改板支持包文件的情况下发布一个版本。

谢谢你!