嗨MT_dialog,
回顾从我的上一个帖子http://support.dialog-semiconductor.com/dsps-large-current-consumption,我可以继续问如何实现低电流消耗需求方的项目?
我现在使用官方DA14580EVKT-B。我已经测试了当前消费利用HW或西南流控制。如果使用HW流控制,当前的消费低于1马。如果使用西南流控制,当前的消费几乎是2。x马。因为单片机的I / O限制针的主人,我不能用HW流量控制的方法。但当前消费使用西南流控制仍相当高,如何降低当前的消费低于1马?
如果我配置UART1_TX、UART1_RX UART1_RTS & UART1_CTS端口2 2马将消耗更多的电流,请建议。
谢谢。
设备:
嗨Jackiechau,
利用西南流控制其耗费更多的权力,因为你必须醒着更经常为了发送流量控制信号,等待额外的字节接收等,西南流控制比硬件流控制和保持了580年的更频繁地醒来。你不能减少功耗,因为如果你有sideffects失去数据。需求方是已经优化从能耗的角度来看,只要它不compromizes发送的数据,与一些限制当操作在睡眠模式下,在dsp应用程序报告中提到的。
的别针在端口2把UART别针吗?
由于MT_dialog
嗨MT_dialog,
其实我有未定义的h / w和s / w流控制,并希望使用GPIO的外部单片机14580为数据接收和传输后醒来(边缘醒来14580上升和下降沿让它睡)。14580年所有功能已经实现,但当前的消费大约是1 x马。你介意我给你我的整个项目的源代码,你帮我看一看吗?谢谢。
嗨MT_dialog,
14580年我的项目,定期广播名称和接收数据从外部通过UART1单片机。因为它总是消耗1 x mA电流后未定义h / w和s / w流控制(UART TX和RX FIFO应该是空的),
1。我可以迫使14580年广播名称后睡眠模式?如何去做?
2。GPIO之一,14580年被配置为中断销检测逻辑高或低,如果检测到逻辑高,14580年被迫永远活跃。如果逻辑检测到低,14580年被迫睡眠。有可能这样做吗?我应该使用app_force_active_mode app_restore_sleep_mode ?
3所示。如果h / w流控制必须定义,以便14580可以进入睡眠模式(我认为h / w流控制和14580年是否可以睡不应该相关),据- b - 026,我可以用一个“GPIO 1”的外部单片机提供复位脉冲CTS 14580以14580年醒来,并使用“GPIO 2”的外部单片机检测RTS的下缘14580为了传输和接收数据吗?
谢谢。
嗨Jackiechau,
1)你的意思是设置你的设备在永恒的睡眠没有广告还是启用睡眠功能?广告可以发出停止命令后,名称发送和设置一个定时器或按钮为了你的设备醒来(这将使你的设备在永久的睡眠时,你还必须设置设备在睡眠模式下通过调用)arch_set_extended_sleep()或你可以调用arch_set_extended_sleep()和动态改变睡眠模式(这将设置你的设备在睡眠模式的广告)。
2)app_force_active_mode()和app_restore_sleep_mode()让你睡眠模式之间切换不同的任务要求,它使从不同的app_force_active_mode invcations数(),当每个任务调用restore_sleep()它减少了计数,计数为0时设备freelly会睡觉,你可以找到函数的文档嗯- b - 006文档中。arch_set_extended_sleep (SDK5)或app_set_extended_sleep (SDK3)可以迫使设备immidiatelly设置睡眠模式。
3)需求方没有设计工作没有流控制由于数据丢失,睡眠和自相关的流控制深感需求方没有实现外部唤醒,当设备落在睡觉它使RTS高为了防止外部单片机发送任何数据。如果数据被发送在580睡觉,会有数据丢失。是的,我认为你可以实现一个情况下,580年也将使用流控制和外部单片机将触发580年醒来,直到580年为了开始发送数据。
当地的团队将联系你通过你的注册电子邮件地址。
由于MT_dialog
嗨MT_DIALOG,
我将在下周联系你的分销商,但我想知道为什么主单片机不能醒来BLE RTS如果硬件流控制的定义和启用ext_sleep。ext_sleep被禁用时,我检查CTS可以触发中断,可以收到正确的数据,似乎BLE不能醒来,请建议。
嗨jackiechau,
需求方,不实现,通过设计,外部通过控制器醒来,醒来只是醒来regural间隔以保持连接活着,清醒时拉低其RTS为了让对方知道这是清醒,能够接收数据。您必须启用外部醒来控制器并将其设置为适当的针通过RTS为了唤醒信号的单片机,还需要进一步的修改以覆盖前面的functionallity和适应通过中断唤醒。
由于MT_dialog
嗨MT_DIALOG,
你提到的
1。我发现“启用醒来控制器”EXTERNAL_WAKEUP但你说RTS主单片机也应该连接到另一个销的祝福,祝福睡眠可以禁用这个gpio中断处理程序,可以启用某个地方睡觉?
2。进一步修改,请提供例子。
谢谢。
嗨MT_dialog,
指http://support.dialog-semiconductor.com/dsps-use-gpio-control-its-extend..。,我跟随着智能标记的参考设计app_button_press_cb()函数,连接RTS P1_0掌握单片机的外部中断醒来,保留P0_2 CTS的祝福。然而,似乎BLE无法醒来,没有印在app_cts_logi_high_cb (void)。
在periph_setup.c
空白GPIO_reservations(空白)
{
RESERVE_GPIO (PUSH_BUTTON GPIO_PORT_1、GPIO_PIN_0 PID_GPIO);
RESERVE_GPIO (UART1_TX UART1_TX_PORT、UART1_TX_PIN PID_UART1_TX);
RESERVE_GPIO (UART1_RX UART1_RX_PORT、UART1_RX_PIN PID_UART1_RX);
#如果(UART_HW_FLOW_ENABLED)
RESERVE_GPIO (UART1_RTS UART1_RTS_PORT、UART1_RTS_PIN PID_UART1_RTSN);
RESERVE_GPIO (UART1_CTS UART1_CTS_PORT、UART1_CTS_PIN PID_UART1_CTSN);
# endif / * UART_HW_FLOW_ENABLED * /
/ /准备UART2调试
RESERVE_GPIO (UART2_TX UART2_TX_PORT、UART2_TX_PIN PID_UART2_TX);
RESERVE_GPIO (UART2_RX UART2_RX_PORT、UART2_RX_PIN PID_UART2_RX);
}
# endif / / DEVELOPMENT_DEBUG
/ * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* @brief映射端口别针
*
* Uart和SPI端口引脚和GPIO端口映射
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* /
空白set_pad_functions(空白)/ /设置gpio端口功能模式
{
GPIO_ConfigurePin (GPIO_PORT_1 GPIO_PIN_0、INPUT_PULLDOWN PID_GPIO,假);
GPIO_ConfigurePin (UART1_TX_PORT UART1_TX_PIN、输出PID_UART1_TX,假);
GPIO_ConfigurePin (UART1_RX_PORT UART1_RX_PIN、INPUT_PULLUP PID_UART1_RX,假);
#如果(UART_HW_FLOW_ENABLED)
GPIO_ConfigurePin (UART1_RTS_PORT UART1_RTS_PIN、输出PID_UART1_RTSN,假);
GPIO_ConfigurePin (UART1_CTS_PORT UART1_CTS_PIN、INPUT_PULLUP PID_UART1_CTSN,假);
# endif / * UART_HW_FLOW_ENABLED * /
/ /初始化垫
GPIO_ConfigurePin (UART2_TX_PORT UART2_TX_PIN、输出PID_UART2_TX,假);
GPIO_ConfigurePin (UART2_RX_PORT UART2_RX_PIN,输入、PID_UART2_RX假);
/ *
*配置应用程序端口。
即。
GPIO_ConfigurePin (GPIO_PORT_0 GPIO_PIN_1、输出PID_GPIO,假);/ /输出P_01设置为通用的目的
* /
}
app_sps_device_project.c
空白app_cts_logic_high_cb(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
printf_string (“\ \ napp_cts_logic_high_cb \ r \ n”);
/ *按钮被按下,开始检测按钮长按3秒gurd计时器
* *和恢复极性GPIO检测释放按钮
* /
wkupct_register_callback (app_cts_logic_low_cb);
x100 wkupct_enable_irq (0, 0 x100 1 0 x14);/ / P1_0,极性低,1事件,消除抖动时间= 20 ms
app_button_status = 1;
如果(ke_state_get (TASK_APP) = = APP_CONNECTABLE)
{
/ /唤醒祝福只有我们在广告模式。只有在阿德模式,用户可以清楚焊接数据。
app_ble_force_wakeup ();
app_ble_ext_wakeup_off ();
/ /发送消息TASK_APP。我们应该设置定时器APP_BUTTON_PRESS_TIMER bie是醒着的时候
ke_msg_send_basic (APP_WAKEUP_MSG TASK_APP, NULL);
}
}
空白app_cts_logic_low_cb(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
periph_init ();
printf_string (“\ \ napp_cts_logic_low_cb \ r \ n”);
/ /释放按钮,停止APP_BUTTON_PRESS_TIMER gurd计时器
/ /和恢复极性GPIO检测按钮按下的按钮
wkupct_register_callback (app_cts_logic_high_cb);
x000 x100 wkupct_enable_irq (0, 0, 1, 0 x14);/ / P1_0极性高1事件,消除抖动时间= 20 ms
app_button_status = 0;
如果(ke_state_get (TASK_APP) = = APP_CONNECTABLE)
{
/ /唤醒祝福只有我们在广告模式。只有在阿德模式,用户可以清楚焊接数据。
app_ble_force_wakeup ();
app_ble_ext_wakeup_off ();
/ /发送消息TASK_APP。我们应该明确计时器APP_BUTTON_PRESS_TIMER bie是醒着的时候
ke_msg_send_basic (APP_WAKEUP_MSG TASK_APP, NULL);
}
}
空白app_init_func(空白)
{
app_set_rxirq_threshold (BLE_RX_BUFFER_CNT / 4);
app_sps_init ();
printf_string (“\ n \ rapp_init_func \ r \ n”);
wkupct_register_callback (app_cts_logic_high_cb);
x000 x100 wkupct_enable_irq (0, 0, 1, 0 x14);/ / P1_0极性高1事件,消除抖动时间= 20 ms
}
int app_wakeup_handler (ke_msg_id_t const是否,
void *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
/ /如果没有空闲状态,忽略该消息
如果(ke_state_get (dest_id) = = APP_CONNECTABLE)
{
/ *检查如果醒来的原因是按钮按下或释放和设置或清除长按下计时器。
* *注意这应该只发生在广告和没有连接设备
* /
如果(app_button_status)
{
app_timer_set (APP_BUTTON_PRESS_TIMER TASK_APP 300);
}
其他的
{
ke_timer_clear (APP_BUTTON_PRESS_TIMER TASK_APP);
}
/ *如果(adv_count = = 0)
{
restart_adv = 0;
app_adv_start ();
} * /
}
返回(KE_MSG_CONSUMED);
}
int app_button_press_timer_handler (ke_msg_id_t const是否,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
/ *如果(GPIO_GetPinStatus (GPIO_BUTTON_PORT GPIO_BUTTON_PIN))
{
/ /清除non-vlolatile键数据的记忆
app_clear_bond_data ();
/ /发挥语气表明键合数据已被删除
app_proxr_pwm_enable (button_pwm_callback);
systick_usec_units(假);
systick_wait (APP_PWM_DISABLE_DELAY);
app_proxr_pwm_disable ();
} * /
返回(KE_MSG_CONSUMED);
}
嗨jackiechau,
一些评论关于您已经粘贴的代码,唤醒控制器消除抖动时间20 ms,如果你切换的RTS单片机也许是因为消除抖动的时间唤醒中断不触发。确保设备的中断和醒来,您可以使用arch_set_pxact_gpio醒来回调()函数,检查中断是否triggred智能片段(您应该看到一个红色垂直行调用函数pxact时)。也当bie是睡眠模式不能使用UART后立即醒来,醒来后580年运营以来RC16振荡器,这不会让你使用UART正确,你必须切换到XTAL16之前使用UART和作画者等待晶体来解决。
你可以找到更多的信息关于唤醒嗯- b - 051文档中控制器的外围驱动部分。
由于MT_dialog
嗨MT_dialog,
1。我使用的基本工具和燃烧图像分成EVB smartsnippets,我仍然可以看到红色的垂直线如果函数pxact叫做?如果是这样,应该使用哪个smartsnippets布局,这样我可以看到红色的垂直线吗?如果基本工具包不能显示这条线,我能做些什么来证明系统醒来?
同时,我应该缩短wkupct_enable_irq的消除抖动时间参数()和增加单片机RTS信号的切换时间?
2。如果wkupct_register_callback wkupct_enable_irq不叫,和原始api gpio0_callback periph_setup ()。如果主单片机c将触发切换的RTS信号,很奇怪的对话框可以接收和掌握单片机传输数据。然而,如果app_timer_set (SPS_TIMER TASK_APP 100)每1秒,没有什么可以从对话框接收或发送的一面。它仍然相关唤醒的问题?
谢谢。
嗨jackiechau,
annihilate) 1),如果您正在使用的基本工具它不支持分析器,你可以尝试切换LED从睡梦中醒来的时候,这可能有点棘手,因为需求方可能跟踪没有数据发送这将又睡着,醒来时将开关的领导,所以你必须中断程序中设置一个变量,当醒来检查变量periph_init销是否成立与否,除此之外,你可以设置销并跟踪一个分析器,以确认你的设备醒来。是的缩短你的防反跳参数,因为你使用的是脉冲从外部proccessor 20 ms防反跳时间不会做什么好,只是设置防反跳时间为0。
2)gpio0_callback()是一个平凡的中断,该中断时只能调用系统清醒,当580年睡眠模式是这个系统中断不会醒来。睡觉时只有唤醒定时器的中断可以唤醒580年。没有内核定时器和唤醒定时器之间的关系。
由于MT_dialog
嗨MT_dialog,
谢谢你的帮助,完成了。但在我的源代码,我只是想知道为什么我需要添加几毫秒的延迟gpio0_callback (), app_cts_logic_high_cb()和app_cts_logic_low_cb(),以便主单片机可以发送和接收UART数据从14580年。
嗨jackiechau,
当中断到达需要一定的时间醒来的580年,它不会立即醒来,这需要时间,直到晶体开关和结算是适当的。
由于MT_dialog
嗨MT_dialog,
我想知道如何关掉无线电app_adv_start,打开之前如果有需要,我可以叫SetBits16 (PMU_CTRL_REG RADIO_SLEEP)直接了?谢谢。
BR,
杰基
嗨jackiechau,
收音机是当设备不是广告,当你调用app_adv_start SDK和BLE堆栈将开关收音机当时间接收/传送数据根据广告间隔设置,同样当你连接。
由于MT_dialog