蓝aa枫 发表于 2019-11-14 11:40:04

STM32 CUBE 生成USB HID通信问题

使用STM32 CUBE 生成usb hid通信遇到一个奇怪问题感觉像内存分配问题,单又觉得不是,望高手解惑!
程序情况:
1.单片机STM32L452
2.操作系统FreeRTOS
3.任务数量1,其它任务屏蔽了的
4.通信情况,使用过USB助手发送数据,程序收到后,通过串口打印出数据,同时将数据发送到USB助手。

第一种正常情况:
void App_LoraLoginTask(void const * argument)
{
uint16_t length;
uint8_t buff;
USB_BUFF *USB_Buff;

for(;;)
{
    if( UsbBuff.Queuex != 0 )
    {
      if( xQueueReceive( UsbBuff.Queuex, &USB_Buff, 0 ) == pdPASS )
      {
      if( length = Get_bytes_count( &USB_Buff->R_RingBuff ) )
      {
          length = Read_ring_buffer( &USB_Buff->R_RingBuff, buff, length );
          Write_ring_buffer( &USB_Buff->T_RingBuff, buff, length );
          USB_SendBuff( USB_Buff );
      }
      }
    }
    osDelay(1);   
}
}

void USB_SendBuff( USB_BUFF *usb_f )
{
static uint8_tsbuff = { USB_CMD, 62 };
uint16_t length = 62;

    length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff, length );
    sbuff = length;
    while( USBD_CUSTOM_HID_SendReport( &hUsbDeviceFS, sbuff, 64 ) == USBD_OK );
    Bsp_UsartxIntSendBuff(&UartBuffTbl[ UART_1 ], sbuff, 64 );
}

USB助手发送数据串口能正常收到数据,USB也能收到发出的数据,

2第二种情况,去掉USB_SendBuff里的static,如下:
void USB_SendBuff( USB_BUFF *usb_f )
{
uint8_tsbuff = { USB_CMD, 62 };
uint16_t length = 62;

    length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff, length );
    sbuff = length;
    while( USBD_CUSTOM_HID_SendReport( &hUsbDeviceFS, sbuff, 64 ) == USBD_OK );
    Bsp_UsartxIntSendBuff(&UartBuffTbl[ UART_1 ], sbuff, 64 );
}

串口还是能正常收,USB收到数据错误,发送不变的情况下,USB收到恒定的错误值
但是sbuffsbuff数据却正常。


函数说明
App_LoraLoginTask任务主函数,堆栈1024字节,
USB_SendBuff子函数,被主函数调用
USBD_CUSTOM_HID_SendReport USB 发送函数
Bsp_UsartxIntSendBuff串口发送函数


开始怀疑过任务堆栈,加大到4096问题一样,排除了堆栈问题,
加上static问题解决,感觉是动态分配出了问题,但是串口发送函数仍然没问题。




但是加上static后 连续循环发送两包数据,出现第一包数据掉包现象
void USB_SendBuff( USB_BUFF *usb_f )
{
static uint8_tsbuff = { USB_CMD, 62 };
uint16_t length = 62;

while( length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff, length ) )
{
//    length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff, length );
    sbuff = length;
    while( USBD_CUSTOM_HID_SendReport( &hUsbDeviceFS, sbuff, 64 ) == USBD_OK );
    Bsp_UsartxIntSendBuff(&UartBuffTbl[ UART_1 ], sbuff, 64 );
}

}

while循环两次,第一次发送的数据USB助手未收到,bus hound监控数据确实是STM32没有发出

蓝aa枫 发表于 2019-11-14 12:18:56

有没有大神遇到过这问题:(

mikecai 发表于 2019-11-14 13:55:53

这句whie 用一个 = 可能有问题,仅是赋值 给length,没有比较啊
while( length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff, length ) )

流水源 发表于 2019-11-14 14:30:32

数组前面加static相当于全局变量,内存一直存在不会清掉。不加static就是局部变量,退出该函数内存就会被清掉。
你那个发送函数发送数组参数时,只是传递了地址指针,实际发送还没进行。等实际在中断内发送数据时,不加static的数组参数都被改变了,所以数据错误的

蓝aa枫 发表于 2019-11-14 14:46:45

mikecai 发表于 2019-11-14 13:55
这句whie 用一个 = 可能有问题,仅是赋值 给length,没有比较啊
while( length = Read_ring_buffer( &usb_f ...

这里没问题的直接相当于判断的length值

蓝aa枫 发表于 2019-11-14 14:54:01

流水源 发表于 2019-11-14 14:30
数组前面加static相当于全局变量,内存一直存在不会清掉。不加static就是局部变量,退出该函数内存就会被清 ...

非常感谢,我之前也想过是因为局部变量内存分配被释放导致,所以在发送后加了延时,发现延时10ms也不行,但是我不理解为什么USB发送数据会这么慢,理论是不应该这样的,并且我也是判断了返回状态再发下一帧数据的(sbuff定义为static的情况下)

蓝aa枫 发表于 2019-11-14 15:18:45

流水源 发表于 2019-11-14 14:30
数组前面加static相当于全局变量,内存一直存在不会清掉。不加static就是局部变量,退出该函数内存就会被清 ...

并且我测试了连续发送两包数据,需要间隔150ms以上才能成功发送这种情况不对吧

流水源 发表于 2019-11-14 20:22:10

蓝aa枫 发表于 2019-11-14 14:54
非常感谢,我之前也想过是因为局部变量内存分配被释放导致,所以在发送后加了延时,发现延时10ms也不行, ...

延时没用的啊,你发送只是传递了指针,实际在这个函数中数据还没正式发送呢。
你可以调试跟踪一下。
像这种不是立即发送数据的函数调用,最好用全局变量的数组。

蓝aa枫 发表于 2019-11-15 09:59:57

流水源 发表于 2019-11-14 20:22
延时没用的啊,你发送只是传递了指针,实际在这个函数中数据还没正式发送呢。
你可以调试跟踪一下。
像这 ...

非常感谢,确实有这种问题,感谢了大神
页: [1]
查看完整版本: STM32 CUBE 生成USB HID通信问题