STMCU小助手
发布时间:2021-12-30 14:01
|
4.1 初学者重要提示7 H. x* h* f3 L 学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植 STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,详情可以看我们STM32F4开发板对应的RL-USB教程。 本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。; g$ @0 o1 u$ K+ f 4.2 移植RL-USB整体说明* k% r3 J3 n/ E/ ^4 m: @! s! ?8 Q 移植之前,有必要对移植过程有个整体的认识: 第1步,准备一个RTX5工程模板。1 c& Q" W9 Q, y, W5 Q 第2步,移植RL-USB。& ^, [" Y" W$ j/ C n5 V 移植RL-USB是采用MDK的RTE环境直接添加。当前H7芯片使用RTX5强制运行STM32CubeMX,所以需要大家提前安装好STM32CubeMX V6.0或者以上版本。. `9 x2 }4 [$ Z' b: ^- H% l1 u 第3步,处理HAL库时间基准,MPU配置等。) C: c6 U4 s# d) W7 u1 s0 D 第4步,创建应用。 总的来说,这4步就可以完成移植,下面将STM32H7的移植步骤和注意事项为大家做个说明。% W& A2 T. v2 Z $ h. ^% ]$ \) c5 N 4.3 了解RL-USB模板框架设计3 K, B- e- I. m, \, Y7 L2 Q5 M 移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植: ' U+ p6 j; ^: a( y0 q6 ~
# p% N( A% K: B* O4 X/ G 框图如下:
4.4 第1步,安装指定的MDK软件包 移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版): CMSIS 软件包使用当前最新的:V5.7.0- N, T. J, a: O" C& W STM32H7使用当前最新的:V2.6.0 STM32F4使用当前最新的:V2.15.0! B0 o; s# h( x STM32CubeMX使用当前最新的:V6.0.x3 r4 H* g) }# M1 y' h% k9 A5 ]+ k' [ ARM_Compiler使用当前最新的:V1.6.3* V& N. G1 T1 g RTX5中间件使用当前最新的:V7.12' v. h$ N5 X% T; v2 @ 3 L& N9 [$ U+ s) Q! s " Z: ^ {: J) \6 W3 _ 不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:/ Q( S" D6 J: o+ W' s3 o
R7 r, S7 n+ w/ ~6 | 5 M l4 s Q; j" V9 B- P/ J$ i! P 4.5 第2步,准备一个工程模板" |* h* D5 w! z% L+ ~, j* ^ 首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):
' w. U' e1 y( {& e" D 4.6 第3步,添加RL-USB并配置 看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。6 f8 j5 z. H/ A# |$ k% T- s, \0 ^7 X 4 R. s9 g) c' O( G% k; g9 ^9 l _ 4.6.1 RL-USB相关文件和驱动9 n3 X6 ^8 ?1 n/ Q+ z% g CMSIS-Driver分组中添加USB Device驱动: % C$ S, g5 b/ T
2 M( Z9 Y0 W7 ^ 添加USB驱动:
添加RL-USB并配置:
( A* X1 @. ?% j6 O/ J) C 我们需要的都已经添加好,效果如下: 1 A7 ?& b- }$ s: R5 u. A$ T/ V
& \: T) M+ j8 ^2 M 红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节):. n( G* J5 C$ c n: H5 p1 H
4.6.2 重新添加被隔离的CMSIS-Driver文件 将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。+ X& J( Z* I) o6 D2 P. t 1 I H& j" R. k/ k! @
5 E8 v3 H& _: i2 b RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件6 K( m; a; T, g0 }- _% p 9 ?! p% D ^# O! \ z
4 l1 D5 E0 H: K& p9 [& j 内容如下,这些文件是来自MDK安装目录:
: @0 l. `2 H0 r- n( o* ` 然后将用到的两个文件添加进来:
8 E: O8 b" `5 [& K1 `" \8 X# c& P 4.6.3 重新添加被隔离的HAL库USB文件 文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来:4 s, M4 t2 y E; c2 l2 t
) t$ {- }" |5 z$ ]: U' r7 }3 H1 Z H2 k 4.6.4 RL-USB配置* c3 M" J% \/ V; P 添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。 USBD_Config_0.c文件配置:
注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:% e2 a6 z% T0 s5 e, J/ Q: a# M( {/ a/ ? ' V& n- E" q/ M+ {) A osPriorityAboveNormal:
USBD_Config_MSC_0.h文件的配置如下: : b# W8 R# G# m. R
这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。/ C$ X6 P( v" x# [) z4 |- [ & @+ `% v5 J1 v3 e5 f5 [/ t
" G4 t7 F* y9 R- t- v 4.7 第4步,强制运行一次CubeMX配置USB B1 v$ A k- S( |( I8 ?' }& e; k4 ` 我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。% o0 i* n# ]7 ?7 s& {2 H2 U8 G' O' S 6 y `. R. K0 n( J 打开RTE环境,点击如下按钮:: ~, W/ b% D$ y3 |# c5 _2 M+ h( S4 ?
弹出的STM32CubeMX配置如下:& I v! W$ R: ^, A9 q ' G7 u; M8 w: p& Z$ K' F4 \
9 c" E! v$ S n( |9 k* u6 Z 修改位置1:用于选择仅使用设备。% ^, o; E9 O" x8 q 修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE”+ z4 O8 i/ c7 Y8 F6 P% G
然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。 % N' G, d/ i% l0 \
& [, w% j0 l- ?5 H( ]& h) Z 重新回到MDK,会有一个对话框,点击“是”即可:
# s1 Z8 W! u- A; @# D& ^0 Z x 配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。 7 T; D' @) s1 @
" _+ F% n8 I0 M 4.8 第5步,修改文件USBD_STM32H7xx.C 这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:' ^3 a" e. r6 g! ]( q + ~! P! a% q+ L' X) y! z- d
修改后的顺序如下:' B% M% b! J! ?' b* Q, Q - }# Q, b9 h, D% F! _
4.9 第6步,修改文件stm32h7xx_hal_msp.c 需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:7 u9 A V0 c* F& C0 e1 n) [4 @
+ E& P5 X4 i; U* | 4.10 第7步,修改文件includes/ N' f7 Y' Q, B! t, p6 ^( l 添加USB头文件:#include "rl_usb.h"8 {) h& N6 l7 T% `# Z6 B( [ T #ifndef __INCLUDES_H__ #define __INCLUDES_H__ /* ********************************************************************************************************* * 标准库 *********************************************************************************************************0 S4 H* t( Q, k0 z0 r7 F% }9 I */ #include <stdarg.h>2 h7 t2 f$ G4 p! b8 e( U* } #include <stdio.h> #include <stdlib.h>% |( |, w8 }2 z$ T% M* z #include <math.h>2 U$ e4 s/ [( m* a $ B7 X' ?( S M) o 9 E1 a5 L- `* }2 i1 |* P1 r. W. v' o /* ********************************************************************************************************* * 其它库* X/ v) s6 r7 ]. I9 w! ~/ Q5 f/ | *********************************************************************************************************) F7 c$ N+ i2 R+ G+ k: g */ 4 L% Z* @3 P& D& n) n3 ?# U /*, \' ^2 \# c& E; x6 G *********************************************************************************************************8 a& L+ {9 f2 U5 t8 ]2 R" Y * OS和系统库, ?& q2 V4 N1 L* [6 L ********************************************************************************************************* */1 a- m8 I% S) w6 v/ s #include "cmsis_os2.h" #include "rl_usb.h" # U [* o( t4 e7 h8 C, I$ [ /*& f+ Z6 m- J7 ~: N# C z *********************************************************************************************************; C% q% W( S% p; t) x" ]! M+ e * 宏定义 *********************************************************************************************************/ Q! Q: @7 k4 J9 U */9 w( ~" J; t( F$ t6 G 7 c! f0 {5 u: u + c+ P' f, |! v /*1 U+ N- W/ a1 W" b) G1 G( F ********************************************************************************************************* * APP / BSP. _7 s$ o% [* X, T *********************************************************************************************************) w# S8 I6 {5 z. V */ #include "bsp.h"( d8 B1 H- {4 x9 S% E G- d . @4 d: s" ~; ~* n /*2 O- q5 K& ?9 C" T+ y2 G }# t ********************************************************************************************************* * 变量和函数& d8 p/ D' o) e4 l ********************************************************************************************************* */ /* 方便RTOS里面使用 */ extern void SysTick_ISR(void);2 S; m$ g3 u( \& ], A& O #define bsp_ProPer1ms SysTick_ISR #endif ' Y; q+ A1 Z7 r; c1 q /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/! I% m+ K- {( q+ m9 l, U 4.11 第8步,添加两个应用文件: N1 }, e+ s/ n W/ }# O 为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下:6 j' S+ N1 j! b6 L9 J ( {1 V# k$ j7 H* W8 G
4.12 第9步,添加头文件路径: I3 a2 ^, ~9 @ 添加头文件路径:' l3 ^9 A) I' H$ `' a
4.13 第10步,创建应用任务(重要,注意启动任务)' g4 M u! b' R& ^1 Z* T+ _ 应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务: ; p% A* C; s/ u! h& B" T( D AppTaskUserIF任务 : 按键消息处理。1 K8 U1 ]7 D$ v: p: q$ @! Z8 f6 w . q! }2 Q* z1 K5 q- C4 H% L AppTaskLED任务 : LED闪烁。 AppTaskMsgPro任务 : 消息处理,暂未使用。 ! f, A8 ~( ]3 y: {, } AppTaskStart任务 : 启动任务,也是最高优先级任务,这里实现按键扫描。- b0 g! f6 h& c; T _ 0 p: c( b: P* H1 P3 f osRtxTimerThread任务: 定时器任务,暂未使用。 任务栈大小和任务控制块定义如下:4 {. l ?1 k8 G- B2 s ' p1 [! F- L6 ~1 X$ C; ?
任务创建:* P' P1 f5 d' O7 h$ q5 G# S / H4 {# x" c. S! Y
这里我们重点看下启动任务,主要做了五个工作:2 E+ T$ g/ l+ Z7 E \: u: }# ]0 ~ 外设初始化bsp_Init。$ ^8 ~4 Y2 {) p8 J 任务创建AppTaskCreate。% z8 v* d3 O" O1 V 初始化USB并连接电脑。7 f" V2 P5 O& g1 b8 B 需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。
4.14 常见移植错误总结 编译后提示如下错误: error: 'Driver_USBD.h' file not found6 L: k5 R- v. I: X( g* }# [6 K 解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:
+ A) @5 j2 d6 E 提示如下错误 unknown type name 'HAL_StatusTypeDef'# R' F7 U8 p# G8 \ 解决办法:本章4.8小节。 4.15 使用的MicroUSB接口并注意跳线帽设置' I& r' t1 B$ @/ H4 n8 Z# ?+ A 本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:
注意使用的是MicroUSB接口: ; T+ n" @9 t5 K0 m" L% C8 n5 F
" a; Q8 j) O6 P7 B( S9 S 注意板子左下角跳线帽的设置: ' k6 j' ^& V# O$ C
: ^1 P5 t, ?1 \ 这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。$ G. ?- V- P2 l + A; q" r3 d, o' U5 @* u: ]: F 4.16 实验例程 本章节配套了如下几个例子供大家移植参考:' H! _. m( n) |3 J/ T- q( E" r . i' v2 K1 y+ n4 @ V7-4001_RTX5 Kernal Template, [4 v5 v& O) }4 f" s/ K! r& [* q- M RTX5内核模板。6 _5 f4 ?, d% ~+ h4 i a( i ] ) ], N1 M) A/ Z V7-4002_RL-USB Template% O6 {9 u" J$ _* h$ G! U2 c RL-USB工程内核模板,使用内部RAM模拟了一个U盘。 MDK进入调试状态后,选择周期更新:
2 V' b* g# r' k 然后打开调试组件,注意和RTX4的调试组件位置不同:+ Z7 E# W! S) h7 t. s9 c
然后点击MDK的全速运行,0 g+ |5 g! k" p: v
至此,就可以动态实时查看RL-USB的运行状态: u Y/ [+ l- i' S* B' y- n( R ! A- x- y0 O% \# Z* M/ a
$ B$ x: Z4 C. E: f9 L H 4.17 总结 本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。 3 `% p( v* _: K, U ) |$ r, B* Y% w# r 9 H# f: E: E0 n( R: W3 H r " ]5 v8 w, U, W# S6 U7 Z |
【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实现温度、湿度、气压数据读取
【福利三:逢7发帖赢大礼】成功利用STM32H743VI片内SRAM12和DTCM空间(完全胜利)
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
【福利三:逢7发帖赢大礼】使用惠勤致远STM32H743VI开发板+ST7796并口彩屏移植LVGL9.5并分享一些额外内容
【 逢7发帖赢大礼】7、TouchGFX中实现云彩流动效果
微信公众号
手机版
好好学习