STM32 USB HAL_PCDEx_SetRxFiFo、HAL_PCDEx_SetTxFiFo内存分配注意问题

STM32 USB HAL_PCDEx_SetRxFiFo、HAL_PCDEx_SetTxFiFo内存分配注意问题

一、遇到的问题

当我配置完缓冲区后,用HID端点上传数据发现到电脑端接收的数据是错的,而且没有什么规律。以下是我的配置代码:

  HAL_PCDEx_SetRxFiFo(&hpcd_USB_OTG_FS, 0x60);
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x20);
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 1, 0x40);
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 2, 0x100);
  HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 3, 0x40);

有几个问题

  1. 分配内存的时候以为最后面的参数是字节,根据手册其实最后的参数为DWORD。也就是4字节。
  2. 分配的总内存大小超过总的内存大小。根据手册1.25Kbyte的缓冲。也就是最大是 0x140 * 4 = 1248byte

二、详细分析下配置函数

以下是STM32F105 USB库里面的函数。

//设置发送端点缓冲
HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)
{
    uint8_t i;
    uint32_t Tx_Offset;
    Tx_Offset = hpcd->Instance->GRXFSIZ;
    if (fifo == 0U)
    {
        hpcd->Instance->DIEPTXF0_HNPTXFSIZ = ((uint32_t)size << 16) | Tx_Offset;
    }
    else
    {
        //端点零Tx
        Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16;
        for (i = 0U; i < (fifo - 1U); i++)
        {
            //其它端点Tx
            Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16);
        }
        /* Multiply Tx_Size by 2 to get higher performance */
        hpcd->Instance->DIEPTXF[fifo - 1U] = ((uint32_t)size << 16) | Tx_Offset;
    }
    return HAL_OK;
}

//设置接收端点缓冲
HAL_StatusTypeDef HAL_PCDEx_SetRxFiFo(PCD_HandleTypeDef *hpcd, uint16_t size)
{
    hpcd->Instance->GRXFSIZ = size;
    return HAL_OK;
}

根据上面的配置函数,有以下要注意的问题:

  1. 分配内存时是有顺序的,要先分配HAL_PCDEx_SetRxFiFo。所有Rx端点共用一个Fifo。为什么要先分配Rx的呢?因为GRXFSIZ变量在HAL_PCDEx_SetTxFiFo函数中用到。
  2. 内存的总大小不要超过缓冲的大小。
  3. Tx Fifo分配也要按顺序,中间有没有使用的端点也要分配最小16个words的空间。

技术交流

由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享.
群号:339420387
在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值