亲爱的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;
}
嗨,matchx,
如果您通过Jlink重置XTAL16,您仍然可以看到它在运行,这是因为Jlink本身,只要您将JTAG连接到68x板上,设备就不会关闭电源域,XTAL16将继续运行,即使您已声明设备将进入睡眠状态。关于如何使用UART,在这种情况下引入了适配器,而不是直接使用低级驱动程序。因此,请看第8段中的UM-B-044-DA1468x Software Platform Reference.pdf,其中解释了睡眠的体系结构以及睡眠时如何使用适配器,还请看第11段驱动程序和适配器,它更详细地解释了适配器方案,在这里您还可以找到一个如何使用UART的示例。
谢谢你的对话
您好,谢谢您的回复。
如上所述,我已经试过了。
我做了更多的调查,惊讶地发现是printf()杀死了系统,但只有在唤醒之后。更令人惊讶的是snprintf()+write()工作得非常好。
(我使用的是我自己编译的Embedded ARM toolchain 5_4-2017q1,原因是由于libncurses版本冲突,Dialog的二进制文件不能在Archlinux上运行。)
谢谢你的帮助,
瓦迪姆,马特克斯。