
4.1 初学者重要提示 学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植 STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,详情可以看我们STM32F4开发板对应的RL-USB教程。 本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。 4.2 移植RL-USB整体说明 移植之前,有必要对移植过程有个整体的认识: 第1步,准备一个RTX5工程模板。 第2步,移植RL-USB。 移植RL-USB是采用MDK的RTE环境直接添加。当前H7芯片使用RTX5强制运行STM32CubeMX,所以需要大家提前安装好STM32CubeMX V6.0或者以上版本。 第3步,处理HAL库时间基准,MPU配置等。 第4步,创建应用。 总的来说,这4步就可以完成移植,下面将STM32H7的移植步骤和注意事项为大家做个说明。 4.3 了解RL-USB模板框架设计 移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植: ![]() 框图如下: ![]() 4.4 第1步,安装指定的MDK软件包 移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版): CMSIS 软件包使用当前最新的:V5.7.0 STM32H7使用当前最新的:V2.6.0 STM32F4使用当前最新的:V2.15.0 STM32CubeMX使用当前最新的:V6.0.x ARM_Compiler使用当前最新的:V1.6.3 RTX5中间件使用当前最新的:V7.12 不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本: ![]() 4.5 第2步,准备一个工程模板 首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制): ![]() 4.6 第3步,添加RL-USB并配置 看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。 4.6.1 RL-USB相关文件和驱动 CMSIS-Driver分组中添加USB Device驱动: ![]() 添加USB驱动: ![]() 添加RL-USB并配置: ![]() 我们需要的都已经添加好,效果如下: ![]() 红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节): ![]() 4.6.2 重新添加被隔离的CMSIS-Driver文件 将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。 ![]() RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件 ![]() 内容如下,这些文件是来自MDK安装目录: ![]() 然后将用到的两个文件添加进来: ![]() 4.6.3 重新添加被隔离的HAL库USB文件 文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来: ![]() 4.6.4 RL-USB配置 添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。 USBD_Config_0.c文件配置: ![]() 注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为: osPriorityAboveNormal: ![]() USBD_Config_MSC_0.h文件的配置如下: ![]() 这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。 ![]() 4.7 第4步,强制运行一次CubeMX配置USB 我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。 打开RTE环境,点击如下按钮: ![]() 弹出的STM32CubeMX配置如下: ![]() 修改位置1:用于选择仅使用设备。 修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE” ![]() 然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。 ![]() 重新回到MDK,会有一个对话框,点击“是”即可: ![]() 配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。 ![]() 4.8 第5步,修改文件USBD_STM32H7xx.C 这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:
修改后的顺序如下:
4.9 第6步,修改文件stm32h7xx_hal_msp.c 需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉: ![]() 4.10 第7步,修改文件includes 添加USB头文件:#include "rl_usb.h" #ifndef __INCLUDES_H__ #define __INCLUDES_H__ /* ********************************************************************************************************* * 标准库 ********************************************************************************************************* */ #include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <math.h> /* ********************************************************************************************************* * 其它库 ********************************************************************************************************* */ /* ********************************************************************************************************* * OS和系统库 ********************************************************************************************************* */ #include "cmsis_os2.h" #include "rl_usb.h" /* ********************************************************************************************************* * 宏定义 ********************************************************************************************************* */ /* ********************************************************************************************************* * APP / BSP ********************************************************************************************************* */ #include "bsp.h" /* ********************************************************************************************************* * 变量和函数 ********************************************************************************************************* */ /* 方便RTOS里面使用 */ extern void SysTick_ISR(void); #define bsp_ProPer1ms SysTick_ISR #endif /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/ 4.11 第8步,添加两个应用文件 为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下: ![]() 4.12 第9步,添加头文件路径 添加头文件路径: ![]() 4.13 第10步,创建应用任务(重要,注意启动任务) 应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务: AppTaskUserIF任务 : 按键消息处理。 AppTaskLED任务 : LED闪烁。 AppTaskMsgPro任务 : 消息处理,暂未使用。 AppTaskStart任务 : 启动任务,也是最高优先级任务,这里实现按键扫描。 osRtxTimerThread任务: 定时器任务,暂未使用。 任务栈大小和任务控制块定义如下:
任务创建:
这里我们重点看下启动任务,主要做了五个工作: 外设初始化bsp_Init。 任务创建AppTaskCreate。 初始化USB并连接电脑。 需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。
4.14 常见移植错误总结 编译后提示如下错误: error: 'Driver_USBD.h' file not found 解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径: ![]() 提示如下错误 unknown type name 'HAL_StatusTypeDef' 解决办法:本章4.8小节。 4.15 使用的MicroUSB接口并注意跳线帽设置 本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下: ![]() 注意使用的是MicroUSB接口: ![]() 注意板子左下角跳线帽的设置: ![]() 这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。 4.16 实验例程 本章节配套了如下几个例子供大家移植参考: V7-4001_RTX5 Kernal Template RTX5内核模板。 V7-4002_RL-USB Template RL-USB工程内核模板,使用内部RAM模拟了一个U盘。 MDK进入调试状态后,选择周期更新: ![]() 然后打开调试组件,注意和RTX4的调试组件位置不同: ![]() 然后点击MDK的全速运行, ![]() 至此,就可以动态实时查看RL-USB的运行状态: ![]() 4.17 总结 本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。 |
【经验分享】STM32H7时钟
拷打cubemx【003】——找不到的芯片包
【2025·STM32峰会】GUI解决方案实训分享5-调通板载的NRF24L01 SPI接口并使用模块进行无线通信(发送和接收)
【2025·STM32峰会】GUI解决方案实训分享4-使用MVP架构从硬件外设读取数据并显示到图形界面、从图形界面发送指令控制硬件外设
【2025·STM32峰会】GUI解决方案实训分享3-搭建空白TouchGFX例程并实现简单的功能(含硬件部分的串口打印)
【2025·STM32峰会】GUI解决方案实训分享2-编译运行TouchGFX咖啡机例程(含桌面仿真)
【2025·STM32峰会】+TouchGFX实现动态进度显示以及界面切换
【2025·STM32峰会】+使用TouchGFX快速创建GUI
【2025·STM32峰会】GUI解决方案实训分享1-对LVGL咖啡机例程的牛刀小试以及问题排查
实战经验 | 关于STM32H7使用LL库生成ADC代码工作异常问题说明
好好学习