STMCU小助手
发布时间:2021-12-30 14:01
|
4.1 初学者重要提示3 M) {- e+ U$ g 学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植$ U6 A E4 {6 @ STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,详情可以看我们STM32F4开发板对应的RL-USB教程。! t4 w8 c' T7 J. X$ T8 y 本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。3 ^9 l2 O, ]* E. }& p1 I+ k$ M; r 4.2 移植RL-USB整体说明& d7 o, X! A$ e# |5 H3 r+ V 移植之前,有必要对移植过程有个整体的认识:/ p* G* }! A! n3 ~) q! W 第1步,准备一个RTX5工程模板。9 }' v0 R% I& B/ j2 D 第2步,移植RL-USB。7 D/ q* @/ C7 {) `( D) i 移植RL-USB是采用MDK的RTE环境直接添加。当前H7芯片使用RTX5强制运行STM32CubeMX,所以需要大家提前安装好STM32CubeMX V6.0或者以上版本。& U* D. o+ g" O9 x 第3步,处理HAL库时间基准,MPU配置等。 第4步,创建应用。 总的来说,这4步就可以完成移植,下面将STM32H7的移植步骤和注意事项为大家做个说明。 A c4 M& R# o8 _; g 4.3 了解RL-USB模板框架设计 移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植:
) D$ G, d8 i( c3 a: F" n" |6 o 框图如下:
5 G( d: h8 `* k( k1 ~ 4.4 第1步,安装指定的MDK软件包 移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版): CMSIS 软件包使用当前最新的:V5.7.0" \) b9 z- t) q- M9 E* W2 f4 c2 Y STM32H7使用当前最新的:V2.6.0- A2 i; G6 _0 o% t' @ STM32F4使用当前最新的:V2.15.0 STM32CubeMX使用当前最新的:V6.0.x ARM_Compiler使用当前最新的:V1.6.3) ?' `7 O% V9 @% P5 X* T RTX5中间件使用当前最新的:V7.12 : i8 }* Q. g/ `( P$ P! ]5 T 不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:/ c/ q; _4 O* p2 }% j% g
4.5 第2步,准备一个工程模板) a9 x; z$ s9 s1 a 首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制): % V1 l$ d- M, c0 K. M8 k1 m% r6 u; R
% V, E( k( x9 B Q 4.6 第3步,添加RL-USB并配置 看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。) {+ ]2 E4 F' z7 ] c1 ^$ x : w* ^/ d; v! _! G$ Y. T/ A& L 4.6.1 RL-USB相关文件和驱动# ?3 q" c: K# r1 D/ c6 N5 F8 _ CMSIS-Driver分组中添加USB Device驱动:6 Q! O$ R1 @6 k6 N
! O9 G( j! V, z 添加USB驱动:* H, W" A% X8 j9 d [/ g9 a0 x- d, u& H/ J8 A; W
添加RL-USB并配置:% m, |3 \" ]. P / s4 c7 u9 U! t4 W. @6 o
我们需要的都已经添加好,效果如下:, K) Q* b8 y8 ^1 p
/ K/ p; }/ \5 v9 J 红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节): , f1 l' Y- r; \( h( D, S
4.6.2 重新添加被隔离的CMSIS-Driver文件 将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。7 {! X5 i H0 G. u# F) S$ P # V) k5 d7 Q, A1 T# y8 u
RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件 ' n: Z0 t0 M8 w6 O' @' l
, j! }% x, M- U! Y 内容如下,这些文件是来自MDK安装目录:
然后将用到的两个文件添加进来:9 g* ~9 D! D8 }; J5 R2 ]
6 J8 E1 S- `* k: `6 V 4.6.3 重新添加被隔离的HAL库USB文件 文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来:8 J+ K4 N. ]4 N3 b& k1 U
4.6.4 RL-USB配置" A z. |1 K& M0 g 添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。$ |8 G- x9 Y5 e1 x 5 _# G* l' W: `' i, g6 h& I* @4 k USBD_Config_0.c文件配置:: _7 j2 x( i: y& m
注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为: osPriorityAboveNormal: & V- R2 ?5 D: F8 M1 ]
USBD_Config_MSC_0.h文件的配置如下:6 `# K$ R, m2 {6 w E" i A, j0 K2 z. R( }; b5 v2 l/ n
+ l j* |9 s" F" F 这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。/ {; y4 j* k6 E
4.7 第4步,强制运行一次CubeMX配置USB3 ^8 g+ L* z: r9 `$ P+ R) D 我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。& {% E# M: T4 y: g 打开RTE环境,点击如下按钮:3 I; z/ u4 m8 d* K
( j9 Y$ n, h- Z9 z, b5 m9 p 弹出的STM32CubeMX配置如下:
. T d2 I" x4 p: q 修改位置1:用于选择仅使用设备。7 B) B% C6 f7 i& P2 D5 ~ 6 |' f1 P3 c4 {0 G 修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE”9 K# X7 D j6 T, c. z . q) r4 W; l' Z8 D8 U
; f0 ^% Q4 v. T 然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。( d2 e+ M# c! d. y& y' p3 E, W
重新回到MDK,会有一个对话框,点击“是”即可:8 f/ Q( e. c2 F$ _
配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。
4.8 第5步,修改文件USBD_STM32H7xx.C 这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:
修改后的顺序如下:# m0 W3 p1 X5 J5 |3 T : {% u( N4 K1 E x9 ]( [* ^
4.9 第6步,修改文件stm32h7xx_hal_msp.c 需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:" h$ G9 Z: |$ u' `! l4 h
" ]+ _4 C! J/ g7 h; C 4.10 第7步,修改文件includes 添加USB头文件:#include "rl_usb.h" & `' j6 v$ {8 w1 {: v! l- @2 e/ |/ Z #ifndef __INCLUDES_H__6 E! q* w9 P. t #define __INCLUDES_H__( a+ Y4 r( F5 ]" g. j* o2 a3 q" _ /*5 _2 ]4 o# p: P, |, m8 w ********************************************************************************************************* * 标准库# \- ]. |3 }, _$ j( ^ *********************************************************************************************************' g `7 n6 X* n" p8 [1 R: o */+ I0 D% C3 O8 n1 i #include <stdarg.h> #include <stdio.h>, W) A9 |# U C #include <stdlib.h>. ^0 |8 M4 Y! `0 o #include <math.h>1 o1 N, L( T9 w# Y 2 c; [& T' y. P8 j: { /* *********************************************************************************************************/ c. a1 N- Z) m# x$ z * 其它库5 U& F" m' N- P, ?6 R: x9 I$ e *********************************************************************************************************8 _$ c5 T, p' {3 Z# k/ q. A */ /*/ u; Q3 |4 U! X! ^- {- U ********************************************************************************************************* * OS和系统库 *********************************************************************************************************0 J+ _/ J: r8 N1 N */( Q* E" f' M& I4 y #include "cmsis_os2.h"; p9 w* x1 N1 l6 w' o #include "rl_usb.h"- N( Z" B/ ~# m! M3 W6 V & r8 R! p3 Q% ^# ~; G9 k- x /*1 a6 D2 S" ~# }9 T/ J *********************************************************************************************************% F/ O1 k: N/ p5 v% x% C3 b * 宏定义/ s) B. O! L% P5 ^3 K- i: m ********************************************************************************************************* */ . p' h6 A) z( C' y; p ) S2 C# ?1 a% c3 J /*- b& I2 `+ a4 l$ \! j( [ ********************************************************************************************************* * APP / BSP ********************************************************************************************************* */, p( x# c3 _. t$ P: N$ _ #include "bsp.h"+ O# R l- S# E3 z . J& m1 t" F1 {/ m /*" c8 R/ g( Z! }5 T P8 Q ********************************************************************************************************* * 变量和函数( K' H% j! e# Z) s! y- j! v ********************************************************************************************************* */: t [) O- y+ m+ J5 B' H* @ /* 方便RTOS里面使用 */ p4 X- \' T0 b extern void SysTick_ISR(void); # k" e2 ?' |6 W+ E1 i4 U3 i* ^ #define bsp_ProPer1ms SysTick_ISR) Z. I1 i& r5 R, p8 s+ s/ H 7 x* J3 Z/ z c3 m #endif /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/+ x& M0 ~( q: s 4.11 第8步,添加两个应用文件/ g( a7 M5 b- H2 j 为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下: & t( B" O: p0 d2 o* }! D
4.12 第9步,添加头文件路径 添加头文件路径: ! V5 }$ N6 ], o6 S. ?$ U1 N4 ^/ M
4.13 第10步,创建应用任务(重要,注意启动任务)+ H$ Z" S8 \. @; q& H% u/ d3 k, T2 r 应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:2 W8 u5 E) T8 H6 y" J% k AppTaskUserIF任务 : 按键消息处理。. w$ r( @% F* y% R AppTaskLED任务 : LED闪烁。 AppTaskMsgPro任务 : 消息处理,暂未使用。 AppTaskStart任务 : 启动任务,也是最高优先级任务,这里实现按键扫描。# t( z, b& {# N6 G osRtxTimerThread任务: 定时器任务,暂未使用。* ~7 P( \! V+ O+ X + ], F* w* L& R" k 任务栈大小和任务控制块定义如下: h' O2 N" c- X; B/ V
任务创建:4 c/ ^) x7 Q, O# Y- `* ^$ p' }7 r
这里我们重点看下启动任务,主要做了五个工作: 外设初始化bsp_Init。 任务创建AppTaskCreate。. m/ n. G$ X, l# I2 T; `5 a 初始化USB并连接电脑。% W: @: @5 `8 C3 U8 t) b- U 需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。
4.14 常见移植错误总结 编译后提示如下错误:! c% N& Z( A3 G$ j) X error: 'Driver_USBD.h' file not found8 a7 ~- Y; Y+ S% q2 s) R/ U % O! ?/ _, e6 [% }+ i0 R5 `: [ 解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:8 ]2 [. D( F' U5 @. @ ( L) |1 z7 C/ A n
提示如下错误 h. _# M' Q5 r; j# l6 _ unknown type name 'HAL_StatusTypeDef'6 n, [! C* u! k' @: j# m" J 4 g9 a0 X1 h2 w( C/ ^9 j5 M( ~$ h 解决办法:本章4.8小节。 # h$ s- v. k5 Q* g* q3 t* H 4.15 使用的MicroUSB接口并注意跳线帽设置/ U6 h( s( c( s 本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:3 H5 A1 d: X u% J( a v3 f& ] 2 ^ D: e$ y4 @: l L
注意使用的是MicroUSB接口: 2 s& V' |" `- j8 I
/ L. w. [: [8 ~8 V7 P$ D1 K 注意板子左下角跳线帽的设置: ! n7 \8 z v2 U$ b: H4 t0 O
# H- G5 J# _ _- E5 J- q1 h 这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。 4.16 实验例程0 P$ @# ?6 X+ E# y+ s( z 本章节配套了如下几个例子供大家移植参考: V7-4001_RTX5 Kernal Template- N$ U. \$ y: m \ 7 C( s& v* G; k* {# [3 U RTX5内核模板。 ) {+ _* H% T% n; k# O* X( Y- J1 | V7-4002_RL-USB Template! R/ ^( }. M" Z9 M; X* g RL-USB工程内核模板,使用内部RAM模拟了一个U盘。7 P, u* b: H* L" i# U MDK进入调试状态后,选择周期更新:
然后打开调试组件,注意和RTX4的调试组件位置不同:( |) p) Q8 q. Q) X4 ^2 T + \! ^+ P3 i/ _- c3 B$ S
4 w/ ~) ^- s( p1 [* ^+ s8 J/ W 然后点击MDK的全速运行,2 z8 v* ]) V/ @+ C# P, ` 1 Y. G( X Z4 i* J( _
至此,就可以动态实时查看RL-USB的运行状态: . k& o; |; @, N. }
4.17 总结 本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。 2 H3 R1 _# V$ _" {# y6 a5 W2 y 2 \1 U2 u; v* |! e7 S! F* M |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版
好好学习