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

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

[复制链接]
STMCU小助手 发布时间:2021-12-30 14:01
4.1   初学者重要提示
* T7 O9 z) b8 W. o4 g" k  学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植0 \5 b8 D) o/ O, o* I% s
  STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,详情可以看我们STM32F4开发板对应的RL-USB教程。
8 t2 g; b/ R3 h! T$ q! u  本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。8 U; \- }  A, n
4.2   移植RL-USB整体说明
6 {, U# v, C5 \+ n' F, X1 ]移植之前,有必要对移植过程有个整体的认识:- _% ~. `( k0 p( W7 R* \2 Y
- [- `! x% c& F# J) _/ {! X
  第1步,准备一个RTX5工程模板。7 c& u$ ~+ D: Z- B  V
  第2步,移植RL-USB。0 k8 w) o$ ?/ K6 ^
  移植RL-USB是采用MDK的RTE环境直接添加。当前H7芯片使用RTX5强制运行STM32CubeMX,所以需要大家提前安装好STM32CubeMX V6.0或者以上版本。# G3 @1 ~" N4 G' p
  第3步,处理HAL库时间基准,MPU配置等。
( _! _% t5 I0 G0 ~  第4步,创建应用。" E2 w2 ~+ }# d% H
总的来说,这4步就可以完成移植,下面将STM32H7的移植步骤和注意事项为大家做个说明。2 X5 o. z' W; ^- [3 S1 }6 m; x
; J$ ^2 \' L* N
4.3   了解RL-USB模板框架设计

  o* r4 x. D! l4 G移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植:+ H7 m4 X* @4 f6 j

8 ?4 U5 @- b" @0 ?5 n( \9 m
9c6a4f191f47051f48c46fad67830cf5.png

5 S9 q) L4 K' ^- G7 \/ a% s5 f; ^
1 p6 I- ?( s3 |0 g& r& F7 W框图如下:
# V# [' g: ^9 b: ^2 @
( p0 T* X3 D& O7 b6 b
5d53a3abf7c75f1cb8292dc449988f1a.png
+ ^6 I7 G$ y2 `% t% A

+ O5 s3 M5 j: B. g4.4   第1步,安装指定的MDK软件包

' o; d! q- c% s$ n) a0 j* T4 q移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版):
2 O, X2 J- ~/ @$ x, [: {/ H; r0 A3 m& e5 l! `6 }, w) F5 F9 h8 V
  CMSIS 软件包使用当前最新的:V5.7.0
4 m* W/ v7 U7 G4 t, M  STM32H7使用当前最新的:V2.6.0
- P3 d, ]9 y- R  STM32F4使用当前最新的:V2.15.0' {4 G4 Y/ V- E7 x" G( |0 A5 ^
  STM32CubeMX使用当前最新的:V6.0.x
5 h) a  G" f1 ]2 h% n0 O  ARM_Compiler使用当前最新的:V1.6.3) h, T) O3 [4 `* v1 |- M1 Q
  RTX5中间件使用当前最新的:V7.12
1 ?. T7 d$ }* d# H
2 U! ]7 ?& ^5 M9 z$ \( E# F' U( [: s9 @3 B- f
不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:
$ ?0 W2 _8 F& r6 u$ r9 o 7264b6fa8f70af9cae9f03812878d357.png
" P. b% ]4 F# A4 y; |) C" e5 U
1 M$ _" t6 a9 v$ L4 j8 [  g5 X+ a6 x" v
4.5   第2步,准备一个工程模板
" a( f) {, ]3 ~4 d- R" v, v  s5 j
首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):
2 D0 J7 T( A3 G' v, C; [
$ S* @- H* \( s: e, d1 e/ D3 q
74269e50c64ab536eeb86097f3884ec3.png
! X0 {6 `0 W0 e! U& Q0 c. d2 }
- F+ V" ?! p( y& d& |% M# U
4.6   第3步,添加RL-USB并配置

  l) S6 e9 K; B( E% J' H看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。
0 L0 ^8 V/ n/ D& Z& X. G, ]% H
+ h  d$ A; K1 u5 m. c4 b4 g4.6.1      RL-USB相关文件和驱动* }: k7 G5 q  u) S, L; [0 w' ^
CMSIS-Driver分组中添加USB Device驱动:. Z# G# C* k; I5 Q% u1 p' j8 M# v
. u5 n: s; Q. _- |" d
ea12a66af6e60e048bf1b9b81e9aa08a.png
4 R# o' I8 O& ^: Z; |* T* i2 }/ R
2 J; ?! w+ X+ _
添加USB驱动:5 j% p  v+ k/ S& j) m

4 s* J' p0 Q# K$ T0 L: f# V7 c
b683b1361cf7de9821e95e9473212e41.png
! @- j3 W6 f( x9 U/ i

% l; ]  d" c) h6 I8 E# r$ W+ j% P' p2 U添加RL-USB并配置:8 _% R+ H$ d4 W* Q

  Z4 J( J' o" |0 `7 l$ i
4d32bb88eee575ba6da2871d56a1ffde.png

5 Y% j" L4 M# y4 Z; r! b+ }9 S
) D' b/ \7 \1 J; e5 K4 e我们需要的都已经添加好,效果如下:  f4 X1 ?7 V, g: s
, C$ A; O+ o' H' b/ u) m' m5 t
6ce0595add222d31f90d93e116cad4f9.png

4 B; @/ v- n! u" \# i
# K6 ]5 T0 F0 ~; _9 X7 l6 J红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节):9 C- W% Z" \) E6 |% m

; x+ ~. ^3 C. ?0 O
f4cf0f77d674b6a83289142025e72131.png

# @* H; i6 Q5 j) o( m# u4 x. m5 O/ }! [
4.6.2      重新添加被隔离的CMSIS-Driver文件
# \, {; w  e  n% Y: E6 n# l
将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。1 R" }; b! W" V/ k/ B3 @7 R. W
, |* j; ?: s3 F
52112e844aee805fc01a6d40cddc00a7.png

6 k* j" {& g  X- X! k, Y' l7 P3 w  k4 O6 F( v# T$ H; I& h% b9 w
RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件
+ Q% N5 t0 F2 b. ^
, s8 w$ p3 [+ g( I8 l/ x
7039175ef77263dc5dc73a486e83950f.png

! [. |% q  U' P0 J. T
- Z$ _6 Q; L- z% R内容如下,这些文件是来自MDK安装目录:/ {7 S: ]4 t- I0 z, x$ c4 f, ~

5 B: L+ O! n: D
17b8ba3a04288a0e29d94e7ad5f45325.png

+ j( {  M' H2 p
7 |; p2 U' }4 }/ s4 a! i然后将用到的两个文件添加进来:
7 ?5 r& _9 z. \# Y- P5 ]# B+ F
/ Z2 {9 M! @( m2 K( v1 D$ ~
9ad9fcc23d96b8aec42538dff0552a2f.png
$ H& E' r! P8 F( r4 ]1 s, ^9 l

8 D) U9 W1 ?5 `( b. x4.6.3      重新添加被隔离的HAL库USB文件
5 ]* D1 {5 z$ u文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来:
; r5 ^+ S8 o/ D# D4 b7 n
6 u& m) q. M* m4 b  {
48241523bce89ad84d2851afef1384e2.png

' K1 W: q8 K, ^( Y4 D+ `( Q! M' E! h; Q8 j; ]# t& n3 d1 A
4.6.4      RL-USB配置2 N/ X& k5 H+ [6 m7 T9 q% g
添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。
& P5 T" O# E0 d1 L8 Y3 R# d5 L  \- t7 D" N
USBD_Config_0.c文件配置:
# f5 M1 n, |+ G& W# p, r
, m/ p5 i6 O! G' h0 t5 O
c5dcc4510924d2ff0e75092f7d4ca9fe.png
; Y& G4 ~( ?) Y- }5 o# ~% t. _
8 ^5 P4 ]: m9 \& J# y9 X
注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:
4 [% r: |% z: W8 y8 S& }4 W
/ X! y9 u& p' \osPriorityAboveNormal:5 e9 S! g3 U# K8 o; ~
6 Y% ?& S% h/ J0 q2 y
f62a8fad5d1ce978c1730b2ad87955e0.png

, k/ [# `) j" O' y
$ x8 A( |$ \0 q: R  pUSBD_Config_MSC_0.h文件的配置如下:
0 {$ \% f* o/ J2 ~
  v6 J3 Z' e! c0 n) e3 Z3 t( l; Y
1cffb6b1fa60821b7a7ab7900f7f40a4.png
0 n& L8 A5 x; N2 y0 ~
8 s2 d$ ~1 {* Q, ^
这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。
' r% ~6 n2 q- @4 Y% \+ R
; C9 ~4 `" d* ?9 Z
fafa76af25304dc853509d2c4dc839f8.png
. ~! ?; I' D4 Z
  [! {/ y; e+ J& a, C5 n
4.7   第4步,强制运行一次CubeMX配置USB2 g" s1 H# P$ }+ _7 J$ F$ j
我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。
; `8 B( m1 D- Z- H/ \2 k1 }- P- `
# ?% w1 ~/ t/ B- n: J, C! B打开RTE环境,点击如下按钮:' B& ]' [4 J( w1 m2 }

  q* r% o6 n( q& b& m& p1 ^
6d97a5c7ce435822748232a4fe1b0e64.png
4 ]9 K, l( l, N. O6 C
+ C0 i0 S( E: D' F
弹出的STM32CubeMX配置如下:4 U9 d2 O& t2 z( R$ K9 M9 Q/ ]% f

0 G( u1 Z) a+ [2 i& {) D2 l$ v
2f47e57c5008dce25c2c00afe900142c.png

- |% E4 s: K1 B; m
; [1 v/ j- G/ g. ^" y0 F- }. [) f) Y修改位置1:用于选择仅使用设备。
$ M2 }) D0 J" L: X2 o
; g, J6 B. Y# {" z* {' |修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE”
8 g+ J2 s+ r0 k5 e( n% o- {# o8 ^7 d0 T: f" K! o+ _4 ~- V
2259b40b2cc2d5b5819f6ac79dd22c3e.png
. P& P" Q: `! |+ \5 w0 ~
  ]$ O5 D% Q0 J" z1 Z
然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。* S7 W& l( U( v

" @" `& b' y) S% q1 N
17f991df1ea61c9ffd2dbb4c7216da25.png
* B6 I5 T# k' v8 w8 y1 o- F
; C# h9 J/ [2 j" W) `2 B3 P
重新回到MDK,会有一个对话框,点击“是”即可:; l* I( q  ^# M6 h* ?0 t3 ?

) Q& k. B8 b. a6 ?' G5 R9 V/ Z
292e9c0668f8c166995f17f5d58cc2f8.png

, V8 y' w/ r# U: i" H1 k$ {; @5 k& Q( g& I% r
配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。
/ G5 C) [- S& e. v  I1 o- D4 `5 c# U. J1 ^4 ]) d% f5 B0 I6 h
db9b1da83c41e9807da4cae3b2618f11.png
' W$ o  A' S* T2 \1 Z9 `# }. Y0 S

$ D$ {& o" S3 X* n4.8   第5步,修改文件USBD_STM32H7xx.C
4 W6 f+ r1 t$ w" A9 `这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:: i- f$ Y) T# f+ E( q8 P# r
1 y! O+ o5 C- V4 z% U) B# J9 w4 e  B
  1. #include "OTG_STM32H7xx.h"/ Z7 S/ B' ^0 w! A2 L
  2. #include "USBD_STM32H7xx.h"8 N* C; {0 b. W% A0 ?# z/ E& t) B: Y! G
  3. % j2 r5 `8 `$ i$ f: B! h
  4. #include "stm32h7xx.h"
复制代码
* C; X  {/ D! L
修改后的顺序如下:& e- ^# g- M0 z- G7 O& F% Y
2 o# J6 p  i* s0 N! |4 {2 Q
  1. #include "stm32h7xx.h"( i2 Y/ i2 B! a- R8 B! i
  2. # H' `/ C) J) N
  3. #include "OTG_STM32H7xx.h"
    & P( |, y7 m$ t6 {; F3 t  v
  4. #include "USBD_STM32H7xx.h"
复制代码

5 J& a7 ]" p; o# N4.9   第6步,修改文件stm32h7xx_hal_msp.c
  e" f- ^- g' o+ ?- _7 R8 U9 v需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:/ A! g# {" L2 P0 s
4 j" Y% i& s2 A8 z. Z
5d9cadc09f4b5d106e20e496c919908e.png
  A* X: ~& W) ^2 C6 ^9 k+ }& F

, ^  k5 n# d5 C  m; {4.10 第7步,修改文件includes/ }% j! k: v5 n8 V- d
添加USB头文件:#include "rl_usb.h"
; F; ]# |! H, ]! V3 H/ ~( I
. g: `- n1 `; Z2 a: j+ H#ifndef  __INCLUDES_H__- v* m% O% H1 O$ w. N0 j9 u
#define  __INCLUDES_H__
" s4 `* u0 [. _
) y! b5 s( u* {5 N9 C# ?# r/*
1 k% b4 z& k4 q3 Z*********************************************************************************************************7 Y/ ?2 m3 T: {/ _) ~
*                                         标准库  U( J) V4 |8 X
*********************************************************************************************************% K5 s4 h4 H) C- O& ]
*/
" T, c4 g1 H  a# \" W#include  <stdarg.h>( w2 |$ I8 b' M7 X3 I$ I
#include  <stdio.h>
! U( [3 |) m' J#include  <stdlib.h>/ W3 M9 F" ^$ x' I
#include  <math.h>
) a: Y& L) ^0 i/ \/ O. Q; e4 W8 D& |- R0 [9 K

4 P* y4 P& Q6 L$ E# `/*
% T) j9 _6 T3 C% W# e*********************************************************************************************************3 [  F  U0 |4 J% i
*                                         其它库
9 |7 F0 I1 d$ ]6 |4 P# |1 C*********************************************************************************************************
8 ~) M- h( k8 j8 J- I& t& \  E; N*/2 Z$ h. q* T  m+ [

; }, Y+ U4 a) n9 m/ e( `) o1 H6 K
1 c, d8 R+ G* G" o% d* Q/*" m: M0 v$ _, H& o+ f
*********************************************************************************************************2 m: i0 E9 K, p, r" F0 ~' I
*                                           OS和系统库& u" K; e% M, Y1 B0 E; i% F7 l
*********************************************************************************************************, Y( [% H1 y5 W" A0 a
*/& p$ y0 X! l% M: R
#include "cmsis_os2.h"* U, G+ L* `( Z  ?1 y2 D( ^
#include "rl_usb.h"- h! ?( _- t3 r- e8 H

  m+ M( }, S+ [& w# w" K; t& R/ b/*; E! i6 q: O; [3 T  O8 @
*********************************************************************************************************6 u4 |5 q) E5 f) ~
*                                           宏定义
3 H  \0 Q, J( l: y, O2 Z/ S*********************************************************************************************************
8 K+ d2 U3 t; ~+ F*/" F5 I4 d0 q: u9 K9 r7 c. L5 ^
, B6 z3 r" A0 b1 |  D. s

$ e1 n5 v* X. `0 W" x' |
7 C+ @, _- }( ^$ z( Z7 L! Q/** m4 ^' }6 Z0 @: Z
*********************************************************************************************************
5 p" w0 l. q/ b* q*                                        APP / BSP$ O  Y7 g# t: c. D7 e& C7 n& B
*********************************************************************************************************1 C8 c& ^/ e; H" Z
*/
8 f& |& C2 C  N" H( R9 X#include "bsp.h"5 _' X9 h9 Z- B
. P4 s: o4 i, ^8 j

8 _+ F( ^1 t  N+ [4 e
6 ~* r* m: M$ l0 q/*! L# O  {% d, c5 N" @# v$ p
*********************************************************************************************************
4 i: `* I, `2 \*                                          变量和函数. p. p5 B4 g% ]! h5 p! `, r. t) w6 D
*********************************************************************************************************& G0 d/ J8 N5 ~5 Z
*/
7 Y2 b5 q1 f8 \1 n5 e/* 方便RTOS里面使用 */2 Q  ^3 h( Y# ~  t% o7 i$ _
extern void SysTick_ISR(void);
9 B+ Q( u6 ?: z2 E; `6 \5 t) L& P6 F5 |" M# b( P2 _' u9 P
#define bsp_ProPer1ms  SysTick_ISR
. I! \) D2 Q$ T" P6 A
" \7 Q4 c" F" \( ?/ @: `1 m#endif
3 E3 p; c0 |& m9 j$ q' ]3 C3 P4 V! \1 ]
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
! h+ j, B$ [; v+ @# W1 w4.11 第8步,添加两个应用文件5 O# g! ^9 M( k$ S3 V* w8 V
为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下:
% U5 z8 f2 ?, U* b& H: i$ ^8 M4 Y/ r1 x
, h. O! f: R9 D) F0 Y
0ff85fc9774973eb80c1dbfa6653222d.png
/ E/ M" M2 v, X& u% H7 U5 Y

, X1 W' p' r" G7 }2 \2 w4 {4.12 第9步,添加头文件路径
. `: y, A1 z  d添加头文件路径:
: y! q( G8 c3 `3 F% s5 v1 S5 u# T7 y' V1 b; X  R! e& c
3d601bebf02ab97843fdaf69cbe84a46.png
; F: F9 A4 k6 v5 I

3 J# F8 {) @  X2 s4.13 第10步,创建应用任务(重要,注意启动任务)/ U" Y+ T* ^1 r( r3 M$ a
应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:# l4 }3 E2 z7 q: p% M

! d( D0 r5 `! _5 }4 m& sAppTaskUserIF任务   : 按键消息处理。
5 n" E) ?0 ]0 x& y3 K, w
1 D& [: q8 N" I3 \1 JAppTaskLED任务      : LED闪烁。
6 L, j. s) `1 n, v& \5 P1 E, O" o) B: R0 v: d6 _  H3 Z
AppTaskMsgPro任务   : 消息处理,暂未使用。( x4 {3 @0 b, ?; I
: U) a* c  l. V! D& V; S2 F! h
AppTaskStart任务    : 启动任务,也是最高优先级任务,这里实现按键扫描。6 _+ ~9 x5 S0 a
2 s8 \* U" P. v9 k* ]
osRtxTimerThread任务: 定时器任务,暂未使用。% |3 K3 n3 F6 k- ~7 d: u" {

! W+ D; g' g! N  I- z任务栈大小和任务控制块定义如下:1 {2 {9 ~9 A& y) u0 h' _
, b1 l7 y% A4 l' X; X# H
  1. /*, h) V# C" u% j" S
  2. **********************************************************************************************************4 Q- u0 r; L! c* [4 d. x
  3.                                              变量
    - O# B2 t. I& O( D  b4 E
  4. **********************************************************************************************************
    - P3 t$ S# N, B, y( f! I
  5. */
    2 Y" Q: q1 h7 _0 X5 \2 _0 n* R: V# l
  6. /* 任务的属性设置 */: u1 W5 @2 L! B# i
  7. const osThreadAttr_t ThreadStart_Attr = / k9 n% u) W. [' K* z/ r
  8. {
    ; P/ T% r; N. S  V  \4 H
  9.     /* 未使用 */7 ~. B" k: z  T- e5 z1 i1 k
  10. //    .cb_mem = &worker_thread_tcb_1,
    , T2 k5 ~" H" ~- F+ c
  11. //    .cb_size = sizeof(worker_thread_tcb_1),$ \5 R- U& f- f& m( B
  12. //    .stack_mem = &worker_thread_stk_1[0],3 \" k, W7 |- Q4 k, B# x: S
  13. //    .stack_size = sizeof(worker_thread_stk_1),+ J( `: C3 w$ e7 c
  14. //    .priority = osPriorityAboveNormal,
    5 C* g( g& \6 q
  15. //    .tz_module = 0
    2 d) z8 U" a0 z3 Z2 n' e7 b6 e
  16. 2 |9 S% ]( |" c5 e( B' s, ]; f9 M& ^
  17.     .name = "osRtxStartThread",% [, V, u& Z, j, h# Z
  18.     .attr_bits = osThreadDetached,
    $ l4 a3 L7 w  q9 F' d9 j5 _
  19.     .priority = osPriorityNormal4,
    5 b& n8 A% `" |! [$ x. b$ _
  20.     .stack_size = 2048,( |: U7 F: L# A3 X; J
  21. };
    ) M8 D4 L- K+ B+ T
  22. 7 o9 ^: d7 ]) d5 b, y1 b6 o
  23. const osThreadAttr_t ThreadMsgPro_Attr = * S" \# i! z; l
  24. {- f3 F" x% V( {$ u  Q7 A; H
  25.     .name = "osRtxMsgProThread",8 m3 W0 Q: k& Q2 w7 x; i6 D
  26.     .attr_bits = osThreadDetached, 2 @6 p' M) L) n( v* A$ M
  27.     .priority = osPriorityNormal3,
    4 @/ g7 a, h$ M: T1 T
  28.     .stack_size = 1024,
    4 V% c  C' i; X/ M1 u
  29. };
    $ k5 S# N, L" w% y  J4 R% S

  30. 8 S# d2 F; D1 q# k3 v; @
  31. const osThreadAttr_t ThreadLED_Attr =
    ( N1 T/ s& O! T( M7 y
  32. {
    4 O3 L# d* D- p3 j7 _
  33.     .name = "osRtxLEDThread",
    % z! Y1 i0 E" K/ W
  34.     .attr_bits = osThreadDetached, " Q0 X5 A  v2 m, d
  35.     .priority = osPriorityNormal2,, H6 ?3 B1 O) Y5 r
  36.     .stack_size = 512,2 b3 Y2 I* M6 m" M1 |- b% E. r
  37. };0 ?, \: M% S$ t3 ~+ _2 q

  38. - F* ?+ i6 F; h
  39. const osThreadAttr_t ThreadUserIF_Attr = - q  I# S6 E$ B1 ]2 M- s8 n, |- ?- \
  40. {! B1 O. I# b0 C5 Z6 ]5 }9 x! V
  41.     .name = "osRtxThreadUserIF",7 Q/ b. T" w: `2 B7 b
  42.     .attr_bits = osThreadDetached, 4 A# l) _7 R% {2 t
  43.     .priority = osPriorityNormal1,: \; l5 k! v- B2 C1 [) v; z' k) ]
  44.     .stack_size = 1024,: D- {" z- }8 J  F( `  m
  45. };
复制代码
0 I/ z; |: ~: Q& s
任务创建:) z7 ~- Y" ~" f  d+ D- ^/ T

3 y+ ~2 N* V# L, U% y
  1. /*" _* l; x( N+ Q7 J5 m& z9 O
  2. *********************************************************************************************************
    1 t. O- |% o, d- f
  3. *    函 数 名: main( c0 s6 T: A' F; V6 U8 R
  4. *    功能说明: 标准c程序入口。
    4 t$ G/ D9 j* {2 k
  5. *    形    参: 无
    3 L. k+ c8 h6 D; Q1 W1 [7 v  K
  6. *    返 回 值: 无
    ( T7 _, o5 u: R. c- j( r
  7. *********************************************************************************************************' |3 ?/ X5 I9 q3 B6 J
  8. */
    - `# L" V) g1 Z; O8 O7 S! D
  9. int main (void) # ]" G: e# E# l$ n
  10. {   
    ' I/ W4 H$ ]5 M- `* a. x% f- o! m
  11.     /* HAL库,MPU,Cache,时钟等系统初始化 */
    / E3 r. S  d5 M
  12.     System_Init();
      i2 Q. E0 E- f
  13.   k/ h$ r  ^8 v9 O5 A( w: N
  14.     /* 内核开启前关闭HAL的时间基准 */" G! c" h4 a2 M% R3 W' D4 r
  15.     HAL_SuspendTick();- h) A- O  e. |
  16. ' p* v/ y- F0 k8 v+ f
  17.     /* 内核初始化 */( L: h6 X! z" n, H0 y
  18.     osKernelInitialize();                                 
    4 r4 s  o  k8 Q" G7 `$ k" i- F

  19. 1 C( Y& ^/ W" ~, Z  I
  20.     /* 创建启动任务 */% ]3 X# @/ H  y5 Q+ |, y
  21.     ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  & g$ f$ W4 I. s+ ]
  22. " g3 K8 m- g2 s' t/ s& u
  23.     /* 开启多任务 */
    * Q8 F, K, E; l
  24.     osKernelStart();
    ; ]+ c, W( M( U; O  o# t9 `$ n- ~% t$ E
  25. : i" s: S6 V" f5 J
  26.     while(1);  g2 M7 \1 x* ]+ l0 Q
  27. }+ L0 Q% Q7 u- e& v# x6 V, H* ~: x
  28. 7 t/ ]2 F1 t+ t4 w4 S7 L
  29. /*
    3 Q4 e, I) U# `/ z  O. |
  30. *********************************************************************************************************8 U5 u2 V5 H1 U/ @7 K' u( l5 _
  31. *    函 数 名: AppTaskCreate
    3 u  I( M0 h( `
  32. *    功能说明: 创建应用任务& l6 q) k9 F2 u- g0 i2 u6 O2 @
  33. *    形    参: 无
    & s9 k" B' J. r# M* d, W) ?( W; ]
  34. *    返 回 值: 无
    $ O, s/ Z7 }; t* y3 m, P8 v$ @1 e
  35. *********************************************************************************************************
    ) V& C9 a0 Z9 T) Z5 m
  36. */: x4 [6 n6 v, u: j% S
  37. static void AppTaskCreate (void)
    / V  x$ U5 S* Z6 @* e
  38. {' l0 o# f4 r4 X" u4 _4 u- n
  39.     ThreadIdTaskMsgPro = osThreadNew(AppTaskMsgPro, NULL, &ThreadMsgPro_Attr);  
    0 h; ]" k/ B" c; {! j
  40.     ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);  
    0 X- A% L8 W% g) t# `
  41.     ThreadIdTaskUserIF = osThreadNew(AppTaskUserIF, NULL, &ThreadUserIF_Attr);  . X: }3 k/ b) n: s( D
  42. }
复制代码
- W2 ^) l7 C5 A( k" Y# l1 F  a
这里我们重点看下启动任务,主要做了五个工作:' m8 x" D# h2 H1 X
/ |1 K6 L- _! q& L3 s) `: M, e! g
  外设初始化bsp_Init。7 R  y2 g2 u# b) `3 W+ j
  任务创建AppTaskCreate。
% V' I! d5 Z! q1 a3 b  初始化USB并连接电脑。$ ~& Y1 g: {+ c% l. `0 N- W
  需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。, |/ @  I: k1 Z$ }- V/ `1 W/ s# @
  1. /*
    5 M1 g7 H2 ^( o6 G
  2. *********************************************************************************************************' b' _2 }) L, Z/ ?" `
  3. *    函 数 名: AppTaskStart
    + ]4 V; J! |8 V  d( G8 f
  4. *    功能说明: 启动任务,这里用作BSP驱动包处理。
    2 O3 B& f  A6 c9 A3 c
  5. *    形    参: 无
    1 w: O: i6 {& w2 L) W% o( `
  6. *    返 回 值: 无
    " ]% X$ [0 V1 H4 z( R" Q$ l
  7. *   优 先 级: osPriorityHigh4  4 u4 B4 m( l" U1 K2 B5 B% |* B( _
  8. *********************************************************************************************************/ q% K8 k. j7 l) W7 ]
  9. */; I" d6 I; X/ X5 }$ W2 L# j) q6 j
  10. void AppTaskStart(void *argument)( N0 O' C$ d. N/ ~  c. i
  11. {
    1 @6 X! t7 [& z& _
  12.     const uint16_t usFrequency = 1; /* 延迟周期 */
    4 g2 }( h6 z* ^& p- @
  13.     uint32_t tick;
    " b; ^/ F* N: ^6 A' l
  14. & i8 t* ?( i+ y, t" d/ X
  15.     /* 初始化外设 */6 q, R2 B; n8 l8 U' n/ G
  16.     HAL_ResumeTick();) o) y  u9 _9 A( \$ X) `
  17.     bsp_Init();2 C3 d* \2 W! w
  18. . e8 D  F! b3 z" r
  19.     /* 创建任务 */; m0 B/ L, M) X0 Q4 s1 Q; h5 W7 e' o
  20.     AppTaskCreate();2 Y+ L) S2 W4 J! Z) x

  21. 6 w1 ]) m# W9 F$ M5 c, W' O- y1 n
  22.     USBD_Initialize(0U);  /* 初始化USB设备 */
    " ^9 C3 e" P$ D* i6 J: H5 g4 g
  23.     USBD_Connect   (0U);  /* USB设备连接 */
    * l- l: M, s. I+ s9 Z

  24. 6 S5 s2 R  Z4 }% D
  25.     /* 获取当前时间 */
    ! B7 V  {) @( E3 e" I, X9 Z
  26.     tick = osKernelGetTickCount(); & T) x- p/ X( J# X4 u# x+ j3 U) A

  27.   p  H8 z. H# p7 E: [4 F
  28.     while(1)
    # W1 L9 f( z4 Z  P+ e
  29.     {
    " F4 B% d$ O) N1 d5 V  I
  30.         /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */  [0 }) a7 w$ T4 ^& [
  31.         bsp_ProPer1ms();
    # E, Z5 k6 p6 D9 ~8 c" Z8 I

  32. 9 k4 D6 H8 Y; V$ D
  33.         /* 相对延迟 */' d9 y) [( |; ^% o+ l: N
  34.         tick += usFrequency;                          + T7 U' f' T% N- s2 ?' Y
  35.         osDelayUntil(tick);
    : z' S1 g/ A) Q% M8 i6 _
  36.     }9 q. J( I$ W* q- X" ]( m6 l
  37. }
复制代码
: v5 _5 w3 `+ ^* A) A* R' ~
4.14 常见移植错误总结' ^7 z9 C+ l) x2 r4 B4 e! R1 f
  编译后提示如下错误:8 o& |5 |, Q9 c1 R
error: 'Driver_USBD.h' file not found
& t  O: i& O6 s5 E1 ~6 U$ M) q1 H. B
! ^- D2 u# z; V3 |* A5 a解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:
) }! R$ \$ |) o2 h( x% S, y1 v( X0 p" E# v
d32a6c67848ac92bf4c29e0fbf5ef220.png

% Y  x# A. N" q$ K7 U3 }; Q% a) x4 |! {1 E# r5 N- \0 }: \1 a
  提示如下错误
2 S  o8 ~1 _  G8 u9 E3 D# I2 g) ~3 [unknown type name 'HAL_StatusTypeDef'
. f7 Z) R7 h7 P( d5 a$ i
1 ~$ P  x1 z7 [6 n3 ?& }4 ~解决办法:本章4.8小节。6 t9 X5 w* r* \% q: B

, c" \1 o3 k. }- H  K4.15 使用的MicroUSB接口并注意跳线帽设置
( o) r* P: d  p/ k0 g" M* n# s本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:2 R. r. Y2 z6 u3 o
! l# T! e2 k8 p0 _0 x1 d0 b
9c04c38f56dbbfd80201520f1e84223e.png
. g' Z; F; u9 q7 r) f5 W
8 ]: w; l, o6 w. v0 X5 h( U
注意使用的是MicroUSB接口:; o/ {3 C, q% h- K, r# a1 I# x
" m. H- a  R$ F" S7 C& m. F6 d" D
374a9b3f00b1d0e7cd589a59b3fe699a.png

( F/ C2 ?( I" B, C; D3 p0 L
! f' X) e9 |8 C* f注意板子左下角跳线帽的设置:
. l2 ~' v( H" }- b  t
3 W! z1 e  @$ x( x5 T
f13c6739f82641308861da50db97c44a.png

9 l, M2 `' _8 ?4 X5 D; A! |$ A0 C
这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。
% f- `: ^. Q- R* X* R+ Y
; I* y; t  v0 T* m! z7 l9 s4.16 实验例程, V! M6 B5 D+ E! P% ?2 L- ]9 O; b
本章节配套了如下几个例子供大家移植参考:
) y* v3 F1 r5 |$ h$ c! |+ o/ P- Y2 h6 J2 T6 T
  V7-4001_RTX5 Kernal Template
) b4 ]2 T1 o  m: L7 \" S  U7 G" ~  _) y! _2 G, r6 }9 @7 h
RTX5内核模板。
6 x! v& z# i7 {* ?* a9 F7 ^0 u$ F! ]+ w. ~6 c4 g
  V7-4002_RL-USB Template8 D* |2 _- c; V- G% Y& r% D: V
4 a' O! j, L1 s$ S/ o
RL-USB工程内核模板,使用内部RAM模拟了一个U盘。
. b1 h. \# v. N$ G! }. M0 q7 P8 ^, D
MDK进入调试状态后,选择周期更新:
, ~" E1 c( l* q
1 R! j( f1 ]# _$ n6 I
dca8f2e82304e411670c3194cde12230.png
" A7 t  j6 f0 q) F4 @: e) {4 V* K
& E7 d8 T# s) b- c
然后打开调试组件,注意和RTX4的调试组件位置不同:' u2 m5 U" L2 ~7 y5 _. D( C# I
- ]# {, ?" I4 o
9daa841c2ebfbe6204c5bb95355e5707.png

" Z$ y% ]1 V# _( w/ J3 A9 k& _
  }, ?% F2 V" _7 h1 X$ d& [7 p然后点击MDK的全速运行,
) N. B( o7 n8 ?( |2 ^( U2 t
4 ^! r# L$ ?  J/ |8 j8 l! K4 D
1d57a73648e5313c246a089fc2a85ac5.png
/ K/ r9 A3 S3 k

* v4 B6 `5 x* {/ R& ^至此,就可以动态实时查看RL-USB的运行状态:
2 ?8 |+ o* G1 m
9 O4 {- b" v# F7 L, ^6 L
1e9d6ebcc79d1df8a4302d0c846080e0.png

5 u7 t; x0 ]3 o! ^% G4 v# F/ T5 `; P
4.17 总结

  d7 c/ @+ x2 Y- O4 G) @本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。
$ B3 n$ ~# r; W9 b0 S. ?
; g8 G' G+ q% Y9 [; F
4 d3 _+ e$ d0 i0 A+ H6 i4 K8 K/ A. U' Y* R; A* A' o

' Y& `. H% H( O* ~8 e4 Y. M1 t
  S3 e3 x  f% t- S9 ^8 G/ \! o9 v
收藏 评论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 手机版