嗨MT_dialog,
回顾我上一篇文章http://support.dialog-semiconductor.com/dsps-large-current-consumption,我是否可以继续询问如何在DSPS项目中实现低电流消耗?
我现在用的是官方的DA14580EVKT-B。我用HW或SW流量控制测试了电流消耗。如果采用HW流量控制,则电流消耗低于1mA。如果使用SW流量控制,电流消耗接近2。x马。由于单片机主机的I/O引脚的限制,不能采用HW流量控制的方法。但是使用SW流量控制的电流消耗仍然相当高,如何将电流消耗降低到1mA以下?
另外,如果我将UART1_TX、UART1_RX、UART1_RTS和UART1_CTS配置到端口2,会多消耗2mA的电流,请告知。
谢谢。
设备:
嗨Jackiechau,
使用SW流量控制它更消耗能量,因为你必须更经常地清醒,以便发送流量控制信号,等待额外字节接收等,SW流量控制比HW流量控制更详细,并保持580更频繁地清醒。您不能降低功耗,因为如果您这样做,将会有丢失数据的副作用。只要不影响数据发送,DSPS已经从功耗角度进行了优化,在DSPS应用说明中提到的睡眠模式下运行时也有一些限制。
您将UART引脚放置在端口2的哪个引脚上?
由于MT_dialog
嗨MT_dialog,
其实我没有定义h/w和s/w的流量控制,想用外部MCU的GPIO唤醒14580以后进行数据的接收和传输(上升边唤醒14580,下降边让14580休眠)。14580的所有功能已经实现,但当前的消耗大约是1x mA。你介意我把我整个项目的源代码发给你,你帮我看一下吗?谢谢。
嗨MT_dialog,
在我的项目中,14580定期广播SSID,并通过UART1接收外部MCU的数据。因为它总是在未定义的h/w和s/w流量控制后消耗1ma电流(UART TX和RX FIFO应该是空的),
1.广播SSID后,可否强制14580进入睡眠模式?怎么做呢?
2.14580的一个GPIO被配置为检测逻辑高或低的中断引脚,如果检测到逻辑高,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”检测14580 RTS的下边缘以实现数据的收发?
谢谢。
嗨Jackiechau,
1)你的意思是在没有广告的情况下让你的设备处于永久睡眠状态,还是仅仅启用睡眠功能?您可以在SSID发送后发出一个停止广告命令,并设置一个计时器或按钮,以使您的设备唤醒(这将使您的设备处于永久休眠,您还必须通过调用)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会睡觉,您可以在UM-B-006文档中找到该功能的文档。arch_set_extended_sleep (SDK5)或app_set_extended_sleep (SDK3)可以强制设备立即设置为睡眠模式。
3)需求方没有设计工作没有流控制由于数据丢失,睡眠和自相关的流控制深感需求方没有实现外部唤醒,当设备落在睡觉它使RTS高为了防止外部单片机发送任何数据。如果在580处于休眠状态时发送数据,则会造成数据丢失。是的,我认为你可以实现一个案例,580将使用流量控制,同时外部MCU将触发580唤醒并等待580准备好,以便开始发送数据。
当地团队将通过您的注册电子邮件地址与您联系。
由于MT_dialog
嗨MT_DIALOG,
我下周会联系你的分销商,但我想知道为什么主Mcu不能唤醒BLE的RTS,如果硬件流控制和ext_sleep是启用的。当ext_sleep被禁用时,我检查是否可以触发CTS中断,是否可以接收到正确的数据,似乎BLE无法被唤醒,请告知。
嗨jackiechau,
需求方,不实现,通过设计,外部通过控制器醒来,醒来只是醒来regural间隔以保持连接活着,清醒时拉低其RTS为了让对方知道这是清醒,能够接收数据。您将必须启用外部唤醒控制器,并将其设置到适当的引脚,以便通过MCU的RTS信号进行唤醒,还需要进一步修改,以覆盖之前的功能,并通过中断进行唤醒。
由于MT_dialog
嗨MT_DIALOG,
你提到的
1.我发现“启用唤醒控制器”通过EXTERNAL_WAKEUP,但你的意思是主Mcu的RTS也应该连接到BLE的另一个引脚,BLE睡眠可以在这个gpio中断处理程序中禁用,BLE睡眠可以在某处启用?
2.进一步修改,请提供示例。
谢谢。
嗨MT_dialog,
指http://support.dialog-semiconductor.com/dsps-use-gpio-control-its-extend..。,我遵循app_button_press_cb()函数中的智能标签参考设计,将主控单片机RTS连接到P1_0进行外部唤醒中断,并预留P0_2给BLE的CTS。然而,似乎BLE无法被唤醒,并且在app_cts_log_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接口映射
****************************************************************************************
*/
Void set_pad_functions(Void) //设置gpio端口函数模式
{
GPIO_ConfigurePin(GPIO_PORT_1, GPIO_PIN_0, INPUT_PULLDOWN, PID_GPIO, false);
GPIO_ConfigurePin(UART1_TX_PORT, UART1_TX_PIN, OUTPUT, PID_UART1_TX, false);
GPIO_ConfigurePin(UART1_RX_PORT, UART1_RX_PIN, INPUT_PULLUP, PID_UART1_RX, false);
#如果(UART_HW_FLOW_ENABLED)
GPIO_ConfigurePin(UART1_RTS_PORT, UART1_RTS_PIN, OUTPUT, PID_UART1_RTSN, false); / /输出
GPIO_ConfigurePin(UART1_CTS_PORT, UART1_CTS_PIN, INPUT_PULLUP, PID_UART1_CTSN, false);
# endif / * UART_HW_FLOW_ENABLED * /
/ /初始化垫
gpio_configurein (UART2_TX_PORT, UART2_TX_PIN, OUTPUT, PID_UART2_TX, false);
GPIO_ConfigurePin(UART2_RX_PORT, UART2_RX_PIN, INPUT, PID_UART2_RX, false);
/*
*配置应用端口。
即。
GPIO_ConfigurePin(GPIO_PORT_0, GPIO_PIN_1, OUTPUT, PID_GPIO, false);//将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);
Wkupct_enable_irq (0x100, 0x100, 1, 0x14);// P1_0,极性低,1事件,去噪时间= 20ms
app_button_status = 1;
if(ke_state_get(TASK_APP) == APP_CONNECTABLE)
{
//只有在广告模式下才会醒来。只有在ADV模式下,用户才能清除绑定数据。
app_ble_force_wakeup ();
app_ble_ext_wakeup_off ();
//发送消息给TASK_APP。我们应该在BLE醒着的时候设置定时器APP_BUTTON_PRESS_TIMER
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 timer
//和恢复按钮GPIO的极性,以检测按钮按下
wkupct_register_callback (app_cts_logic_high_cb);
Wkupct_enable_irq (0x100, 0x000, 1, 0x14);// P1_0,极性高,1事件,去噪时间= 20ms
app_button_status = 0;
if(ke_state_get(TASK_APP) == APP_CONNECTABLE)
{
//只有在广告模式下才会醒来。只有在ADV模式下,用户才能清除绑定数据。
app_ble_force_wakeup ();
app_ble_ext_wakeup_off ();
//发送消息给TASK_APP。当BLE处于清醒状态时,我们应该清除计时器APP_BUTTON_PRESS_TIMER
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);
Wkupct_enable_irq (0x100, 0x000, 1, 0x14);// P1_0,极性高,1事件,去噪时间= 20ms
}
Int app_wakeup_handler(ke_msg_id_t const msgid,
void *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
//如果state不是空闲的,忽略消息
if (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);
}
/*if(adv_count == 0); / /设置为0
{
restart_adv = 0;
app_adv_start ();
}* /
}
返回(KE_MSG_CONSUMED);
}
Int app_button_press_timer_handler(ke_msg_id_t const msgid,
空白const *参数,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
/*if(GPIO_GetPinStatus(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN))
{
//清除非易失性内存中的绑定数据
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毫秒的恢复时间,如果您正在切换您的MCU的RTS可能因为恢复时间唤醒中断没有触发。为了确保设备正在接收中断并被唤醒,你可以在唤醒回调中使用arch_set_pxact_gpio()函数,并在智能代码片段中检查中断是否被触发(当函数pxact被调用时,你应该看到一条红色的竖线)。也当bie是睡眠模式不能使用UART后立即醒来,醒来后580年运营以来RC16振荡器,这不会让你使用UART正确,你必须切换到XTAL16之前使用UART和作画者等待晶体来解决。
您可以在UM-B-051文档的外设驱动程序一节中找到关于唤醒控制器的更多信息。
由于MT_dialog
嗨MT_dialog,
1.我正在使用基本工具包和通过智能片段将图像烧录到EVB中,如果函数pxact被调用,我还能看到红色的垂线吗?如果是,应该使用哪种智能代码片段的布局,以便我能看到红色的垂直线?如果基本工具包不能显示这条线,我能做什么来证明系统苏醒?
另外,我是否应该缩短wkupct_enable_irq()的去抖时间参数并增加MCU RTS信号的切换时间?
2.如果没有调用wkupct_register_callback和wkupct_enable_irq,并且如果主MCU切换它的RTS信号,会触发外围设置c的原始api gpio0_callback(),对话框可以接收和发送数据给主MCU是非常奇怪的。但是,如果每1秒调用app_timer_set(SPS_TIMER,TASK_APP, 100),则不能从对话框端接收或发送任何内容。还是和起床问题有关吗?
谢谢。
嗨jackiechau,
annihilate) 1),如果您正在使用的基本工具它不支持分析器,你可以尝试切换LED从睡梦中醒来的时候,这可能有点棘手,因为需求方可能跟踪没有数据发送它会回到睡眠和醒来的时候会关掉LED,所以你必须中断程序中设置一个变量,当醒来检查变量periph_init销是否成立与否,除此之外,你可以设置销并跟踪一个分析器,以确认你的设备醒来。是的,缩短你的脱扣参数,因为你使用的是外部处理器的脉冲,20ms的脱扣时间不会有任何好处,只要设置脱扣时间为0。
2) gpio0_callback()是一个普通的中断,这个中断只能在系统清醒时调用,当580处于睡眠模式时,这个中断不会唤醒系统。当睡眠时,只有唤醒定时器的中断可以唤醒580。内核计时器和唤醒计时器之间没有关系。
由于MT_dialog
嗨MT_dialog,
谢谢你的帮助,就这样了。但是在我的源代码中,我只是想知道为什么我需要在gpio0_callback(), app_cts_logic_high_cb()和app_cts_logic_low_cb()中添加几个ms延迟,以便主MCU可以发送和接收来自14580的UART数据。
嗨jackiechau,
当中断发生时,需要一些时间来唤醒580,它不是立即唤醒的,它需要一些时间,直到XTAL切换和稳定是适当的。
由于MT_dialog
嗨MT_dialog,
我想知道如何在app_adv_start和打开收音机之前,如果需要,我可以调用SetBits16(PMU_CTRL_REG, RADIO_SLEEP)直接打开和关闭?谢谢。
BR,
杰基
嗨jackiechau,
当设备没有发布时,无线电是关闭的,当你调用app_adv_start SDK和BLE堆栈将开关和关闭无线电时,它的接收/发送数据的时间根据你设置的广告间隔,同样适用于你连接。
由于MT_dialog