DA1468X扩展睡眠呼吸定时器和LED

了解更多常见问题教程

17个员额/0个新员额
最后一篇文章
bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
DA1468X扩展睡眠呼吸定时器和LED

你好

由于free_rtos的空闲任务,我愿意将我的设备延长睡眠时间。到目前为止,我面临一些问题。

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

我正在主任务中运行一个循环,我会闪烁一个led,以检查系统是否处于活动状态,并执行1秒睡眠。

我可以跟踪系统,直到WFI被正确执行。在那个时候,呼吸计时器被关闭和关机。

在WFI退出时,呼吸计时器不会唤醒。

当前呼吸配置呼吸cfg、hw\U led设置呼吸src(…)、hw\U呼吸初始化(&breath\U cfg);和hw_呼吸_启用();都位于prvSetupHardware中。如果我将其中任何一个置于periph_init,即使在活动或空闲模式下,led也不会亮起。

你能向我确认一下吗

-呼吸计时器的初始序列是什么?

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

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

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

先谢谢你

致以最亲切的问候

关键词:
设备:
PW_Dialog
离线
最后一次见到:23小时25分钟前
工作人员
加入:2019-04-03 02:54
你好,

你好,

我可以知道您的代码基于哪个示例代码吗?您的修改是什么?您正在实现的功能是为外部LED制作自动呼吸功能吗?

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

呼吸配置={
.dc_min=dc_min,
.dc_max = dc_max,
.dc\u步长=dc\u步长,
.freq_div = freq_div,
.极性=HW_呼吸_PWM_极性_位置
};

/*
*设置呼吸定时器配置,使硬件可以自动驱动LED。
*/
hw_呼吸_初始化(&config);

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

/*
*然后启动呼吸计时器。
*/
hw_呼吸_启用();

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

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你好

你好

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

我用的正是你给我的

静态孔隙prvSetupHardware(空白)
{
//激活中断

....

breath_cfg = {

.dc_min=9,//光功率-1
.dc_max=10,//灯光功率设置为10/255
.dc_步长=255,
.freq_div = 255,
.极性=HW_呼吸_PWM_极性_位置
};

/*初始化硬件(OTPC, Cache, ADC, DCDC, USB Pads, RF,适配器,总线,设备,watchdog) */
pm_系统初始化(外围初始化);

//初始化中断控制器
hw_wkup_init(&wkup_cfg);

//配置LED1,红色
hw_led_set_led1_src(hw_led_SRC1_呼吸);
hw_led_enable_led 1(假);
// configure LED2,绿色
hw_led_set_led2_src(hw_led_SRC2_呼吸);
hw_led_enable_led 2(真);
//配置LED3,蓝色
hw_led_set_led3_src (HW_LED_SRC3_BREATH);
硬件发光二极管启用发光二极管3(假);
//配置RGB Led所需的呼吸计时器
hw_breath_init (&breath_cfg);
hw_呼吸_启用();

}

如果我将前面的代码放在periph_init中,则没有led亮起。

从extended_sleep唤醒后保持off。

先谢谢你

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
这似乎比我们想象的更麻烦

这似乎比LED更麻烦。

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

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

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
之前的新提示0x500030D0=0

其他提示睡眠前0x500030D0=0,睡眠后0x500030D0=1。唤醒后此功能似乎未正确恢复。

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
下一个提示是0x50000022=

下一个提示是0x50000022=0x54B7在睡眠前,0x54B6在睡眠后。RC16在延长睡眠期间停止,之后不再启动。依赖它的DCDC在操作期间被终止。(0x5000002A=0x20D2在睡眠后:1V8和1V8P关闭)

我尝试将系统放入dg_configUSE_DCDC = 0以停止使用DCDC。

因此,睡眠前后0x50000022=0xE7D3。我睡觉后再也没有撞车了。

但我仍然没有LED

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
新提示。呼吸计时器

新的提示。sys_tcs正在删除LED_CONTROL_REG。如果确实在peripe_init中设置了led源,那么sys_tcs将在引导和唤醒时擦除它们。

我没有使用OTP,为什么在这两个时刻只有这个寄存器由sys_tcs设置?

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

您能在DA14683上运行的freertos_重定目标示例代码上检查一下吗?

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

谢谢你!

PM_对话框
离线
最后一次见到:14小时50分钟前
工作人员
加入:2018-02-08 11:03
嗨,鲍勃,

嗨,鲍勃,

您能否尝试在使用睡眠模式的SDK的任何示例中实现它?您如何测试设备无法睡眠?另外,您在periph_init中的配置是什么?

谢谢,下午好

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你好

你好

我还没来得及在我的原型中使用ble。BSP现在相当大,所以这种集成已经被移除,因为蓝牙不在我们的最低可行产品中。

periph_init当前只有GPIOs输入/输出配置,某些输出的GPIO高/低在执行期间是固定的,现在是呼吸计时器初始化。

我设法在工作中获得了长时间睡眠:

-通过禁用DCDC

-->你能向我确认一下为什么RC16在睡眠期间停止而没有重新启动吗?

—从电源管理中移除sys_tcs。

-->您能否向我确认如何使用重置值(0x80)停止从OTP重新加载LED_CONTROL_REG?(自定义板上的DA14683,OTP从未使用)

