嗨mt_dialog,
回顾我的最后一篇文章http://support.dialog-semicondiondiondum/dsps-large-current-consumption.,我可以继续提出问题如何在DSP项目中实现低电流消耗吗?
我现在用的是官方的DA14580EVKT-B。我用硬件或软件流量控制测试了电流消耗。如果使用硬件流量控制,电流消耗低于1mA。如果使用SW流量控制,电流消耗接近2.x mA。由于单片机主控芯片I/O引脚的限制,不能采用硬件流量控制的方法。但是使用SW流量控制的电流消耗仍然很高,如何将电流消耗降低到1mA以下?
Also, if I configure UART1_TX, UART1_RX, UART1_RTS & UART1_CTS to port 2, 2mA more current will be consumed, please kindly advise.
谢谢。
设备:
嗨Jackiechau,
利用SW流控制其耗费更多权力的罪ce you have to be awake more often in order send the flow control signals, wait for additional bytes to receive etc, the SW flow control is more elaborated than the HW flow control and keeps the 580 awake more frequently. You can't reduce the power consumption, since if you do there are going to be sideffects of loosing data. The DSPS is allready optimized from power consumption perspective as long as it doesn't compromizes the data send, with some limitations as well when operating in sleep mode that are mentioned in the DSPS application note.
在港口2上的引脚你放置了UART引脚?
谢谢mt_dialog.
嗨mt_dialog,
实际上我拥有未定义的H / W&S / W流量控制,并希望使用外部MCU的GPIO来唤醒14580以进行数据接收和传输(上升沿唤醒14580和下降以放置睡眠)。已实施14580的所有功能,但目前的消费量为1x mA。你介意我寄给你我的整个项目的源代码,你帮我看看吗?谢谢。
嗨mt_dialog,
在我的项目中,14580周期性地广播SSID并通过UART1从外部MCU接收数据。因为它在未定义的H / W和S / W流量控制(UART TX和RX FIFO应该为空)后,它总是消耗1x MA电流,
1广播SSID后,我可以强制14580进入睡眠模式吗?怎么做?
214580的其中一个GPIO被配置为中断引脚以检测逻辑高或低,如果检测到逻辑高,14580将被强制永远激活。如果检测到逻辑低,14580将被迫休眠。有可能吗?我应该使用app\u force\u active\u模式和app\u restore\u sleep\u模式吗?
3.如果A-B-026,则必须按顺序定义H / W流量控制(我认为H / W流量控制,并且14580不应该睡得无关),我可以使用外部MCU的“GPIO 1”,为CTS提供14580的复位脉冲,以便唤醒14580,并使用外部MCU的“GPIO 2”检测RTS的下边缘,以便传输和接收数据?
谢谢。
嗨Jackiechau,
1)您的意思是在永久睡眠中设置您的设备而无需广告或仅启用睡眠功能?您可以在发送SSID后发出停止广告命令并设置计时器或按钮,以便您的设备唤醒(这将使您的设备放在永久睡眠中,您还必须在睡眠模式下设置设备通过调用)ARCH_SET_EXTEDDE_SLEEP()或者您只能调用ARCH_SET_EXTEDDE_SLEEP()并动态更改睡眠模式(这将在广告之间设置您的设备。
2)app_force_active_mode()和app_restore_sleep_mode()允许您在睡眠模式之间切换不同任务所请求的,它会从App_force_Active_Mode()的不同验证中保持计数,并且当每个任务调用Restore_sleep()时,它会减少计数零是设备可以贪婪地睡觉才能睡眠,可以在UM-B-006文档中找到功能的文档。ARCH_SET_EXTEDDED_SLEEP(SDK5)或APP_SET_EXTEDDED_SLEEP(SDK3)可以强制将设备免疫粘贴到睡眠模式中设置。
3)DSP不设计为由于数据丢失而无流量控制,睡眠和流量控制深入相关,因为DSP无法实现外部唤醒,当设备跌至睡眠时,它保持RTS高次数为防止外部MCU发送任何数据。如果在580睡眠时发送数据,则会有数据丢失。是的,我想你可以实现580将使用流量控制的情况,并且外部MCU将触发580醒来并等到580准备好以便开始发送数据。
本地团队将通过您的注册电子邮件地址与您联系。
谢谢mt_dialog.
嗨mt_dialog,
下周我会联系你的经销商,但我想知道为什么主Mcu不能唤醒的RTS,如果硬件流控制的定义和外部睡眠启用BLE。当ext_睡眠被禁用时,我检查CTS中断是否可以触发,是否可以接收到正确的数据,似乎BLE无法唤醒,请告知。
你好,杰克肖,
DSP不仅仅是通过设计实现的,通过唤醒控制器外部唤醒,它只是以垂直间隔唤醒,以便保持连接,当它唤醒时,它才能为其拉低其RTS另一边知道它是令人醒目的并且能够接收数据。您必须启用外部唤醒控制器并将其设置为适当的PIN,以便通过MCU的RTS信号唤醒,并且还需要进一步的修改以覆盖先前的功能,并通过中断调整唤醒。
谢谢mt_dialog.
嗨mt_dialog,
你提到了
1我通过外部唤醒找到了“启用唤醒控制器”,但你的意思是主Mcu的RTS也应该连接到BLE的另一个引脚,BLE睡眠可以在这个gpio中断处理程序中禁用,BLE睡眠可以在某处启用吗?
2如需进一步修改,请提供示例。
谢谢。
嗨mt_dialog,
参考http://support.dialog-semicondiondiondiond.com/dsps-use-gpio-control-its-extend ...,我在app\u button\u press\u cb()函数中遵循了智能标记参考设计,将主MCU的RTS连接到P1\U 0进行外部唤醒中断,并为BLE的CT保留P0\U 2。然而,它似乎无法被唤醒,在app\u cts\u logi\u high\u cb(void)中没有打印任何内容。
在periph_setup.c
void gpio_reservations(无效)
{
保留_GPIO(Push_Button,GPIO_PORT_1,GPIO_PIN_0,PID_GPIO);
保留\u GPIO(UART1 \u TX、UART1 \u TX \u端口、UART1 \u TX \u引脚、PID \u UART1 \u TX);
保留_GPIO(UART1_RX,UART1_RX_PORT,UART1_RX_PIN,PID_UART1_RX);
#if(uart_hw_flow_enabled)
保留\u GPIO(UART1 \u RTS、UART1 \u RTS \u端口、UART1 \u RTS \u引脚、PID \u UART1 \u RTSN);
保留_GPIO(UART1_CTS,UART1_CTS_PORT,UART1_CTS_PIN,PID_UART1_CTSN);
#endif / * uart_hw_flow_enabled * /
//UART2调试预留
保留_GPIO(UART2_TX,UART2_TX_PORT,UART2_TX_PIN,PID_UART2_TX);
保留_GPIO(UART2_RX,UART2_RX_PORT,UART2_RX_PIN,PID_UART2_RX);
}
#endif // development_debug.
/**
****************************************************************************************
*@brief Map端口引脚
*
*映射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\u ConfigurePin(UART1\u RX\u端口、UART1\u RX\u PIN、INPUT\u PULLUP、PID\u UART1\u RX、false);
#if(uart_hw_flow_enabled)
GPIO_CONFIGUREPIN(UART1_RTS_PORT,UART1_RTS_PIN,OUTPUT,PID_UART1_RTSN,FALSE);
GPIO\u ConfigurePin(UART1\u CTS\u端口、UART1\u CTS\u PIN、INPUT\u PULLUP、PID\u UART1\u CTSN、false);
#endif / * uart_hw_flow_enabled * /
// init pad.
GPIO\u ConfigurePin(UART2\u TX\u端口,UART2\u TX\u PIN,输出,PID\u UART2\u TX,false);
GPIO_CONFIGUREPIN(UART2_RX_PORT,UART2_RX_PIN,INPUT,PID_UART2_RX,FALSE);
/*
*Configure application ports.
IE。
gpio_configurepin(gpio_port_0,gpio_pin_1,输出,pid_gpio,false);//将P_01设置为通用输出
* /
}
app_sps_device_project.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”);
/* Button is pressed, start 3sec gurd timer to detect button long press
**并恢复按钮GPIO上的极性以检测释放
* /
wkupct_register_callback(app_cts_logic_low_cb);
wkupct_enable_irq(0x100, 0x100, 1, 0x14); // P1_0, polarity low, 1 event, debouncing time = 20ms
app_button_status = 1;
if(ke_state_get(task_app)== app_connectable)
{
只有我们在广告模式中才能唤醒唤醒。仅在ADV模式中,用户可以清除绑定数据。
app_ble_force_wakeup();
app_ble_ext_wakeup_off();
//向任务应用程序发送消息。当BLE唤醒时,我们应该设置定时器应用程序按钮按下定时器
ke_msg_send_basic(app_wakeup_msg,task_app,null);
}
}
无效应用程序\u cts \u逻辑\u低\u cb(无效)
{
if(getBits16(sys_stat_reg,per_is_down))
periph_init();
printf_string(“\ r \ napp_cts_logic_low_cb \ r \ n”);
//按钮发布,停止App_Button_Press_Timer Gurd Timer
//and revert polarity on the button GPIO to detect the button press
wkupct_register_callback(app_cts_logic_high_cb);
wkupct_enable_irq(0x100、0x000、1、0x14);//P1\U 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_msg_send_basic(app_wakeup_msg,task_app,null);
}
}
void app_init_func(void)
{
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\U 0,极性高,1个事件,去抖动时间=20ms
}
int app_wakeup_handler(ke_msg_id_t const msgid,
void * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
//如果状态不是空闲,则忽略消息
if(ke\u state\u get(dest\u id)==APP\u CONNECTABLE)
{
/*检查唤醒的原因是否是按钮按下或释放,并设置或清除长按计时器。
**请注意,只有在设备广告而未连接时才会发生这种情况
* /
如果(应用程序按钮状态)
{
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();
* /
}
return(ke_msg_consumed);
}
int app_button_press_timer_handler(ke_msg_id_t const msgid,
void const * param,
ke_task_id_t const dest_id,
ke_task_id_t const src_id)
{
/ *如果(gpio_getpinstatus(gpio_button_port,gpio_button_pin))
{
//从非vlolatile存储器清除绑定数据
app_clear_bond_data();
//播放一个音调,表示已删除绑定数据
app_proxr_pwm_enable(button_pwm_callback);
systick_usec_units(false);
systick_wait(app_pwm_disable_delay);
app_proxr_pwm_disable();
* /
return(ke_msg_consumed);
}
你好,杰克肖,
几个关于您粘贴的代码的评论,唤醒控制器的衰减时间为20ms,如果您正在为MCU的RTS切换,可能是因为唤醒时间未触发唤醒中断。要确保设备正在接收中断并唤醒,可以在唤醒回调中使用ARCH_SET_PXACT_GPIO()函数,并检查中断是否在智能片段中进行了三次,当函数pxact时,您应该看到红色垂直线叫)。此外,当BLE处于睡眠模式时,您无法在唤醒后立即使用UART,因为在唤醒后,580使用RC16振荡器运行,这允许您正确使用UART,您必须切换到XTAL16在使用UART和OFF COME等待XTAL定居之前。
您可以在“外围设备驱动程序”部分的UM-B-051文档中找到有关唤醒控制器的更多信息。
谢谢mt_dialog.
嗨mt_dialog,
1.我正在使用基本套件和刻录图像,通过SmartSnippet将图像刻录到EVB中,如果函数pxact仍然可以看到红色垂直线?如果是这样,应该使用哪种Smartsnippet的布局,这样我就可以看到红色垂直线?如果基本套件无法显示这一行,我可以做些什么来证明系统醒来?
另外,我是否应该缩短wkupct\u enable\u irq()的去抖动时间参数并增加MCU的RTS信号的切换时间?
2如果不调用wkupct\u register\u callback和wkupct\u enable\u irq,并且主MCU切换RTS信号时会触发periph\u setup.c的原始api gpio0\u callback(),那么对话框可以接收数据并将数据传输到主MCU是很奇怪的。但是,如果每1秒调用app\u timer\u set(SPS\u timer,TASK\u app,100),则无法从对话框侧接收或传输任何内容。还是和唤醒问题有关吗?
谢谢。
你好,杰克肖,
1)不幸的是,如果您使用的基本套件不支持电源分布器,可以尝试从睡眠中唤醒时切换LED,这可能有点棘手,因为DSP可能跟踪没有数据要发送,所以它会恢复睡眠,醒来时会切换LED,所以必须在中断例程中设置一个变量,并且唤醒时检查PERIPH_INIT中的变量,以查看PIN是否已设置,除此之外,您可以使用分析仪设置PIN并将其跟踪,以验证您的设备是否唤醒。是缩短了你的去抖参数,因为你正在使用来自外部的proccessor的脉冲,一个20ms的去抖时间不会做任何好的,只是把去抖时间设置为0。
2) gpio0_callback()是一个普通的中断,这个中断只能在系统唤醒时调用,当580处于睡眠模式时,这个中断不会唤醒系统。睡眠时,只有从唤醒定时器中断可以唤醒580。内核计时器和唤醒计时器之间没有关系。
谢谢mt_dialog.
嗨mt_dialog,
谢谢你的帮助,已经完成了。但在我的源代码中,我只是想知道为什么我需要在gpio0\u callback()、app\u cts\u logic\u high\u cb()和app\u cts\u logic\u low\u cb()中添加几毫秒的延迟,以便主MCU可以从14580发送和接收UART数据。
你好,杰克肖,
当中断击中580的醒来需要一些时间时,它不会立即醒来,这需要时间,直到XTAL切换和稳定是正确的。
谢谢mt_dialog.
嗨mt_dialog,
我想知道如何在app_adv_start之前关掉无线电,如果需要,我可以直接调用setbits16(pmu_ctrl_reg,radio_sleep)直接吗?谢谢。
BR,
杰基
你好,杰克肖,
当设备不是广告时,无线电熄灭,当您调用App_adv_start时,SDK和BLE堆栈将在收到/传输数据的时间根据您设置的广告间隔接收/传输数据时,同样适用连接。
谢谢mt_dialog.