printf重定向到USB

CH582芯片。我尝试将printf重定向到USB。移植了BLE_USB例程中的app_usb.c,并将CH58x_sys.c中的_write函数修改为:

int _write(int fd, char *buf, int size)
{
#if DEBUG == Debug_USB
    USBSendData(buf, size);
    while(!EP2_GetINSta());
#else
    int i;
    for(i = 0; i < size; i++)
    {
#if DEBUG == Debug_UART0
        while(R8_UART0_TFC == UART_FIFO_SIZE);                  /* 等待数据发送 */
        R8_UART0_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART1
        while(R8_UART1_TFC == UART_FIFO_SIZE);                  /* 等待数据发送 */
        R8_UART1_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART2
        while(R8_UART2_TFC == UART_FIFO_SIZE);                  /* 等待数据发送 */
        R8_UART2_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART3       
        while(R8_UART3_TFC == UART_FIFO_SIZE);                  /* 等待数据发送 */
        R8_UART3_THR = *buf++; /* 发送数据 */
#endif
    }
#endif //DEBUG == Debug_USB
    return size;
}
#endif

printf函数调用频率较低时,能够正常运行。但调用频率较高或和蓝牙协议栈同时运行时,会在运行一段时间(数十秒)后卡死,请问应如何修改?

您好,“调用频率高”时,指USB_COM打印数据量大表现为分包发送的频次高;还是指数据量不大,单纯加快打印频次。“卡死”的现象是什么样的,是所有接口都不工作了,还是只有USB不工作了。

目前能想到的几个注意点:

①USB模拟COM运行时,需要跑主频;BLE代码里是否用到了HAL_SLEEP休眠,休眠前需要等待所有数据发送完毕再休眠

②COM代码中,SendUSBData这个接口的发包长度参数,是直接赋值给R8_UEPn_T_LEN(n为端点编号),超过64字节大小的打印数据长度不能直接往里赋值

③由于使用批量传输,若发包长度正好为64字节的倍数,需要多发一个0字节长度包表示批量传输的数据发完

您可以将当前现象的相关信息发送至邮箱:zhaiyw@wch.cn以帮您定位问题

或者您留个邮箱,我晚点测试在BLE从机代码中添加COM打印后,给您发参考代码。


谢谢,邮箱是个人信息保护,已隐藏。调用频率高指单纯加快打印频次。卡死的现象是程序停止运行,感觉像是跑飞了。未使用HAL_SLEEP。


只有登录才能回复,可以选择微信账号登录