你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32H7 RL-USB移植(MDK AC5)

[复制链接]
STMCU小助手 发布时间:2021-12-30 14:01
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内核模板,方面大家后面移植:

9c6a4f191f47051f48c46fad67830cf5.png


框图如下:

5d53a3abf7c75f1cb8292dc449988f1a.png


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的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:
7264b6fa8f70af9cae9f03812878d357.png


4.5   第2步,准备一个工程模板

首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):

74269e50c64ab536eeb86097f3884ec3.png


4.6   第3步,添加RL-USB并配置

看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。

4.6.1      RL-USB相关文件和驱动
CMSIS-Driver分组中添加USB Device驱动:

ea12a66af6e60e048bf1b9b81e9aa08a.png


添加USB驱动:

b683b1361cf7de9821e95e9473212e41.png


添加RL-USB并配置:

4d32bb88eee575ba6da2871d56a1ffde.png


我们需要的都已经添加好,效果如下:

6ce0595add222d31f90d93e116cad4f9.png


红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节):

f4cf0f77d674b6a83289142025e72131.png


4.6.2      重新添加被隔离的CMSIS-Driver文件

将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。

52112e844aee805fc01a6d40cddc00a7.png


RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件

7039175ef77263dc5dc73a486e83950f.png


内容如下,这些文件是来自MDK安装目录:

17b8ba3a04288a0e29d94e7ad5f45325.png


然后将用到的两个文件添加进来:

9ad9fcc23d96b8aec42538dff0552a2f.png


4.6.3      重新添加被隔离的HAL库USB文件
文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来:

48241523bce89ad84d2851afef1384e2.png


4.6.4      RL-USB配置
添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。

USBD_Config_0.c文件配置:

c5dcc4510924d2ff0e75092f7d4ca9fe.png


注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:

osPriorityAboveNormal:

f62a8fad5d1ce978c1730b2ad87955e0.png


USBD_Config_MSC_0.h文件的配置如下:

1cffb6b1fa60821b7a7ab7900f7f40a4.png


这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。

fafa76af25304dc853509d2c4dc839f8.png


4.7   第4步,强制运行一次CubeMX配置USB
我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。

打开RTE环境,点击如下按钮:

6d97a5c7ce435822748232a4fe1b0e64.png


弹出的STM32CubeMX配置如下:

2f47e57c5008dce25c2c00afe900142c.png


修改位置1:用于选择仅使用设备。

修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE”

2259b40b2cc2d5b5819f6ac79dd22c3e.png


然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。

17f991df1ea61c9ffd2dbb4c7216da25.png


重新回到MDK,会有一个对话框,点击“是”即可:

292e9c0668f8c166995f17f5d58cc2f8.png


配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。

db9b1da83c41e9807da4cae3b2618f11.png


4.8   第5步,修改文件USBD_STM32H7xx.C
这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:

  1. #include "OTG_STM32H7xx.h"
  2. #include "USBD_STM32H7xx.h"

  3. #include "stm32h7xx.h"
复制代码

修改后的顺序如下:

  1. #include "stm32h7xx.h"

  2. #include "OTG_STM32H7xx.h"
  3. #include "USBD_STM32H7xx.h"
复制代码

4.9   第6步,修改文件stm32h7xx_hal_msp.c
需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:

5d9cadc09f4b5d106e20e496c919908e.png


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文件夹),添加后的效果如下:

0ff85fc9774973eb80c1dbfa6653222d.png


4.12 第9步,添加头文件路径
添加头文件路径:

3d601bebf02ab97843fdaf69cbe84a46.png


4.13 第10步,创建应用任务(重要,注意启动任务)
应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:

AppTaskUserIF任务   : 按键消息处理。

AppTaskLED任务      : LED闪烁。

AppTaskMsgPro任务   : 消息处理,暂未使用。

AppTaskStart任务    : 启动任务,也是最高优先级任务,这里实现按键扫描。

osRtxTimerThread任务: 定时器任务,暂未使用。

