串口打开后,如果要关闭,调用接口UART2_close(uart);会使芯片死机,这是为什么?
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
死机的问题可能与驱动程序或硬件相关。建议检查 UART 关闭函数的实现以及相关的硬件电路连接是否正确,可能存在资源释放不完整或者硬件异常导致的问题。(电流增加也是这种的表现形式)
1.麻烦看下你对UART2_Callback部分的代码
2.如果你有使用读写操作,任何正在进行的读取或写入调用都可以使用UART2_readCancel()或UART2_writeCancel()取消。
1.麻烦看下你对UART2_Callback部分的代码
UART2_Callback代码代码如下:
关闭串口前使用UART2_readCancel()和UART2_writeCancel(),效果还是一样
目前只能定位到以下几个原因
1.void UART2_close的参数,可能是错误的句柄或者未初始化的句柄
2.串口被其他任务占用或者中断处理程序正在访问该串口
3.内存是否及时释放
1.用下面这段代码试试
void UartApp__Close(void) { UART_Params uartParams; UART_close(hUART); /* Call driver init functions */ UART_init(); /* Set UART to default parameters. */ UART_Params_init(&uartParams); hUART = UART_open(Board_UART0, &uartParams); if (hUART == NULL) { /* UART_open() failed */ while (1); } UART_close(hUART);
2.你可以单步调试一下,看看关闭UART后发生了什么
3.你进入低功耗模式了吗?包括电源管理
有尝试那段代码吗?
以下是BLE5-Stack 用户指南的电源管理部分,其中包含其他资源的有用链接。
如果必须使用睡眠函数,则首选 Task_sleep。由于关闭和打开 UART 驱动程序之间的时间很长,因此我的建议是关闭驱动程序并使用计时器而不是睡眠任务来确定何时重新打开驱动程序。您可以使用 Util 驱动程序,如 simple_peripheral.c 文件中的 Util_* 函数所示。这将允许主要任务像以前一样挂起事件。