STM32 USBx Device HID standalone 移植示例 LAT1466
关键字:USBx, Device, HID,standalone
1.设计目的
目前 USBx Device standalone 的官方示例较少,不过使用 STM32CubeMX 可以快速地生成 USBx Device 相关类的示例工程,会很方便大家的开发。这里以 NUCLEO-H563 为例,实现 USBx Device HID Standalone 类,大家可以以此为参考移植到其他的 USBx Device 类。
2.示例移植
参考官方示例代码:……\STM32Cube_FW_H5_V1.3.0\Projects\NUCLEO-H563ZI\Applications\USBX\Ux_Device_HID_Standalone
2.1.生成 STM32CubeMX 工程
新建 STM32CubeMX 工程 :STM32H563ZIT6U,选择“without TrustZone activated”.
另外,STM32CubeMX 中未作说明的配置保持默认.
2.1.1 System Core 相关配置
在 System Core 框架下,Cortex_M33 标签页面下默认使用的是 HCLK. 如下图:
RCC 的标签页下面:采用“BYPASS Clock Source ” MCO 引脚输出作为 MCU 的系统时钟源,如下图:
在 ICACHE 的标签页面下的配置如下图:
另外,SYS 标签页面下的“Timebase Source”设为 “Systick ”
2.1.2 Connectivity 的相关配置
根据 NUCLEO-H563 的硬件原理图定义,这里选择 USART3 打印输出相关的 USB 操作信息。
不用开中断或者 DMA,波特率默认 115200.
注意 USART3 使用的端口引脚是 PD8 与 PD9,与默认 STM32CubeMX 配置引脚不一样。
在 USB 下面的配置如下:中断优先等级设置为 6(在 NVIC 界面下修改);
2.1.3 Middleware 的相关配置
在 USBx 下面, 由于是 standalone 的示例,所以这里不用选择操作系统的中间件。
➢ USBX 的具体配置如下图,可以看出主要检查或修改了默认的如下框出来的几处地方。
➢ UXDevice memory pool size 由默认的 1024 设置为 4K(4*1024Bytes) 。
➢ UX_SLAVE_REQUEST_DATA_MAX_LENGTH 由默认的 2048 设置为 64 。
➢ 由于当前例程并非复合设备,所以 USBD_COMPOSITE_USE_IAD 设置为 false。
➢ USBX Device System Stack Size 由默认的 512 设置为 4K(4*1024Bytes) 。
➢ USBX Device Register Connection Callback 设置为 false 。
➢ 其余的配置保持默认即可。
2.1.4 System Clock 相关配置
由于选择了 Bypass 模式的 8Mhz,注意要修改为一致(默认的是 25Mhz)。USB Device IP 的时钟需要 48Mhz,这里选择 HSI48=48Mhz ;
2.1.5 配置 HID 需要的按键
PC13 是对应原理图中的 USER BUTTON,配置如下,中断优先级为 7,比 USB(USB中断优先级设为 6) 低:
并使能其中断,生成相关中断入口函数的代码,
2.1.6 生成项目工程
为项目工程命名,生成项目工程,适当配置堆栈的大小:
这时候可能会提示警告,如下图所示 :
回过头去配置一下即可,如下图:
然后生成项目工程代码。
2.2.添加应用代码
注意:这个 LAT 是基于 STM32Cube_FW_H5_V1.X.X 中的“\STM32Cube_FW_H5_V1.x.x\Projects\NUCLEO-H563ZI\Applications\USBX\Ux_Device_HID_Standalone \”例程,所以本 LAT 中提到的函数或者变量都可以直接使用或者参考例程中的函数或者变量。
2.2.1 完善串口打印
可以参考《STM32 USBx HOST HID standalone 示例移植》中的说明完善串口打印信息。由于是 USB Device,也可以通过 USB 协议分析仪去查看 log 调试(可选)。
2.2.2 添加 USBx 的初始化函数
在 main.c 中添加初始化函数如下图,如果 main.c 中已经包含它,请忽略。
该函数在 CubeMX 中已经生成,添加调用即可;然后在 MX_USBX_Device_Init 函数的末尾去添加 USBX_APP_Device_Init ();的初始化的调用;
➢ 添加相关函数的声明;
➢ 添加 PCD_HandleTypeDef hpcd_USB_DRD_FS;
➢ 添加USBX_APP_Device_Init函数中MX_USB_PCD_Init 函数的定义,该函数由STM32CubeMX 自动生成在 main.c 文件中,运行代码,你会发现此时枚举不成功。
2.2.3 添加 USBx 的处理函数
在 main 函数的 while 循环中添加函数 USBX_Device_Process(NULL);添加该函数USBX_Device_Process 的定义和申明在 app_usbx_device.c 文件中实现。
编译无问题后,运行,实现枚举。
2.2.4 HID 按键功能的实现
打开函数 USBX_DEVICE_HID_MOUSE_Task 并实现它,还有按键的 callback 回调函数的实现,复制粘贴例程程序的代码即可。
添加相关变量的申明,解决相应的编译错误之后,即可通过按键 User Button 模拟鼠标的功能。当每按一下 User Button(MCU 的 PC13 引脚),在 PC 端即可看到鼠标移动一下,符合预期。