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);
有几个问题
- 分配内存的时候以为最后面的参数是字节,根据手册其实最后的参数为DWORD。也就是4字节。
- 分配的总内存大小超过总的内存大小。根据手册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_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16;
for (i = 0U; i < (fifo - 1U); i++)
{
Tx_Offset += (hpcd->Instance->DIEPTXF[i] >> 16);
}
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;
}
根据上面的配置函数,有以下要注意的问题:
- 分配内存时是有顺序的,要先分配HAL_PCDEx_SetRxFiFo。所有Rx端点共用一个Fifo。为什么要先分配Rx的呢?因为GRXFSIZ变量在HAL_PCDEx_SetTxFiFo函数中用到。
- 内存的总大小不要超过缓冲的大小。
- Tx Fifo分配也要按顺序,中间有没有使用的端点也要分配最小16个words的空间。
技术交流
由于百度网盘会更新,可以进群看QQ公告.所以资料都会在同一个地址分享. 群号:339420387
|