亲爱的对话框,
我正在尝试将我们的应用程序(DA14680-01, SDK 1.0.8.1050.1)置于延长睡眠状态。为此,我采取extended_sleep演示应用程序,并将其移植到我们的板(在LED板上有LED,而不是gpio,所以我把它们放在TIMER2/PWM上)。我们将使用UARTs,因此我尝试从vTimerCallback()打印UART2上的调试消息,并在外围init()中调用hw_uart_reinit()。(对于输出,我定义了CONFIG_CUSTOM_PRINT并编写了一个_write()函数调用hw_uart_wrute_buffer();我还尝试使用ad_uart)。我还添加了pm_set_wakeup_mode(true)来等待XTAL16M解决。该板有外部32.768kHz和16MHz晶体。
然而,板的行为会改变,这取决于它是如何重置的。如果它从JLink复位(通过reboot_device.sh或从gdb通过“monitor reset”),XTAL16M一直在运行(我们用示波器检查),led保持亮,UART输出工作。
但如果它是通过固件重置,或使用重置按钮,或通过取出电池再放回去,XTAL16M停止和led熄灭在睡眠期间;当板是清醒时,led仍然工作。如果我在醒来后尝试使用UART, CPU将挂起,而XTAL16M将继续运行。
如果你能告诉我们如何在长时间睡眠的情况下使用uart,我会很感激的。这种情况有点难于调试,因为我还没有找到一种方法在不重置SoC的情况下附加调试器。
下面是我们的外围init()和write()函数。
非常感谢您的关注,
瓦迪姆,MatchX。
静态孔隙periph_init(空白)
{
/*
*设置周边gpio
*/
hw_uart_reinit (HW_UART2 &uart_cfg);
hw_gpio_set_pin_function (HW_GPIO_PORT_4 HW_GPIO_PIN_5 HW_GPIO_MODE_OUTPUT,
HW_GPIO_FUNC_UART2_TX);
hw_gpio_set_pin_function (HW_GPIO_PORT_4 HW_GPIO_PIN_4 HW_GPIO_MODE_OUTPUT,
HW_GPIO_FUNC_UART2_RX);
/*
*启动外设
*/
/*
* GPIO的初始化
*/
/*为LED输出配置GPIO*/
Timer2_config t2cfg = {
.pwm3_start = 0,
.pwm3_end = 0 xffff,
.pwm4_start = 0,
.pwm4_end = 0 xffff,
};
hw_timer2_init (&t2cfg);
hw_timer2_enable ();
hw_led_set_led2_src (HW_LED_SRC2_PWM3);
hw_led_set_led3_src (HW_LED_SRC3_PWM4);
hw_led_enable_led2(ulLEDState & 1UL);
/*为按钮配置GPIO。*/
hw_gpio_set_pin_function(HW_GPIO_PORT_3, HW_GPIO_PIN_3, HW_GPIO_MODE_INPUT, HW_GPIO_FUNC_GPIO);
/ / printf (" init \ r \ n ");
}
Int _write(Int fd, char *ptr, Int len)
{
hw_uart_write_buffer (HW_UART2 ptr, len);
返回兰;
}
嗨matchx,
关于这一事实你还看到XTAL16运行通过Jlink如果你重置,这是因为Jlink本身,只要你有68 x董事会JTAG附加设备不会关闭电源域和XTAL16将继续操作,即使你已经宣布,该设备将进入睡眠。关于如何使用UART,在这种情况下引入了适配器,而不是直接使用低级驱动程序。所以请看一下UM-B-044-DA1468x软件平台参考。pdf在第8段解释了休眠的架构和适配器如何在休眠时使用,也请看一下第11段驱动程序和适配器,它更详细地解释了适配器方案,您还可以在那里找到如何使用UART的示例。
由于MT_dialog
MT你好,谢谢你的回复。
我已经尝试了ad_uart,如上所述。
我进一步调查了一下,惊讶地发现是printf()杀死了系统,但只是在唤醒之后。更令人惊讶的是,snprintf() + write()工作得非常好。
(我使用的嵌入式ARM工具链5_4-2017q1是我自己编译的,原因是由于libcurses版本冲突,Dialog的二进制文件不能在Archlinux上运行。)
谢谢你的帮助,
瓦迪姆,MatchX。