嗨,MT\u dialog,
回顾我上一篇文章http://support.dialog-semiconductor.com/dsps-large-current-consumption,我是否可以继续问一个问题:如何在DSPS项目中实现低电流消耗?
我现在正在使用官方Da14580evkt-b。我使用HW或SW流量控制测试了电流消耗。如果使用HW流量控制,则电流消耗低于1mA。如果使用SW流量控制,则电流消耗几乎是2.x mA。因为MCU主机I / O引脚的限制,我不能使用HW流量控制的方法。但是目前使用SW流量控制的消耗仍然非常高,如何降低1mA以下的电流消耗?
此外,如果我配置UART1_TX,UART1_RX,UART1_RTS&UART1_CTS到端口2,则将消耗2MA更多电流,请告知。
谢谢。
设备:
你好,杰克肖,
使用SW流量控制其更大的功耗,因为您必须更常见的是醒来的顺序发送流量控制信号,等待额外的字节接收等,SW流量控制比HW流量控制更详细,并保持580令人欣赏频繁地。您无法降低功耗,如果您确实存在丢失数据的侧面。只要它在DSPS应用笔记中提到的睡眠模式下运行时,DSP就会从电源消耗视角显示从功耗角度优化。
在港口2上的引脚你放置了UART引脚?
谢谢你的对话
嗨,MT\u dialog,
实际上我拥有未定义的H / W&S / W流量控制,并希望使用外部MCU的GPIO来唤醒14580以进行数据接收和传输(上升沿唤醒14580和下降以放置睡眠)。已实施14580的所有功能,但目前的消费量为1x mA。你介意我寄给你我的整个项目的源代码,你帮我看看吗?谢谢。
嗨,MT\u dialog,
在我的项目中,14580定期广播SSID,并通过UART1从外部MCU接收数据。因为在未定义的h/w和s/w流量控制(UART TX和RX FIFO应为空)之后,它总是消耗1x mA电流,
1.在广播SSID后,我可以强制14580到睡眠模式吗?怎么做?
2. 14580的GPIO之一被配置为中断引脚,以检测逻辑高或低,如果检测到逻辑高电平,则将永久激活14580。如果检测到逻辑低电平,则强制睡眠14580。是否有可能这样做?我应该使用app_force_active_mode和app_restore_sleep_mode吗?
3.如果必须定义h/w流量控制以使14580进入睡眠模式(我认为h/w流量控制和14580是否可以睡眠不应该相关),根据AN-B-026,我可以使用外部MCU的“GPIO 1”向14580的CTS提供复位脉冲以唤醒14580吗,并利用外部单片机的gpio2检测14580的RTS下边缘,实现数据的收发?
谢谢。
你好,杰克肖,
1)您的意思是在永久睡眠中设置您的设备而无需广告或仅启用睡眠功能?您可以在发送SSID后发出停止广告命令并设置计时器或按钮,以便您的设备唤醒(这将使您的设备放在永久睡眠中,您还必须在睡眠模式下设置设备通过调用)ARCH_SET_EXTEDDE_SLEEP()或者您只能调用ARCH_SET_EXTEDDE_SLEEP()并动态更改睡眠模式(这将在广告之间设置您的设备。
2) app\u force\u active\u mode()和app\u restore\u sleep\u mode()允许您在不同任务请求的睡眠模式之间切换,它保持app\u force\u active\u mode()的不同输入的计数,当每个任务调用restore\u sleep()时,它减少计数,当计数为零时,设备可以自由进入睡眠,您可以在UM-B-006文档中找到函数的文档。arch\ U set\ U extended\ U sleep(SDK5)或app\ U set\ U extended\ U sleep(SDK3)可强制设备立即设置为睡眠模式。
3)DSP不设计为由于数据丢失而无流量控制,睡眠和流量控制深入相关,因为DSP无法实现外部唤醒,当设备跌至睡眠时,它保持RTS高次数为防止外部MCU发送任何数据。如果在580睡眠时发送数据,则会有数据丢失。是的,我想你可以实现580将使用流量控制的情况,并且外部MCU将触发580醒来并等到580准备好以便开始发送数据。
当地团队将通过您注册的电子邮件地址与您联系。
谢谢你的对话
嗨,MT\u DIALOG,
下周我会联系您的分销商,但我想知道如果定义了硬件流控制并启用了EXT_SLEEP,则METR MCU无法通过RTS唤醒BLE。当ext_sleep被禁用时,我检查CTS中断可以触发,可以接收正确的数据,似乎不能醒来,请敬请咨询。
嗨Jackiechau,
按照设计,DSPS并没有通过唤醒控制器实现外部唤醒,它只是在正常的时间间隔内唤醒以保持连接处于活动状态,当它唤醒时,它将RTS拉低,以便另一方知道它处于唤醒状态并且能够接收数据。您必须启用外部唤醒控制器并将其设置为适当的引脚,以便通过MCU的RTS信号唤醒,还需要进一步修改,以便覆盖以前的功能并通过中断适应唤醒。
谢谢你的对话
嗨,MT\u DIALOG,
你提到
1.我发现“启用唤醒控制器”通过External_WakeUp,但是您的意思是Master MCU的RTS也应该连接到另一个引脚的BLE,可以在此GPIO中断处理程序中禁用BLE睡眠,可以在某处启用睡眠状态吗?
2.进一步修改,请提供该示例。
谢谢。
嗨,MT\u dialog,
参考http://support.dialog-semiconductor.com/dsps-use-gpio-control-its-extend...,我遵循App_button_press_cb()函数中的智能标记参考设计,主MCU的连接RTS到P1_0,用于外部唤醒中断和保留的P0_2,用于BLE的CTS。但是,它似乎无法醒来,没有任何内容在app_cts_logi_high_cb(void)中打印。
在periph_setup.c
作废GPIO\ U预订(作废)
{
保留GPIO(按钮、GPIO端口1、GPIO引脚0、PID GPIO);
保留_GPIO(UART1_TX,UART1_TX_PORT,UART1_TX_PIN,PID_UART1_TX);
保留_GPIO(UART1_RX,UART1_RX_PORT,UART1_RX_PIN,PID_UART1_RX);
#如果(UART\U HW\U FLOW\U ENABLED)
保留_GPIO(UART1_RTS,UART1_RTS_PORT,UART1_RTS_PIN,PID_UART1_RTSN);
保留_GPIO(UART1_CTS,UART1_CTS_PORT,UART1_CTS_PIN,PID_UART1_CTSN);
#endif/*UART\U HW\U FLOW\U启用*/
// UART2调试保留
保留\u GPIO(UART2 \u TX、UART2 \u TX \u端口、UART2 \u TX \u引脚、PID \u UART2 \u TX);
保留GPIO(UART2\U RX、UART2\U RX\U端口、UART2\U RX\U引脚、PID\U UART2\U RX);
}
#endif // development_debug.
/ **
****************************************************************************************
* @brief地图端口引脚
*
*Uart和SPI端口引脚和GPIO端口被映射
****************************************************************************************
* /
void set\u pad\u functions(void)//设置gpio端口函数模式
{
GPIO\u ConfigurePin(GPIO\u PORT\u 1,GPIO\u PIN\u 0,INPUT\u PULLDOWN,PID\u 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\U HW\U FLOW\U 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\U HW\U FLOW\U启用*/
// init pad.
GPIO_CONFIGUREPIN(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\ U 01设置为通用输出
* /
}
应用程序\u sps\u设备\u项目.c
void app_cts_logic_high_cb(void)
{
if(getBits16(sys_stat_reg,per_is_down))
periph_init();
printf_string(“\ r \ napp_cts_logic_high_cb \ r \ n”);
/ *按下按钮,启动3SEC GURD定时器检测按钮长按
**并反转按钮GPIO上的极性以检测释放
* /
wkupct\u寄存器\u回调(app\u cts\u逻辑\u低\u 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\ u msg\ u send\ u basic(APP\ u WAKEUP\ u msg,TASK\ u APP,NULL);
}
}
void app_cts_logic_low_cb(void)
{
if(getBits16(sys_stat_reg,per_is_down))
periph_init();
printf_string(“\ r \ napp_cts_logic_low_cb \ r \ n”);
//按钮被释放,停止应用程序按钮按下定时器
//并恢复按钮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发送消息。我们应该清除Timer App_Button_Press_Timer时醒来时
ke\ u msg\ u send\ u basic(APP\ u WAKEUP\ u msg,TASK\ u APP,NULL);
}
}
void app_init_func(void)
{
app_set_rxirq_threshold(ble_rx_buffer_cnt / 4);
app_sps_init();
printf_字符串(“\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\u wakeup\u处理程序(ke\u msg\u id\u t const msgid,
void * param,
任务id常量目标id,
Keu任务\u id \u t const src \u id)
{
//如果状态不空闲,请忽略该消息
if(ke_state_get(dest_id)== app_connectable)
{
/ *检查唤醒原因是否按钮按或释放并设置或清除长按计时器。
**注意:只有当设备处于广告状态且未连接时,才会发生这种情况
* /
if(app_button_status)
{
应用程序\定时器\设置(应用程序\按钮\按\定时器,任务\应用程序,300);
}
别的
{
清除计时器(应用程序按钮按下计时器,任务应用程序);
}
/*如果(adv\u count==0)
{
重新启动\u adv=0;
app_adv_start();
}*/
}
返回(已消耗的消息);
}
int app\按钮\按下\计时器\处理程序(ke\ msg\ id\ t const msgid,
void const*参数,
任务id常量目标id,
Keu任务\u id \u t const src \u id)
{
/ *如果(gpio_getpinstatus(gpio_button_port,gpio_button_pin))
{
//从非vlolatile存储器清除绑定数据
app_clear_bond_data();
//播放一个提示音,表示粘接数据已被删除
应用程序\u proxr \u pwm \u enable(按钮\u pwm \u回调);
systick_usec_units(false);
systick\ u wait(应用程序\脉宽调制\禁用\延迟);
app_proxr_pwm_disable();
}*/
返回(已消耗的消息);
}
嗨Jackiechau,
几个关于您粘贴的代码的评论,唤醒控制器的衰减时间为20ms,如果您正在为MCU的RTS切换,可能是因为唤醒时间未触发唤醒中断。要确保设备正在接收中断并唤醒,可以在唤醒回调中使用ARCH_SET_PXACT_GPIO()函数,并检查中断是否在智能片段中进行了三次,当函数pxact时,您应该看到红色垂直线叫)。此外,当BLE处于睡眠模式时,您无法在唤醒后立即使用UART,因为在唤醒后,580使用RC16振荡器运行,这允许您正确使用UART,您必须切换到XTAL16在使用UART和OFF COME等待XTAL定居之前。
您可以在外围驱动程序部分中找到有关UM-B-051文档中的唤醒控制器的更多信息。
谢谢你的对话
嗨,MT\u dialog,
1.我正在使用基本套件和刻录图像,通过SmartSnippet将图像刻录到EVB中,如果函数pxact仍然可以看到红色垂直线?如果是这样,应该使用哪种Smartsnippet的布局,这样我就可以看到红色垂直线?如果基本套件无法显示这一行,我可以做些什么来证明系统醒来?
此外,我应该缩短wkupct_enable_irq()的脱嘴时间参数,并增加MCU的RTS信号的切换时间吗?
2.如果WKUPCT_REGISTER_CALLBACK和WKUPCT_ENABLE_IRQ未调用,并且如果主MCU将其RTS信号切换到其RTS信号,则触发Periph_setup.c的原始API GPIO0_CALLBALLBALLBALLBALLBALLBALLBALLBALLBALLBALLBALLBALLBALL,则对话框可以接收和将数据传输到MARER MCU,这非常奇怪。但是,如果每1秒调用app_timer_set(sps_timer,task_app,100),则无法从对话框接收或传输任何内容。它仍然与唤醒问题有关吗?
谢谢。
嗨Jackiechau,
1)不幸的是,如果您使用的基本套件不支持电源分布器,可以尝试从睡眠中唤醒时切换LED,这可能有点棘手,因为DSP可能跟踪没有数据要发送,所以它会恢复睡眠,醒来时会切换LED,所以必须在中断例程中设置一个变量,并且唤醒时检查PERIPH_INIT中的变量,以查看PIN是否已设置,除此之外,您可以使用分析仪设置PIN并将其跟踪,以验证您的设备是否唤醒。是缩短了你的去抖参数,因为你正在使用来自外部的proccessor的脉冲,一个20ms的去抖时间不会做任何好的,只是把去抖时间设置为0。
2)GPIO0_callback()是一个普通的中断,这个中断只能在系统唤醒时调用,当580处于睡眠模式时,该中断不会唤醒系统。只睡觉时,唤醒定时器的中断可以唤醒580.内核定时器和唤醒定时器之间没有关系。
谢谢你的对话
嗨,MT\u dialog,
感谢您的帮助,完成了。但在我的源代码中,我只是想知道为什么我需要在gpio0_callback(),app_cts_logic_high_cb()和app_cts_logic_low_cb()中添加几个ms延迟,以便主MCU可以从14580发送和接收UART数据。
嗨Jackiechau,
当中断击中它需要一些时间唤醒580,它不会立即唤醒,它需要时间,直到XTAL切换和解决是正确的。
谢谢你的对话
嗨,MT\u dialog,
我想知道如何在app\u adv\u启动前关闭收音机并在需要时打开,我可以直接调用SetBits16(PMU\u CTRL\u REG,radio\u SLEEP)打开和关闭吗?谢谢。
布罗尔,
杰基
嗨Jackiechau,
当设备不是广告时,无线电熄灭,当您调用App_adv_start时,SDK和BLE堆栈将在收到/传输数据的时间根据您设置的广告间隔接收/传输数据时,同样适用连接。
谢谢你的对话