我将USB驱动程序从STM32F4设备移植到STM32L4设备。它几乎可以工作。在枚举期间,它发送和接收信息,但数据与“普通”STM Cube生成的项目不完全相同。 II在两个项目中都有相同的设置,但得到了奇怪的结果。
我失去了一个星期试图找到解决方案,也许这里有人有类似的问题,可以帮助我。对不起图像,但没有其他人在SO上发布一些信息
正如您所看到的,数据包几乎相同,但不完全相同。在第25次传输后,董事会停止并接受非常有限数量的请求
来自wireshark的两个文件(以wireshark和文本格式)在这里:
https://gitlab.com/diymat/usb-problem/tree/master
ep *文件是我的端口,stmcdc * - STM Cube生成的一个。两者都使用相同的硬件运行。
是时钟配置相同吗? 48MHz USb clk好吗?使用非晶体或ext osc获得48MHz USB通常导致大xfer上的问题即使在F4上也不能说l4因此它似乎可以用于隐藏而且相当短的数据包但是开始误操作更大的xfer
所以我希望得到一些更好的帮助,但我肯定需要更多的信息来为你提供一个很好的方向。据说,可能有很多错误,所以我会试着掩盖我的内容。可以想到。让我们从一些最明显的开始。
时钟配置/硬件可能由于组件故障或软件/硬件选择错误而导致问题。这可能会导致许多问题,但这可能是一个问题。
如果您使用ST生成的FATFS中间件,L4配置中的小堆栈大小可能会导致这个问题。它可能会工作,直到PC寄存器收到一个错误的错误,这可能会导致某种错误,或者在某些情况下,只是在FATFS内部返回一个错误的结果,或者来自ST的USB外设代码,它将返回一个脏扇区。从FATFS读取USB窗口,这将导致外设上的终止操作。
我看到你正在使用STM32Cube,所以你可以通过打开文件startup_stm32l475xx.s
来编辑堆栈和堆大小
并根据您的应用编辑这两个。
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x200
尝试增加堆栈大小,看看会发生什么。祝你找到解决方案好运!