任务栈大小和任务控制块定义如下:

  1. /*
  2. **********************************************************************************************************
  3.                                              变量
  4. **********************************************************************************************************
  5. */
  6. /* 任务的属性设置 */
  7. const osThreadAttr_t ThreadStart_Attr =
  8. {
  9.     /* 未使用 */
  10. //    .cb_mem = &worker_thread_tcb_1,
  11. //    .cb_size = sizeof(worker_thread_tcb_1),
  12. //    .stack_mem = &worker_thread_stk_1[0],
  13. //    .stack_size = sizeof(worker_thread_stk_1),
  14. //    .priority = osPriorityAboveNormal,
  15. //    .tz_module = 0

  16.     .name = "osRtxStartThread",
  17.     .attr_bits = osThreadDetached,
  18.     .priority = osPriorityNormal4,
  19.     .stack_size = 2048,
  20. };

  21. const osThreadAttr_t ThreadMsgPro_Attr =
  22. {
  23.     .name = "osRtxMsgProThread",
  24.     .attr_bits = osThreadDetached,
  25.     .priority = osPriorityNormal3,
  26.     .stack_size = 1024,
  27. };

  28. const osThreadAttr_t ThreadLED_Attr =
  29. {
  30.     .name = "osRtxLEDThread",
  31.     .attr_bits = osThreadDetached,
  32.     .priority = osPriorityNormal2,
  33.     .stack_size = 512,
  34. };

  35. const osThreadAttr_t ThreadUserIF_Attr =
  36. {
  37.     .name = "osRtxThreadUserIF",
  38.     .attr_bits = osThreadDetached,
  39.     .priority = osPriorityNormal1,
  40.     .stack_size = 1024,
  41. };
复制代码

任务创建:

  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: main
  4. *    功能说明: 标准c程序入口。
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. int main (void)
  10. {   
  11.     /* HAL库,MPU,Cache,时钟等系统初始化 */
  12.     System_Init();

  13.     /* 内核开启前关闭HAL的时间基准 */
  14.     HAL_SuspendTick();

  15.     /* 内核初始化 */
  16.     osKernelInitialize();                                 

  17.     /* 创建启动任务 */
  18.     ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  

  19.     /* 开启多任务 */
  20.     osKernelStart();

  21.     while(1);
  22. }

  23. /*
  24. *********************************************************************************************************
  25. *    函 数 名: AppTaskCreate
  26. *    功能说明: 创建应用任务
  27. *    形    参: 无
  28. *    返 回 值: 无
  29. *********************************************************************************************************
  30. */
  31. static void AppTaskCreate (void)
  32. {
  33.     ThreadIdTaskMsgPro = osThreadNew(AppTaskMsgPro, NULL, &ThreadMsgPro_Attr);  
  34.     ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);  
  35.     ThreadIdTaskUserIF = osThreadNew(AppTaskUserIF, NULL, &ThreadUserIF_Attr);  
  36. }
复制代码

这里我们重点看下启动任务,主要做了五个工作:

  外设初始化bsp_Init。
  任务创建AppTaskCreate。
  初始化USB并连接电脑。
  需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskStart
  4. *    功能说明: 启动任务,这里用作BSP驱动包处理。
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *   优 先 级: osPriorityHigh4  
  8. *********************************************************************************************************
  9. */
  10. void AppTaskStart(void *argument)
  11. {
  12.     const uint16_t usFrequency = 1; /* 延迟周期 */
  13.     uint32_t tick;

  14.     /* 初始化外设 */
  15.     HAL_ResumeTick();
  16.     bsp_Init();

  17.     /* 创建任务 */
  18.     AppTaskCreate();

  19.     USBD_Initialize(0U);  /* 初始化USB设备 */
  20.     USBD_Connect   (0U);  /* USB设备连接 */

  21.     /* 获取当前时间 */
  22.     tick = osKernelGetTickCount();

  23.     while(1)
  24.     {
  25.         /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */
  26.         bsp_ProPer1ms();

  27.         /* 相对延迟 */
  28.         tick += usFrequency;                          
  29.         osDelayUntil(tick);
  30.     }
  31. }
复制代码

4.14 常见移植错误总结
  编译后提示如下错误:
error: 'Driver_USBD.h' file not found

解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:

d32a6c67848ac92bf4c29e0fbf5ef220.png


  提示如下错误
unknown type name 'HAL_StatusTypeDef'

解决办法:本章4.8小节。

4.15 使用的MicroUSB接口并注意跳线帽设置
本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:

9c04c38f56dbbfd80201520f1e84223e.png


注意使用的是MicroUSB接口:

374a9b3f00b1d0e7cd589a59b3fe699a.png


注意板子左下角跳线帽的设置:

f13c6739f82641308861da50db97c44a.png


这里是用于选择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进入调试状态后,选择周期更新:

dca8f2e82304e411670c3194cde12230.png


然后打开调试组件,注意和RTX4的调试组件位置不同:

9daa841c2ebfbe6204c5bb95355e5707.png


然后点击MDK的全速运行,

1d57a73648e5313c246a089fc2a85ac5.png


至此,就可以动态实时查看RL-USB的运行状态:

1e9d6ebcc79d1df8a4302d0c846080e0.png


4.17 总结

本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。





收藏 评论1 发布时间:2021-12-30 14:01

举报

1个回答
STMWoodData 回答时间:2021-12-30 14:28:14

好好学习

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版