延长睡眠从UART唤醒

⚠️
大家好. .感谢来到论坛。令人兴奋的消息!我们现在正在转移到新的论坛平台的过程中,它将提供更好的功能,并包含在主对话网站。所有的帖子和账号已经迁移。我们现在只接受新论坛的流量-请发布任何新的帖子在//www.wsdof.com/support.我们会在接下来的几天修复bug /优化搜索和标记。
9个员额/ 0个新员额
最后发表
hamiddhosseini
离线
最后看到:9个月2天前
加入:2020-05-12上午
延长睡眠从UART唤醒

亲爱的对话支持团队:

我已经成功地整合了uart示例的SDKble_app_peripheral.我有能力发送和接收数据,同时有BLE功能。

然而,我试图在UART不繁忙时将我的板放入扩展睡眠模式以节省电力。换句话说,在延长睡眠模式时,有两件事应该能够唤醒董事会:

1-BLE计时器发送通告报文。

2 -UART Rx销

我明白为此目的应采取以下步骤:

1-在睡觉之前,我必须禁用uart,并设置Rx引脚用于唤醒板。

2-当从这个大头针有一个唤醒,我应该激活uart并开始侦听消息。(我知道我可能会丢失一些数据!)

我对如何正确配置扩展睡眠模式和设置回调有点困惑。您能在这方面给我一些指导吗?(由于硬件限制,我不能在4线模式下使用UART,因此;我正在尝试使用山姆Rx引脚的两个目的。)

问候,

哈米德

设备:
PM_Dialog
离线
最后看到:16小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨哈米德,

嗨哈米德,

谢谢你的问题。我建议首先查看DA14531产品页面上的睡眠模式教程-为方便您,下面提供了链接:

http://lpccs-docs.dialog-semiconductor.com/DA14531_Sleep_Mode+/index.html

此外,SDK的ble_app_sleepmode示例将DA14531配置为永久休眠模式。为了唤醒它,您应该使用WAKEUP控制器。请检查app_button_enable()函数。

谢谢,PM_Dialog

hamiddhosseini
离线
最后看到:9个月2天前
加入:2020-05-12上午
你好,

你好,

谢谢你的回复。

我已经通读了教程,但是我找不到答案。

是否可以使用app_easy_timer在长时间睡眠模式下?换句话说,这个计时器能唤醒长时间的睡眠吗?也就是说,董事会将处于睡眠状态,除非它需要为发送一个广告包或当uart忙时醒来。

问候,

哈米德

PM_Dialog
离线
最后看到:16小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨哈米德,

嗨哈米德,

