延长睡眠与UART

⚠️
你好。。谢谢你来参加论坛。令人兴奋的消息!我们现在正在移动到我们的新论坛平台,将提供更好的功能,并包含在主对话网站的过程。所有帖子和账号都已迁移。我们现在只接受新论坛上的流量-请在//www.xmece.com/support. 我们将在未来几天内修复bug/优化搜索和标记。
3个职位/0个新职位
最后一篇文章
matchx公司
离线
最后一次见到:3年1周前
已加入:2016-10-18 12:51
延长睡眠与UART

亲爱的Dialog,

我正在尝试将我们的应用程序(DA14680-01,sdk1.0.8.1050.1)置于延长睡眠状态。为此,我采用了扩展的睡眠演示应用程序,并将其移植到我们的主板上(该主板上有LED指示灯,而不是GPIO,因此我将它们设置为TIMER2/PWM)。我们将使用uart,所以我尝试从vTimerCallback()打印UART2上的调试消息,并在periph\u init()中调用hw\u uart\u reinit()(对于输出,我定义了CONFIG_CUSTOM_PRINT并编写了一个_write()函数,调用hw_uart_wrute_buffer();我也试着用广告语。我还添加了pm\u set\u wakeup\u mode(true)以等待XTAL16M解决。该板具有外部32.768kHz和16MHz晶体。

然而,董事会的行为变化,这取决于如何重置。如果它是从JLink重置的(通过reboot_device.sh或gdb的“monitor reset”),那么XTAL16M一直在运行(我们用示波器检查),指示灯保持亮起,UART输出工作。

但如果它是从固件,或使用复位按钮复位,或通过取出电池,并把它放回,XTAL16M停止和LED熄灭在睡眠期间;当电路板唤醒时,LED仍然工作。如果我在醒来后尝试使用UART,那么CPU会挂起,XTAL16M会继续运行。

如果您能告诉我们如何使用UART延长睡眠时间,我将不胜感激。这种情况有点难以调试,因为我还没有找到一种不重置SoC就连接调试器的方法。

下面是我们的periph\u init()和write()函数。

非常感谢您的关注,
瓦迪姆,马特克斯。


静态void periph\u init(void)
{
/*
*设置外围GPIO
*/
重新输入(hw\u UART2和uart\u cfg);
硬件gpio设置引脚功能(硬件gpio端口4,硬件gpio引脚5,硬件gpio模式输出,
硬件\u GPIO \u FUNC \u UART2 \u TX);
硬件gpio设置引脚功能(硬件gpio端口4,硬件gpio引脚4,硬件gpio模式输出,
硬件\u GPIO \u FUNC \u UART2 \u RX);
/*
*启动外围设备
*/
/*
*GPIO初始化
*/
/*为LED输出配置GPIO*/
定时器2\u配置t2cfg={
.pwm3_start=0,
.pwm3_end=0xffff,
.pwm4_start=0,
.pwm4\u end=0xffff,
};
硬件定时器2初始化(&t2cfg);
hw_timer2_enable();
hw\ U led\ U set\ U led2\ U src(hw\ U led\ U SRC2\ U PWM3);
hw\ U led\ U set\ U led3\ U src(hw\ U led\ U SRC3\ U PWM4);
硬件发光二极管启用发光二极管2(ulLEDState&1UL);
/*为按钮配置GPIO*/
硬件gpio\设置\引脚\功能(硬件gpio\端口\ 3、硬件gpio\引脚\ 3、硬件gpio\模式\输入、硬件gpio\功能\ gpio);
//printf(“init\r\n”);
}
int写入(int fd,char*ptr,int len)
{
hw\u uart\u write\u buffer(hw\u UART2,ptr,len);
返回len;
}

设备:
MT\u对话框
离线
最后一次见到:3个月2周前
工作人员
已加入:2015-06-08 11:34
嗨,matchx,

嗨,matchx,

如果您通过Jlink重置XTAL16,您仍然可以看到它在运行,这是因为Jlink本身,只要您将JTAG连接到68x板上,设备就不会关闭电源域,XTAL16将继续运行,即使您已声明设备将进入睡眠状态。关于如何使用UART,在这种情况下引入了适配器,而不是直接使用低级驱动程序。因此,请看第8段中的UM-B-044-DA1468x Software Platform Reference.pdf,其中解释了睡眠的体系结构以及睡眠时如何使用适配器,还请看第11段驱动程序和适配器,它更详细地解释了适配器方案,在这里您还可以找到一个如何使用UART的示例。

谢谢你的对话

matchx公司
离线
最后一次见到:3年1周前
已加入:2016-10-18 12:51
您好,谢谢您的回复。

您好,谢谢您的回复。

如上所述,我已经试过了。

我做了更多的调查,惊讶地发现是printf()杀死了系统,但只有在唤醒之后。更令人惊讶的是snprintf()+write()工作得非常好。

(我使用的是我自己编译的Embedded ARM toolchain 5_4-2017q1,原因是由于libncurses版本冲突,Dialog的二进制文件不能在Archlinux上运行。)

谢谢你的帮助,
瓦迪姆,马特克斯。