STM32H5开发板移植USBX发送数据遇到bug,应该如何去排查问题

问题描述 投票:0回答:1

我使用stm32H5开发板移植了一个USBX,然后使用FreeRtos创建了一个发送数据的任务,但是该任务运行了3次才成功发送一次数据。我尝试用STLink调试,但没有发现问题,应该从哪里排查?

这是我的移植过程

首先我使用STM32CubeMX配置USB Images configured using cubemx

然后我添加了USBX代码和头文件

之后我修改usb.c中的代码来启动USB控制器

我在 STANDALONE 模式下使用 USBX,因此在 FreeRTOS 中运行 ux_system_tasks_run()。

void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN defaultTask */
  /* Infinite loop */
  for(;;)
  {
        /*==============LED===========================*/
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);
        vTaskDelay(500);
        HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
        vTaskDelay(500);
        
        /* call usbx system fuc*/
        ux_system_tasks_run();
        
  }
  /* USER CODE END defaultTask */
}

接下来我使用另一个任务通过USB发送数据

static void SPILCDTaskFunction( void *pvParameters )
{
    char buf[100];
    int cnt = 0;
    while (1)
    {
        cnt ++;
        sprintf(buf, "LCD Task Test : %d\r\n", cnt);
        //Draw_String(0, 0, buf, 0x0000ff00, 0);
        
        /* use usb send data */
        int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout);
        ux_device_cdc_acm_send((uint8_t *)buf, strlen(buf), 1000);
        
        vTaskDelay(1000);
        
    }
}

我期望串口每秒能收到连续的数字,但我等了3秒才收到。

[14:07:59.126]收←◆LCD Task Test : 79

[14:08:02.119]收←◆LCD Task Test : 82

[14:08:05.102]收←◆LCD Task Test : 85

[14:08:08.094]收←◆LCD Task Test : 88

[14:08:11.077]收←◆LCD Task Test : 91

[14:08:14.072]收←◆LCD Task Test : 94

[14:08:17.052]收←◆LCD Task Test : 97

[14:08:32.993]收←◆LCD Task Test : 100

我用ST-Link调试,发现这个任务运行正常,也就是说变量cnt不断增长,但是ux_device_cdc_acm_send()函数每调用3次才成功发送一次数据

ux_device_cdc_acm_send()函数

int ux_device_cdc_acm_send(uint8_t *datas, uint32_t len, uint32_t timeout)
{
    if (cdc_acm)

    {
        if (UX_SUCCESS == ux_device_class_cdc_acm_write_with_callback(cdc_acm, datas, len))
        {
            
        }
        else
        {
            return -1;
        }
    }
    else
    {
        return -1;
    }
        return 0;
}

我正在使用串行调试助手向开发板发送数据,他接收得很好。

我不知道接下来该去哪里解决错误

c usb stm32 freertos stm32-hal
1个回答
0
投票

找到原因了,原来是我在RTOS的默认任务中放了一个LED任务,所以默认任务每次都有1s的延迟,而USBX系统函数ux_system_tasks_run()也在这个任务中,而且它会受到延迟的影响,导致消息无法及时发送

void StartDefaultTask(void *argument)
{
  /* USER CODE BEGIN defaultTask */
  /* Infinite loop */
  for(;;)
  {
        /*==============LED===========================*/
//      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);
//      vTaskDelay(500);
//      HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
//      vTaskDelay(500);
        ux_system_tasks_run();
  }
  /* USER CODE END defaultTask */
}

如上面代码所示,我注释掉LED和延时相关的代码后,得到了想要的结果

[14:09:56.984]收←◆LCD Task Test : 35
[14:09:57.985]收←◆LCD Task Test : 36
[14:09:58.970]收←◆LCD Task Test : 37
[14:09:59.972]收←◆LCD Task Test : 38
[14:10:00.974]收←◆LCD Task Test : 39
[14:10:01.959]收←◆LCD Task Test : 40
[14:10:02.538]发→◇12343245324534efsadfasdfasdfa□
[14:10:02.960]收←◆LCD Task Test : 41
[14:10:03.961]收←◆LCD Task Test : 42
[14:10:04.947]收←◆LCD Task Test : 43
© www.soinside.com 2019 - 2024. All rights reserved.