对不起,我可能误解你的问题了。是的,你可以使用app_easy_timer(0来周期性地唤醒,因为这个API使用的是BLE定时器,所以它可以在睡眠模式下使用。

让我们假设你想要醒来并开始做广告。这可以通过设置计时器来实现,如下所示:

cb_my_timeout app_easy_timer (100);

第一个参数指定在100 * 10ms = 1000ms = 1s之后超时的定时器。此时将调用回调cb_my_timerout() get。

谢谢,PM_Dialog

hamiddhosseini
离线
最后看到:9个月2天前
加入:2020-05-12上午
你好,

你好,

非常感谢。这使我明白了这个问题的一部分。我还有一个问题,我对此表示怀疑:

我想用UART_Rx_PIN和计时器一样,用来唤醒你。更明确地说,我想要知道唤醒的方法(计时器和提到的大头针)。

据我所知,在醒过来的时候我需要回叫

  • 禁用唤醒中断
  • 再次初始化该引脚上的uart

然后我就可以开始了接收数据.之后我必须

  • 禁用uart
  • 启用唤醒中断

恢复正常运作。

我正确吗?在这样的操作过程中,有可能改变针的使用吗?

问候,

哈米德

PM_Dialog
离线
最后看到:16小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨哈米德,

嗨哈米德,

如果您想通过GPIO触发器(UART Rx)唤醒,您应该配置WAKEUP控制器并注册该引脚。在SDK的ble_app_sleepmode示例中,可以通过GPIO_BUTTON_PORT /_PIN唤醒设备。请检查wkupct_enable_irq()。在您的情况下,应该使用UART Rx引脚配置它。

请记住,当系统处于睡眠模式时,所有外围域(包括UART)都将关闭,因此在芯片休眠时不可能有UART活动。这意味着您将错过第一个字符露营到UART Rx引脚,以唤醒它。

谢谢,PM_Dialog

hamiddhosseini
离线
最后看到:9个月2天前
加入:2020-05-12上午
到目前为止,我已经完成了

到目前为止,我已经做到了以下几点:

  • 为唤醒定义的引脚和端口与我为UART2 Rx所使用的相同。
  • 定义一个functino来禁用uart和启用唤醒引脚如下:
    void wkup_外围init(){//停止uart uart_disable(UART2);//设置唤醒引脚GPIO_ConfigurePin(EXT_WKUP_GPIO_PORT, EXT_WKUP_GPIO_PIN, INPUT_PULLUP, PID_GPIO, false);}
  • 改变了GPIO_reservations ()set_pad_functions ()
void GPIO_reservations(void) {/* i.e. to reserve P0_1 as Generic Purpose I/O: RESERVE_GPIO(DESCRIPTIVE_NAME, GPIO_PORT_0, GPIO_PIN_1, PID_GPIO);*/ #if define (CFG_PRINTF_UART2) RESERVE_GPIO(UART2_TX, UART2_TX_PORT, UART2_TX_PIN, PID_UART2_TX);#endif RESERVE_GPIO(UART2_RX, UART2_RX_PORT, UART2_RX_PIN, PID_UART2_RX);//保留gpio (push_button, gpio_button_port, gpio_button_pin, pid_gpio);#if !define (__DA14586__) RESERVE_GPIO(SPI_EN, SPI_EN_PORT, SPI_EN_PIN, PID_SPI_EN);#endif} #endif void set_pad_functions(void){/*即设置P0_1为通用目的输出:GPIO_ConfigurePin(GPIO_PORT_0, GPIO_PIN_1, Output, PID_GPIO, false);*/ #if define (__DA14586__) //禁止自发DA14586 SPI Flash唤醒GPIO_ConfigurePin(GPIO_PORT_2, GPIO_PIN_3, OUTPUT, PID_GPIO, true);#else //禁止自发SPI Flash唤醒GPIO_ConfigurePin(SPI_EN_PORT, SPI_EN_PIN, OUTPUT, PID_SPI_EN, true);#endif GPIO_ConfigurePin(EXT_WKUP_GPIO_PORT, EXT_WKUP_GPIO_PIN, INPUT_PULLUP, PID_GPIO, false);#if define (CFG_PRINTF_UART2) //配置UART2 TX Pad gpio_configurein (UART2_TX_PORT, UART2_TX_PIN, OUTPUT, PID_UART2_TX, false); #endif }
  • 将以下行添加到user_app_adv_start ():
arch_set_extended_sleep(false); //将扩展睡眠设置为不带OTP拷贝arch_ble_ext_wakeup_on ();//配置唤醒pin wkup_peripher_init ();app_wkup_pin_enable ();
  • 修改uart_ble_sleepmode示例中的回调函数:
/** **************************************************************************************** * @ 短暂的按钮按下回调函数。在WKUPCT驱动程序中注册。**************************************************************************************** */ 静态孔隙app_uart_trigered_cb(空白){#如果! (__DA14531__)如果定义(GetBits16 (SYS_STAT_REG PER_IS_DOWN)) # endif {periph_init ();} //我想设置Rx和Tx引脚接收uart uart_startup_process (UART2);如果(arch_ble_ext_wakeup_get()) {arch_set_sleep_mode(app_default_sleep_mode);arch_ble_force_wakeup ();arch_ble_ext_wakeup_off ();app_easy_wakeup ();} } /** **************************************************************************************** * @ 简单应用程序唤醒回调函数。在API消息实用程序中注册。 **************************************************************************************** */ static void app_wakeup_cb(void) { uart_receive_intr_init(UART2); } /** **************************************************************************************** * @brief Sets UART as wakeup trigger **************************************************************************************** */ void app_wkup_pin_enable(void) { app_easy_wakeup_set(app_wakeup_cb); wkupct_register_callback(app_uart_trigered_cb); wkupct_enable_irq(WKUPCT_PIN_SELECT(EXT_WKUP_GPIO_PORT, EXT_WKUP_GPIO_PIN), // select pin (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN) WKUPCT_PIN_POLARITY(EXT_WKUP_GPIO_PORT, EXT_WKUP_GPIO_PIN, WKUPCT_PIN_POLARITY_LOW), // polarity low 1, // 1 event 40); // debouncing time = 0 } void user_app_disable_button(void) { wkupct_disable_irq(); } void uart_startup_proccess(uart_t *uart){ //disabling the wkup interrupts user_app_disable_button(); //initializing the uart uart_periph_init(uart); uart_register_rx_cb(uart, uart_receive_intr_cb); }

然而,当我在调试模式下运行代码时,在接收到唤醒引脚上的新字节时并没有变化,设备继续发布广告。关于这个问题的可能原因,你能给我一些建议吗?

问候,

哈米德

hamiddhosseini
离线
最后看到:9个月2天前
加入:2020-05-12上午
你好,

你好,

我想指出的是,我已经成功地实现了我想要的架构。谢谢你的时间。

问候,

哈米德

PM_Dialog
离线
最后看到:16小时36分钟前
工作人员
加入:2018-02-08 11:03
嗨哈米德,

嗨哈米德,

很高兴你解决了你的问题,谢谢让我们知道。根据app_wkup_pin_enable(),低脉冲信号应该触发唤醒控制器。

如果您有任何其他问题,请提出一个新的论坛帖子。

谢谢,PM_Dialog