STM32
直播中

崔映芬

8年用户 1001经验值
私信 关注
[问答]

stm32f107 usb hid接收PC下发数据时死机怎么解决?

我使用的是STM32f107的芯片,移植了STM32_USB-Host-Device_Lib_V2.2.0 官方usb固件库,实现了两个接口的hid 组合设备(通过修改msc-hid复合设备例程)在UCOSII操作系统中运行,目前接口1(端点1)上传报文没有问题,但是接口2(端点2)在接收PC下发的报文时出现死机,程序转到硬件错误中断,pc机下发数据长度为64字节

接收和发送SIZE定义如下:

#define Interface1_EPIN_SIZE                64

#define Interface2_EPOUT_SIZE               64

fifo长度定义如下:
#define RX_FIFO_FS_SIZE                          128
#define TX0_FIFO_FS_SIZE                          64
#define TX1_FIFO_FS_SIZE                          64
#define TX2_FIFO_FS_SIZE                          64

堆栈定义如下:
Stack_Size      EQU     0x00002000
Heap_Size       EQU     0x00002000

经过定位发现出错位置在

DCD_HandleRxStatusQueueLevel_ISR(USB_OTG_CORE_HANDLE *pdev)调用的USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt)函数中;

该函数源代码如下:

void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev,
                         uint8_t *dest,
                         uint16_t len)
{
  uint32_t i=0;
  uint32_t count32b = (len + 3) / 4;

  __IO uint32_t *fifo = pdev->regs.DFIFO[0];
  for( i = 0; i < count32b; i++)
  {
    *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo);
    dest += 4 ;
  }
  return ((void *)dest);
}
当执行到 *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo)时进入硬件错误中断,不知道有没有朋友遇到过这个问题。

回帖(1)

李中宏

2024-4-22 09:58:22
通过将USB_OTG_ReadPacket(pdev,ep->xfer_buff, status.b.bcnt)函数修改如下的到解决:
typedef union {
        uint32_t USB_32byte;
        uint8_t  USB_8byte[4];
}
Rx_usb;
Rx_usb Rx_data[64];
void *USB_OTG_ReadPacket(USB_OTG_CORE_HANDLE *pdev,
                         uint8_t *dest,
                         uint16_t len)
{
  uint32_t i=0;
  uint32_t count32b = (len + 3) / 4;
  u8 j=0;
  __IO uint32_t *fifo = pdev->regs.DFIFO[0];
  for( i = 0; i < count32b; i++)
  {
                if( len == 64)
                {
                   Rx_data.USB_32byte = USB_OTG_READ_REG32(fifo);
                }
                else
                {
    *(__packed uint32_t *)dest = USB_OTG_READ_REG32(fifo);
                }
    dest += 4 ;
  }

  return ((void *)dest);
举报

更多回帖

发帖
×
20
完善资料,
赚取积分