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

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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版