STM32F7 USB 缓冲区设置最小单位是字节还是字?
大家好,首次发帖有什么不对的地方请谅解。最近在用STM32F746做USB CDC类的开发(HAL库),目前关于收发缓冲区有两个疑惑:
1. datasheet及库函数都标明,端点发送寄存器单位是32位字,那是不是意味着我在usbd_conf.c文件中使用端点缓冲区设置函数HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);就给0端点设置了0x40 * 4 字节大小的缓冲区了?但是我看一些例程感觉这里的大小是按照字节大小来设置的?
2.我看过一个非互联F1/F3系列缓冲区的帖子,里边讲缓冲区需要存储每个端点起始地址及大小信息占用4字节,F7只需要设置寄存器不需要存储缓冲描述表是吗?
另外因为我没接触过太多种类的芯片,想请教一下大牛USB模块在STM32系列中区别大吗?是只分作互联性和非互联性有较大差别还是每一个系列都不太一样?
提前感谢~:)
提问的问题在datasheet与库函数中的相关描述
查阅了F103和F746的参考手册,可以告诉你。
1.
HAL_StatusTypeDef HAL_PCDEx_SetTxFiFo(PCD_HandleTypeDef *hpcd, uint8_t fifo, uint16_t size)
{
uint8_t i = 0;
uint32_t Tx_Offset = 0;
Tx_Offset = hpcd->Instance->GRXFSIZ;
if(fifo == 0)
{
hpcd->Instance->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((uint32_t)size << 16) | Tx_Offset);
}
else
{
Tx_Offset += (hpcd->Instance->DIEPTXF0_HNPTXFSIZ) >> 16;
for (i = 0; i < (fifo - 1); i++)
{
Tx_Offset += (hpcd->Instance->DIEPTXF >> 16);
}
/* Multiply Tx_Size by 2 to get higher performance */
hpcd->Instance->DIEPTXF = (uint32_t)(((uint32_t)size << 16) | Tx_Offset);
}
return HAL_OK;
}
看完整HAL_PCDEx_SetTxFiFo函数,比如fifo为0是,hpcd->Instance->DIEPTXF0_HNPTXFSIZ = (uint32_t)(((uint32_t)size << 16) | Tx_Offset); size左移16位对于刚好是寄存器bit31:16,FIFO深度以32bit为单位。HAL_PCDEx_SetTxFiFo(&hpcd_USB_OTG_FS, 0, 0x40);就给0端点设置了0x40 * 4 字节大小的缓冲区,没毛病。
2.非互联型和F7的USB FIFO无明显差别。都是通过配置这些寄存器去分配和设置深度。关于你说的存储缓冲描述表,你看下是否使用共享发送FIFO了。 衔胆栖冰 发表于 2018-2-1 20:02
查阅了F103和F746的参考手册,可以告诉你。
1.
感谢回答!关于第二个问题,应该是没有使用共享发送FIFO的,从寄存器可以读到几个端点地址和深度是连续的。关于我看的缓冲区帖子,地址如下:
http://www.51hei.com/bbs/dpj-40953-1.html STM32 USB Device应用中的包缓冲话题 楼主问题解决了吗?
页:
[1]