嗨,对话当DA14681在扩展睡眠模式下,可以通过UART唤醒,接收中断并从转发器接收数据字节?以及如何设置它?
你好古乡,
UART硬件在扩展睡眠模式下关闭,因此您无法使用它来唤醒系统。
但是,有一个解决方法,您必须非常谨慎,并且不是正式推荐的解决方法。
您可以在睡眠前将UART PIN映射到外部唤醒的GPIO,并将其用作唤醒触发器,然后将PIN映射回UART以接收UART的数据。
但是,您必须非常谨慎地管理以下事项:波特拉特,去抖和唤醒延迟。
最好的事物,LC.
嗨,LC.你能给我一个演示代码吗?
此方法用于下面参考的无附属项目。看看user_prepare_sleep()函数作为起点。
https://support.dialog-seminiondionder.com/connectivity/reference-design/smartbond-codeless-serial-link.
嗨,LC.该文件对我显示了“限制”。可以给我下载它的许可吗?我的电子邮件:414095539@qq.com.
它是由于许可协议,在下载文件之前需要接受。请接受许可证,您应该能够在此支持门户上下载文件。
嗨,LC.我接受了许可协议并提交了它,但它没有回复我,我仍然无法访问下载文件。
您是否可以在您的个人资料中提供有效的地址和其他详细信息。我们需要一些有效的信息来提供对门户上的内容的访问。
嗨LC,我已经更新了我的个人资料。请再次检查一下。
古兴,
您应该能够立即下载内容。
嗨LC,现在它可以通过UART RX引脚从扩展睡眠模式唤醒。但有时它将在系统唤醒后输入“HW_UART_INT_BUSY_DETECTICT”中断。虽然我可以使用“hw_uart_transmit_fifo_empty(uart)”退出“hw_uart_int_busy_detected”中断,但我发现波兰特是不正确的,导致了错误的字符传输。如何解决这个问题呢?
所以首先,您将在进入睡眠模式之前将UART RX引脚配置为GPIO,并且您将在此引脚上启用唤醒中断,其中1个事件计数。为了唤醒您发送@字符的系统,可以将引脚拉低,以获得足够的时钟周期。
唤醒后,您可以启用UART。您的实现是否执行此操作,仍然是您看到HW_UART_INT_BUSY_DETCETCTION中断。请确认。
嗨,LC.是的,我可以将UART RX引脚配置为GPIO唤醒引脚,可以唤醒系统。现在它在大多数情况下工作得很好。但我没有只发送@字符。因为有时只有一个@字符是不够的时钟周期才能唤醒。但是当我发送一个长字符串(超过20个字节@字符,Baudrate 38400)唤醒系统时,它更容易发生“HW_UART_INT_BUSY_DETECTICT”中断,似乎波特丽是错误的。配置的代码如下所示://////// //////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////void console_uart_leave_from_sleepmode(void){hw_wkup_set_pin_state(uart_rx_port,uart_rx_pin,false);hw_gpio_set_pin_function(uart_rx_port,uart_rx_pin,hw_gpio_mode_input_pullup,hw_gpio_func_uart_rx); // rx引脚启用console_uart_init();UART_RX_INT_ENABLE(HW_UART1,TRUE);}void console_uart_prepare_for_sleepmode(void){
hw_wkup_init(null);hw_wkup_reset_counter();hw_wkup_set_debounce_time(0);hw_wkup_set_counter_threshold(1);
hw_gpio_set_pin_function(hw_gpio_port_4,hw_gpio_pin_7,hw_gpio_mode_input_pullup,hw_gpio_func_gpio);hw_wkup_set_pin_state(hw_gpio_port_4,hw_gpio_pin_7,true); //配置Rx引脚作为唤醒引脚hw_wkup_set_pin_trigger(hw_gpio_port_4,hw_gpio_pin_7,hw_wkup_pin_state_low);hw_wkup_register_interrupt(wkup_handler,configlary_max_syscall_interrupt_priority);
hw_gpio_set_pin_function(uart_rx_port,uart_rx_pin,hw_gpio_mode_input,hw_gpio_func_gpio); // rx引脚禁用UART_RX_INT_ENABLE(HW_UART1,FALSE);uart_clock_disable();}
你好古乡,
UART硬件在扩展睡眠模式下关闭,因此您无法使用它来唤醒系统。
但是,有一个解决方法,您必须非常谨慎,并且不是正式推荐的解决方法。
您可以在睡眠前将UART PIN映射到外部唤醒的GPIO,并将其用作唤醒触发器,然后将PIN映射回UART以接收UART的数据。
但是,您必须非常谨慎地管理以下事项:波特拉特,去抖和唤醒延迟。
最好的事物,
LC.
嗨,LC.
你能给我一个演示代码吗?
你好古乡,
此方法用于下面参考的无附属项目。看看user_prepare_sleep()函数作为起点。
https://support.dialog-seminiondionder.com/connectivity/reference-design/smartbond-codeless-serial-link.
最好的事物,
LC.
嗨,LC.
该文件对我显示了“限制”。可以给我下载它的许可吗?
我的电子邮件:414095539@qq.com.
你好古乡,
它是由于许可协议,在下载文件之前需要接受。请接受许可证,您应该能够在此支持门户上下载文件。
最好的事物,
LC.
嗨,LC.
我接受了许可协议并提交了它,但它没有回复我,我仍然无法访问下载文件。
你好古乡,
您是否可以在您的个人资料中提供有效的地址和其他详细信息。我们需要一些有效的信息来提供对门户上的内容的访问。
最好的事物,
LC.
嗨LC,
我已经更新了我的个人资料。请再次检查一下。
古兴,
您应该能够立即下载内容。
最好的事物,
LC.
嗨LC,
现在它可以通过UART RX引脚从扩展睡眠模式唤醒。但有时它将在系统唤醒后输入“HW_UART_INT_BUSY_DETECTICT”中断。虽然我可以使用“hw_uart_transmit_fifo_empty(uart)”退出“hw_uart_int_busy_detected”中断,但我发现波兰特是不正确的,导致了错误的字符传输。如何解决这个问题呢?
你好古乡,
所以首先,您将在进入睡眠模式之前将UART RX引脚配置为GPIO,并且您将在此引脚上启用唤醒中断,其中1个事件计数。为了唤醒您发送@字符的系统,可以将引脚拉低,以获得足够的时钟周期。
唤醒后,您可以启用UART。您的实现是否执行此操作,仍然是您看到HW_UART_INT_BUSY_DETCETCTION中断。请确认。
最好的事物,
LC.
嗨,LC.
是的,我可以将UART RX引脚配置为GPIO唤醒引脚,可以唤醒系统。现在它在大多数情况下工作得很好。但我没有只发送@字符。因为有时只有一个@字符是不够的时钟周期才能唤醒。但是当我发送一个长字符串(超过20个字节@字符,Baudrate 38400)唤醒系统时,它更容易发生“HW_UART_INT_BUSY_DETECTICT”中断,似乎波特丽是错误的。
配置的代码如下所示:
//////// //////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////////
void console_uart_leave_from_sleepmode(void)
{
hw_wkup_set_pin_state(uart_rx_port,uart_rx_pin,false);
hw_gpio_set_pin_function(uart_rx_port,uart_rx_pin,hw_gpio_mode_input_pullup,
hw_gpio_func_uart_rx); // rx引脚启用
console_uart_init();
UART_RX_INT_ENABLE(HW_UART1,TRUE);
}
void console_uart_prepare_for_sleepmode(void)
{
hw_wkup_init(null);
hw_wkup_reset_counter();
hw_wkup_set_debounce_time(0);
hw_wkup_set_counter_threshold(1);
hw_gpio_set_pin_function(hw_gpio_port_4,hw_gpio_pin_7,hw_gpio_mode_input_pullup,hw_gpio_func_gpio);
hw_wkup_set_pin_state(hw_gpio_port_4,hw_gpio_pin_7,true); //配置Rx引脚作为唤醒引脚
hw_wkup_set_pin_trigger(hw_gpio_port_4,hw_gpio_pin_7,hw_wkup_pin_state_low);
hw_wkup_register_interrupt(wkup_handler,configlary_max_syscall_interrupt_priority);
hw_gpio_set_pin_function(uart_rx_port,uart_rx_pin,hw_gpio_mode_input,
hw_gpio_func_gpio); // rx引脚禁用
UART_RX_INT_ENABLE(HW_UART1,FALSE);
uart_clock_disable();
}