搜索
查看: 2001|回复: 8

[求助] STM32 CUBE 生成USB HID通信问题

[复制链接]

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-7-31
发表于 2019-11-14 11:40:04 | 显示全部楼层 |阅读模式
使用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没有发出
回复

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-7-31
 楼主| 发表于 2019-11-14 12:18:56 | 显示全部楼层
有没有大神遇到过这问题
回复 支持 反对

使用道具 举报

该用户从未签到

5

主题

613

帖子

138

蝴蝶豆

金牌会员

最后登录
2022-5-19
发表于 2019-11-14 13:55:53 | 显示全部楼层
这句whie 用一个 = 可能有问题,仅是赋值 给length,没有比较啊
while( length = Read_ring_buffer( &usb_f->T_RingBuff, &sbuff[2], length ) )

回复 支持 反对

使用道具 举报

该用户从未签到

10

主题

1665

帖子

65

蝴蝶豆

论坛元老

最后登录
2021-5-10
发表于 2019-11-14 14:30:32 | 显示全部楼层
数组前面加static相当于全局变量,内存一直存在不会清掉。不加static就是局部变量,退出该函数内存就会被清掉。
你那个发送函数发送数组参数时,只是传递了地址指针,实际发送还没进行。等实际在中断内发送数据时,不加static的数组参数都被改变了,所以数据错误的

评分

参与人数 1蝴蝶豆 +2 收起 理由
STMCU + 2

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-7-31
 楼主| 发表于 2019-11-14 14:46:45 | 显示全部楼层
mikecai 发表于 2019-11-14 13:55
这句whie 用一个 = 可能有问题,仅是赋值 给length,没有比较啊
while( length = Read_ring_buffer( &usb_f ...

这里没问题的  直接相当于判断的length值
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-7-31
 楼主| 发表于 2019-11-14 14:54:01 | 显示全部楼层
流水源 发表于 2019-11-14 14:30
数组前面加static相当于全局变量,内存一直存在不会清掉。不加static就是局部变量,退出该函数内存就会被清 ...

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

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-7-31
 楼主| 发表于 2019-11-14 15:18:45 | 显示全部楼层
流水源 发表于 2019-11-14 14:30
数组前面加static相当于全局变量,内存一直存在不会清掉。不加static就是局部变量,退出该函数内存就会被清 ...

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

使用道具 举报

该用户从未签到

10

主题

1665

帖子

65

蝴蝶豆

论坛元老

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

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

评分

参与人数 1ST金币 +1 收起 理由
蓝aa枫 + 1 很给力!

查看全部评分

回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

6

帖子

0

蝴蝶豆

新手上路

最后登录
2020-7-31
 楼主| 发表于 2019-11-15 09:59:57 | 显示全部楼层
流水源 发表于 2019-11-14 20:22
延时没用的啊,你发送只是传递了指针,实际在这个函数中数据还没正式发送呢。
你可以调试跟踪一下。
像这 ...

非常感谢,确实有这种问题,感谢了  大神
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-26 12:18 , Processed in 1.178450 second(s), 39 queries .

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表