-通过在periph_init中移动呼吸计时器init/config

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

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

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

-如果我使用硬件i2c

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

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

-->在检测到HW_UART_INT_BUSY_的情况下,中断UART中断处理程序。我可以在代码中看到与RBR_THR_DLL相关的注释。如果您对此有任何想法,我将很高兴。

-UART错过了与外部调制解调器的一些通信,因此我的应用程序无法正常运行。

-->我确实需要硬件流控制,但我的硬件不适合。如果您有一个异步通信的参考实现,使用UART上的硬件流控制,我会很高兴。我目前正在轮询ad_UART_读取线程,以便在与外部调制解调器通信时等待数据,但它似乎遗漏了一些字节。

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

先谢谢你

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你好

你好

我将代码从hw_i2c移动到ad_i2c。我在这方面没有更多的问题。

在UART方面,

-我在睡眠期间禁用了为外部调制解调器服务的电平移位器,因此在睡眠期间没有消息传入。这不会改变任何事情。

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

你能告诉我以下地址吗?

- RC16 / DCDC唤醒后关闭

- sys_tcs在不使用OTP的情况下从OTP重新加载值

—话务台业务中断,以__BRK结束

先谢谢你

PM_对话框
离线
最后一次见到:14小时50分钟前
工作人员
加入:2018-02-08 11:03
嗨,鲍勃,

嗨,鲍勃,

抱歉,我有点困惑。我强烈建议您不要修改SDK文件。hw_i2c是低级驱动程序(LLD)ad_i2c是i2c的适配器。我强烈建议使用适配器e建议使用适配器访问硬件外围设备,因为不仅提供对外围设备的访问,而且确保当前正在访问外围设备的其他任务暂停其操作,直到外围设备再次释放因此,如果另一个任务同时尝试访问同一个外设,您不必担心。此外,在睡眠模式下,所有外设块都会断电。

谢谢,下午好

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你能告诉我地址吗

你好

你能看一下下面的吗?

1.控制台服务产生以__BRK结束的uart中断。一旦我激活了延长睡眠,这个问题就会发生。

硬故障分析:

-LR指向用于控制台服务的UART\U中断处理程序(HW\U UART1)。

-PC指向配置\u UART\u忽略\u忙\u无效UART\u中断\u处理程序(HW\u UART\u ID UART)中的检测案例

我尝试使用没有直接存储器存取配置为uart。没有变化。

2.sys_tcs在没有使用OTP的情况下从OTP重新加载值。解决这个问题,避免修改BSP文件。

-见我之前的分析。我可以用一个JTAG探测器判断出LED_CONTROL_REG是sys_tcs_apply(tcs_系统)重新加载的唯一寄存器;功能。重新加载的值为0x80。它清除了我的LED的保留状态。

3.RC16/DCDC在唤醒后关闭。LDO可以执行此项工作,直到启用DCDC后可以使用延长睡眠。

在这里,我只看到在睡眠之前/之后,RC16位变为零,并且永远不会变回1。在DS v3.1规范第6章中,DCDC依赖于RC16,因此它在唤醒后无法激活。

先谢谢你

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你好

你好

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

你能否证实

-睡眠模式后是否测试了所有适配器?

-我可以在构造函数中使用适配器“open”函数吗?

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

先谢谢你

PM_对话框
离线
最后一次见到:14小时50分钟前
工作人员
加入: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支持门户的“教程”一节中找到“适配器”示例。

谢谢,下午好

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你好

你好

你能在DA14683上启动freertos_retaget,点亮led并激活extended_sleep吗(printf/console重定向到uart, dcdc和dma启用)?

-睡眠前LED_CONTROL_REG的值是多少?之后

-睡眠前RC16启用位的值是多少?之后DCDC还活着吗?

谢谢你阅读手册的建议,但看起来SDK中有bug,我很高兴你在你这边检查一下。我从董事会的支持包中得到了严重的错误。

谢谢你!

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你好

你好

好消息。我终于设法让睡眠功能没有崩溃。

由于在保留LDO上发生电源故障,我的BOD达到了3.3V。

激活Flash 1V8关闭功能后,一切正常,从而卸载3V3 RET LDO。

坏消息n°1。系统在几分钟后停止睡眠。尚未发现故障。

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

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

我在1V8P上有1.2mA,在3V3上有300µA理论上的绝对最大值,但当睡眠被启用时,我确实达到了BOD,并以上电复位结束。

谢谢你!

bobspam@free.fr
离线
最后一次见到:2周23小时前
加入:2018-06-20 08:07
你好

你好

我终于解决了最后的问题

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

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

-在完全关闭模式下,我的一个外设在1V8P上消耗高达8mA的电流。10毫安的预算不好!我不得不在手术后重置它,以减少睡眠时的消耗。

—在没有激活pm_set_wakeup_mode(true)的情况下,系统不会唤醒睡眠任务。如果没有它,我就会在系统稳定但什么都不做的情况下睡着。

在旅程结束时,睡眠模式似乎起作用,但

-我不再从电源管理器重新加载OTP值,因为sys_tcs_apply(tcs_系统);在periph_init执行后重新加载LED_CONTROL_REG。

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

谢谢你!