你好
由于free_rtos的空闲任务,我愿意将我的设备延长睡眠时间。到目前为止,我面临一些问题。
我的代码基于Dialog中的示例代码。系统正在启动,freertos正在启动,任务正在正确加载。
我在主任务中运行一个循环,我做闪烁一个led检查系统是活的,并执行1秒的睡眠。
我可以跟踪系统,直到WFI被正确执行。在那个时候,呼吸计时器被关闭和关机。
在WFI退出时,呼吸计时器不会唤醒。
目前呼吸呼吸呼吸_cfg,hw_led_set_ledx_src(...),hw_breath_init(&approze_cfg);和hw_breath_enable();都位于Prvsetuphardware。如果我在periph_init中放置其中任何一个,即使在活动或空闲模式下也没有LED亮起。
你能向我证实一下吗
呼吸计时器的初始序列是什么?
呼吸计时器会在睡眠时保留吗?
- 呼吸计时器状态和依赖项是由当前固件管理的吗?
调试这种情况的步骤是什么?
先谢谢你
致以最亲切的问候
关键词:
设备:
你好,
请问你的代码是基于哪个样例代码,你做了哪些修改?您正在实现的功能是为外部LED实现自动呼吸功能吗?
对于LED的呼吸功能,下面的代码显示了一个示例:
配置= {
.dc_min = dc_min,
.dc_max = dc_max,
.dc_step = dc_step,
.freq_div = freq_div,
.polarity = 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中找到。
你好
我的代码是基于freertos_retarget源代码。
我用的正是你给我的
静态孔隙prvSetupHardware(空白)
{
//激活中断
....
breath_cfg = {
.dc_min = 9, //光功率- 1
.dc_max = 10,//灯功率设置为10/255
.dc_step = 255,
.freq_div = 255,
.polarity = HW_BREATH_PWM_POL_POS
};
/*初始化硬件(OTPC, Cache, ADC, DCDC, USB Pads, RF,适配器,总线,设备,watchdog) */
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(false);
// configure 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(false);
//配置RGB Led所需的呼吸计时器
hw_breath_init (&breath_cfg);
hw_breath_enable();
}
如果我在Periph_Init中放置了以前的代码,则没有LED亮起。
从extended_sleep唤醒后保持off。
先谢谢你
它似乎比LED更深。
休眠前:WFI后0x50000066=0x3, pm_system_wake_up后0x50000066=0x2。
数据表指出安全引导(我正在使用看门狗测试生产模式,但还没有安全引导)。
睡眠前0x500030D0=0,睡眠后0x500030D0=1。看来这个功能在醒来后并没有恢复正常。
下一个提示是:睡觉前0x50000022 = 0x54B7,睡觉后0x54B6。RC16在延长睡眠期间停止,之后不再启动。依赖它的DCDC在操作过程中被杀死。(0x5000002A = 0x20D2睡眠后:1V8和1V8P下降)
我尝试将系统放入dg_configUSE_DCDC = 0以停止使用DCDC。
结果,睡眠前后0x50000022 = 0xe7d3。睡觉后我没有更多的撞车。
但我仍然没有领导
新的提示。sys_tcs正在删除LED_CONTROL_REG。如果确实在peripe_init中设置了led源,那么sys_tcs将在引导和唤醒时擦除它们。
我不是使用OTP,为什么这个寄存器将是Sys_tcs在这2次上唯一的一个?
在查看UM-B-044附录H的同时,似乎在生产过程中正在使用LED_CONTROL_REG。
您能在DA14683上运行的freertos_retarget样本代码上检查一下吗?
到目前为止我不能使用睡眠模式。能量对我的产品至关重要。
谢谢你!
嗨,鲍勃,
你可以尝试在任何使用睡眠模式的SDK BLE示例中实现它吗?你是如何测试设备无法入睡的?另外,在peripher_init中有哪些配置?
谢谢,PM_Dialog
你好
我还没有时间将ble用于我的原型。BSP现在非常大,所以这个集成已经被移走了,因为蓝牙不在我们的最小可行产品中。
peri_init目前只有GPIO IN/OUT配置,GPIO高/低的一些OUT在执行期间是固定的,现在呼吸计时器init。
我设法延长了睡眠工作:
—关闭DCDC
>你能跟我确认一下为什么RC16在休眠时停止而没有重启吗?
—从电源管理中移除sys_tcs。
——>你能向我确认一下如何让它停止从OTP重新加载LED_CONTROL_REG值(0x80)吗?(DA14683在定制板上,OTP从未使用过)
-通过在peripher_init中移动呼吸计时器init / config
——> LED在睡眠时关闭。因此,我只能在执行期间使用LED。
-通过在主任务中使用一个简单的循环
如果我加载了比主循环更多的代码,我确实会遇到各种崩溃/麻烦:
- 如果我使用hw_i2c
——>硬故障。(我需要移动到ad_i2c让它在唤醒后重新加载控制器状态)。
-如果UART接收数据时,CPU即将休眠或正在休眠(我认为外部调制解调器发送时钟更新)
——>中断在UART中断处理程序位于情况HW_UART_INT_BUSY_DETECTED。我可以在代码中看到与RBR_THR_DLL相关的注释。如果你有什么想法,我会很高兴的。
- UART遗漏了与外部调制解调器的一些通信,因此我的应用程序不会正确行事。
我确实需要硬件流控制,但我的硬件不适合它。如果您有一个使用UART上的硬件流控制的异步通信的参考实现,我将非常高兴。我目前轮询ad_uart_read在线程中等待数据时,与外部调制解调器通信,但它似乎错过了一些字节。
睡眠功能可能会带来更多麻烦。到目前为止,我还不能可靠地使用它。
先谢谢你
你好
我将我的代码从HW_I2C移动到AD_I2C。我在这方面没有更多的问题。
在UART方面,
- 我在睡眠期间为我的外部调制解调器提供了禁用的级别移位器,以便在睡眠期间没有消息。这不会改变任何东西。
- 我使用了JTAG探针来检查该休息的上下文。似乎这个问题与UART控制台有关,因为我的代码不使用异步通信,因此在UART上没有生成IRQ,我用来与我的外部调制解调器通信。我得到的唯一IRQ来自控制台服务。
你能解决以下问题吗?
- RC16 / DCDC唤醒后关闭
- sys_tcs在不使用OTP的情况下从OTP重新加载值
—话务台业务中断,以__BRK结束
先谢谢你
嗨,鲍勃,
对不起,我有点糊涂了。我强烈建议您不要修改SDK文件。其中hw_i2c是LLD, ad_i2c是I2C的适配器。我强烈建议使用适配器e建议使用适配器访问硬件外设,因为不仅提供对外设的访问,还确保当前正在访问它的其他任务暂停操作,直到外设再次被释放。因此,您不必担心另一个任务在同一时间尝试访问相同的外围设备。此外,在睡眠模式下,所有外围模块都是断电的。
谢谢,PM_Dialog
你好
你能看看以下几点吗?
1.控制台服务产生以__BRK结束的uart中断。一旦我激活了延长睡眠,这个问题就会发生。
硬盘分析:
—LR指向用于控制台服务的UART_Interrupt_Handler(HW_UART1)。
- 在void uart_interrupt_handler(HW_UART_ID UART)中,PC点到CONFIG_UART_IGNORE_BUSY_DETECT案例
我尝试使用没有直接存储器存取配置为uart。没有变化。
2.sys_tcs在没有使用OTP的情况下从OTP重新加载值。解决这个问题,避免修改BSP文件。
- 查看我以前的分析。我可以使用LED_CONTROL_REG的JTAG探测器弄清楚LED_CONTROL_REG是由SYS_TCS_APPLED(TCS_SYSTEM)重新加载的唯一寄存器;功能。重新加载值为0x80。它清除了我的LED的保留状态。
3.RC16 / DCDC唤醒后关机。LDOs可以完成这项工作,直到扩展睡眠可以在启用DCDC时使用为止。
在这里,我只看到,在睡眠之前/之后,RC16位为零,永远不会回到1。在DS v3.1规范第6章中,DCDC依赖于RC16,所以它在唤醒后不能活。
先谢谢你
你好
新硬错误:在ad_gpadc_read()发生睡眠后,我得到一个新的硬错误。我检查了GPADC寄存器,它们处于重置状态。
你能否证实
-所有的适配器都在休眠模式后测试了吗?
- 我可以在构造函数中有适配器“打开”功能?
-在正常操作时,我不需要再次调用“open”。(包括起床后)?
先谢谢你
嗨鲍勃,
我真的很困惑你所做的变化。
我的建议是阅读UM-B-044: DA1468x软件平台参考和UM-B-056:DA1468X软件开发人员指南以便理解SDK架构。您还可以在DA1468x支持门户的“教程”一节中找到“适配器”示例。
谢谢,PM_Dialog
你好
你能在DA14683上启动freertos_retaget,点亮led并激活extended_sleep吗(printf/console重定向到uart, dcdc和dma启用)?
- 睡眠前LED_CONTROL_REG的值是多少?后 ?
- 睡眠前RC16使能位的值是多少?后 ?DCDC还活着吗?
谢谢你阅读手册的建议,但看起来SDK中有bug,我很高兴你在你这边检查一下。我从董事会的支持包中得到了严重的错误。
谢谢你!
你好
好消息。我终于设法让睡眠功能没有崩溃。
我在保持LDO的时候,因为停电导致触到了3.3V的BOD。
在激活Flash 1V8开关关闭功能从而卸载3V3 RET LDO之后,事情就OK了。
坏消息n°1。系统在几分钟后停止睡眠。尚未发现故障。
坏消息n°2。如果启用外部外设,我仍然按下了3V3的BOD。
您是否知道3.3V RET LDO的电力预算是什么时候在延长睡眠时(请不要回答10ma有很多附加的东西)?
我在1V8P和300μA上有1.2mA,3V3理论绝对最大值,但是当睡眠启用时,我会击中BOD并最终通过电源复位。
谢谢你!
你好
我终于解决了最后的问题
我必须手动驱动开关到extended_sleep在我知道什么都没有发生在系统(和控制台上!)我还必须手动切换到空闲模式,以避免在正常操作期间的小睡眠(比如等待适配器事件时的睡眠)。
-我不得不将VBAT上的电容提高到20µF,以避免3V3上的BOD(唤醒时的电流峰值使VBAT下降)。
- 一个外围的一个外围设备在1V8P上消耗高达8mA,同时处于完整的关闭模式。10MA预算不好!我不得不在操作后重置它,使其在睡觉时消耗少。
—在没有激活pm_set_wakeup_mode(true)的情况下,系统不会唤醒睡眠任务。如果没有它,我就会在系统稳定但什么都不做的情况下睡着。
在旅程结束时,睡眠模式似乎起作用了,但是
因为sys_tcs_apply(tcs_system),我不再从电源管理器重新加载OTP值了在执行外围init后重新加载LED_CONTROL_REG。
我再次请求帮助,至少在OTP问题上,这样我可以发布一个版本,而不修改板支持包文件。
谢谢你!