你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 CUBE 生成USB HID通信问题

[复制链接]
蓝aa枫 提问时间:2019-11-14 11:40 /
使用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[128];
  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_t  sbuff[64] = { USB_CMD, 62 };
  uint16_t length = 62;

    length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length );
    sbuff[1] = 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_t  sbuff[64] = { USB_CMD, 62 };
  uint16_t length = 62;

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

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


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


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




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

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

}

while循环两次,第一次发送的数据USB助手未收到,bus hound监控数据  确实是STM32没有发出
收藏 评论8 发布时间:2019-11-14 11:40

举报

8个回答
蓝aa枫 回答时间:2019-11-14 12:18:56
有没有大神遇到过这问题
慎微 回答时间:2019-11-14 13:55:53
这句whie 用一个 = 可能有问题,仅是赋值 给length,没有比较啊
while( length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length ) )

STMWoodData 回答时间:2019-11-14 14:30:32
提示: 作者被禁止或删除 内容自动屏蔽
蓝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以上才能成功发送  这种情况不对吧
STMWoodData 回答时间:2019-11-14 20:22:10
提示: 作者被禁止或删除 内容自动屏蔽
蓝aa枫 回答时间:2019-11-15 09:59:57
流水源 发表于 2019-11-14 20:22
延时没用的啊,你发送只是传递了指针,实际在这个函数中数据还没正式发送呢。
你可以调试跟踪一下。
像这 ...

非常感谢,确实有这种问题,感谢了  大神
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版