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

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

[复制链接]
STMCU小助手 发布时间:2021-12-30 14:01
4.1   初学者重要提示7 H. x* h* f3 L
  学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植
3 h, O+ N5 X( p8 @1 L0 r; i  STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,详情可以看我们STM32F4开发板对应的RL-USB教程。
% f1 ?1 `5 l9 K6 ?& k  本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。; g$ @0 o1 u$ K+ f
4.2   移植RL-USB整体说明* k% r3 J3 n/ E/ ^4 m: @! s! ?8 Q
移植之前,有必要对移植过程有个整体的认识:
: }' W. N# u3 _8 B6 l
1 z( R. K- H, t6 r( g  第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步,创建应用。
/ L0 N: Q6 W$ X" k总的来说,这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内核模板,方面大家后面移植:
' P' B  w) q1 P. S' U+ p6 j; ^: a( y0 q6 ~
9c6a4f191f47051f48c46fad67830cf5.png

& U* O$ j4 e* I9 ]# p% N( A% K: B* O4 X/ G
框图如下:
( m! d+ ]2 v& d
$ M7 f( T6 h" K3 G: X
5d53a3abf7c75f1cb8292dc449988f1a.png
  u7 C; q& N4 R9 ^' S6 a

" J( N( `1 H0 M1 b% w4.4   第1步,安装指定的MDK软件包

, q9 Z0 o/ x) I移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版):
1 a1 i' V" `. M' o. ~
9 f8 }5 T1 z$ h  P  CMSIS 软件包使用当前最新的:V5.7.0- N, T. J, a: O" C& W
  STM32H7使用当前最新的:V2.6.0
. H$ |& z4 S# k6 N! T7 H  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
7264b6fa8f70af9cae9f03812878d357.png $ `+ m0 P" r, r
  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,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):
& F! P3 T) R9 c
9 h& @6 I+ f1 K9 f) F" e" \1 Q' x- Y% j
74269e50c64ab536eeb86097f3884ec3.png

4 |" B- _( f' |4 {' w. U' e1 y( {& e" D
4.6   第3步,添加RL-USB并配置

7 u$ Y- C& \+ \# [+ Q: T看这部分内容前,务必保证已经熟练掌握了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驱动:
: J3 r. U$ r( r$ V3 U: a1 k% C$ S, g5 b/ T
ea12a66af6e60e048bf1b9b81e9aa08a.png
, J& N+ A7 K) \; L' B7 |8 F" g
2 M( Z9 Y0 W7 ^
添加USB驱动:
9 m7 s' a' e# D8 D; S
4 J  y* D$ z' Y& W/ }$ K+ i
b683b1361cf7de9821e95e9473212e41.png
# L2 a4 d; I2 Y" @! K

  X; f# i4 W+ R3 }7 C添加RL-USB并配置:
8 C5 F4 J7 ~1 N9 _2 R/ h
- Z+ {* g, w- @. K5 Q! B
4d32bb88eee575ba6da2871d56a1ffde.png
( x+ Q% s% P& L
( A* X1 @. ?% j6 O/ J) C
我们需要的都已经添加好,效果如下:
' q3 H+ e( h+ ^9 c6 j- c9 }* R1 A7 ?& b- }$ s: R5 u. A$ T/ V
6ce0595add222d31f90d93e116cad4f9.png
% k0 J( J5 f' `: F
& \: T) M+ j8 ^2 M
红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节):. n( G* J5 C$ c  n: H5 p1 H

: a+ w6 e4 U0 I( C/ ^
f4cf0f77d674b6a83289142025e72131.png
  Q% ?# m7 v* ]: ?( ?+ t) D9 }

6 U% r- X, b8 t7 ~, f4.6.2      重新添加被隔离的CMSIS-Driver文件

! J% ^0 q. G! z# N0 k将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。+ X& J( Z* I) o6 D2 P. t
1 I  H& j" R. k/ k! @
52112e844aee805fc01a6d40cddc00a7.png
) `. N+ G/ c$ S6 o+ d+ i* i5 }
5 E8 v3 H& _: i2 b
RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件6 K( m; a; T, g0 }- _% p
9 ?! p% D  ^# O! \  z
7039175ef77263dc5dc73a486e83950f.png
% \- d: X: S2 Z- a
4 l1 D5 E0 H: K& p9 [& j
内容如下,这些文件是来自MDK安装目录:
+ o5 Q6 m2 A' ^: A6 O6 Z( _  k
. T* |; g0 J" B/ m
17b8ba3a04288a0e29d94e7ad5f45325.png
! S3 e7 c# D& Y- I2 U6 m4 _' z
: @0 l. `2 H0 r- n( o* `
然后将用到的两个文件添加进来:
* O- C8 d! O% A9 K$ t  h
; w; A; b0 H  j; p0 E
9ad9fcc23d96b8aec42538dff0552a2f.png

. n! r! i& \) ]5 G2 T8 E: O8 b" `5 [& K1 `" \8 X# c& P
4.6.3      重新添加被隔离的HAL库USB文件
8 o* n8 G8 X0 r: _文件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

- g8 e& q* j5 d- V5 B3 Y
48241523bce89ad84d2851afef1384e2.png
, N& U0 g: N$ R, l
) t$ {- }" |5 z$ ]: U' r7 }3 H1 Z  H2 k
4.6.4      RL-USB配置* c3 M" J% \/ V; P
添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。
. A! {" I1 s: Q! ]$ `
  K# ?9 _0 h5 u. XUSBD_Config_0.c文件配置:
1 x5 C+ g" Y' ~' k5 ~4 }6 F9 p
8 p; N9 q, n& `: L& n' d( K  G. c
c5dcc4510924d2ff0e75092f7d4ca9fe.png
9 D, u' r/ n$ S3 |0 v

  L8 r6 k% I1 n8 v- F注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:% e2 a6 z% T0 s5 e, J/ Q: a# M( {/ a/ ?
' V& n- E" q/ M+ {) A
osPriorityAboveNormal:
8 I* G- I% T' ^
! y, U; x5 Z+ n% K9 l+ U' C6 T$ x
f62a8fad5d1ce978c1730b2ad87955e0.png

3 [1 E. P& u' a( z$ s
- e& M$ F3 i2 F) w/ E/ h. zUSBD_Config_MSC_0.h文件的配置如下:
) K" j/ ]5 w# K/ X- c% {* \: b# W8 R# G# m. R
1cffb6b1fa60821b7a7ab7900f7f40a4.png
6 z& R" y* [/ ]) r) \

8 I$ z  T  _! ~这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。/ C$ X6 P( v" x# [) z4 |- [
& @+ `% v5 J1 v3 e5 f5 [/ t
fafa76af25304dc853509d2c4dc839f8.png

, ]' X6 \' F" m0 P" Z" 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 ?

' m/ q! N9 R1 o
6d97a5c7ce435822748232a4fe1b0e64.png
9 }. {& o) q/ z7 U: I5 m

6 L: X2 j0 f# o. |3 K: N4 S2 l弹出的STM32CubeMX配置如下:& I  v! W$ R: ^, A9 q
' G7 u; M8 w: p& Z$ K' F4 \
2f47e57c5008dce25c2c00afe900142c.png
- d; u# x" V% a, E) ?8 [5 e
9 c" E! v$ S  n( |9 k* u6 Z
修改位置1:用于选择仅使用设备。% ^, o; E9 O" x8 q

  R6 [  H2 d5 N6 I( o5 o修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE”+ z4 O8 i/ c7 Y8 F6 P% G

) k- \0 P5 A) O5 t) k8 s4 b
2259b40b2cc2d5b5819f6ac79dd22c3e.png

2 J, P4 L0 T% t1 k# B7 P
5 P  J& e% G! v9 t然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。
! L% A% \- z  c! S% N' G, d/ i% l0 \
17f991df1ea61c9ffd2dbb4c7216da25.png
- y$ W0 K/ X( h5 {& ^9 \
& [, w% j0 l- ?5 H( ]& h) Z
重新回到MDK,会有一个对话框,点击“是”即可:
4 P' U) i. p/ X, D+ G8 u
5 ]8 ?# v  M* d  h* v. X& y0 x- F) S5 n; i
292e9c0668f8c166995f17f5d58cc2f8.png
, p! ~& I4 i; f
# s1 Z8 W! u- A; @# D& ^0 Z  x
配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。
5 D- c" E. i8 G& K9 O& L7 T; D' @) s1 @
db9b1da83c41e9807da4cae3b2618f11.png

6 B. h4 r1 a# N2 [" m* R( E" _+ F% n8 I0 M
4.8   第5步,修改文件USBD_STM32H7xx.C
1 y" ?- T" c! R% y6 J这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:' ^3 a" e. r6 g! ]( q
+ ~! P! a% q+ L' X) y! z- d
  1. #include "OTG_STM32H7xx.h"
    ) l( k  a2 {5 Y, I1 C) B
  2. #include "USBD_STM32H7xx.h"
    5 ~& f& Q, n; g" v. E* a% F& d

  3. 3 Q) m) i# h. k, P( k+ k# C; S9 b
  4. #include "stm32h7xx.h"
复制代码

0 A0 w- I" N$ D( ~2 A+ z: K6 Y修改后的顺序如下:' B% M% b! J! ?' b* Q, Q
- }# Q, b9 h, D% F! _
  1. #include "stm32h7xx.h"
    $ o/ [4 p+ f% H% L: J- R/ r( \

  2. ! V5 B% q% e: X) }
  3. #include "OTG_STM32H7xx.h"% ~9 p; G$ ], v7 H$ X  c3 n
  4. #include "USBD_STM32H7xx.h"
复制代码
  G/ p! J) |3 }5 `. |+ U3 H, Q
4.9   第6步,修改文件stm32h7xx_hal_msp.c
9 G) z0 ^! }6 C' }3 M需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:7 u9 A  V0 c* F& C0 e1 n) [4 @

7 ]5 @: Y; ~3 [; N
5d9cadc09f4b5d106e20e496c919908e.png

2 r& _+ `4 R3 E6 }+ 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

$ T3 a9 D) \( ]) y3 L#ifndef  __INCLUDES_H__
9 s. Y# k# \8 j( k2 _: y. r#define  __INCLUDES_H__
8 x' n1 u2 d7 a$ K8 m8 q" _
1 |3 m- Z. t2 T0 i& o/*
4 [% V/ k! o: v' F/ L8 g*********************************************************************************************************
& k& N( Z% O4 h4 h8 c*                                         标准库
) K: Z! T* s: E, J2 a*********************************************************************************************************0 S4 H* t( Q, k0 z0 r7 F% }9 I
*/
  v& u, h& b: Q9 s9 Y#include  <stdarg.h>2 h7 t2 f$ G4 p! b8 e( U* }
#include  <stdio.h>
: V! L$ p- O7 U/ ]! V6 L. a$ a2 `#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
/*
3 {8 L& G# t1 v( p5 Y*********************************************************************************************************
, Y8 r1 t: [) `3 ~*                                         其它库* X/ v) s6 r7 ]. I9 w! ~/ Q5 f/ |
*********************************************************************************************************) F7 c$ N+ i2 R+ G+ k: g
*/
! H- L: S' D  w
2 D/ L. Z5 A/ W! k4 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
*********************************************************************************************************
9 p7 G; [/ o( F# p1 b. m*/1 a- m8 I% S) w6 v/ s
#include "cmsis_os2.h"
; g$ B1 }4 |, r  @( h- G4 o. u0 _#include "rl_usb.h"
2 h9 H7 a& R& ^3 V& q% @4 I# U  [* o( t4 e7 h8 C, I$ [
/*& f+ Z6 m- J7 ~: N# C  z
*********************************************************************************************************; C% q% W( S% p; t) x" ]! M+ e
*                                           宏定义
- E, o0 s+ J7 a6 Q*********************************************************************************************************/ Q! Q: @7 k4 J9 U
*/9 w( ~" J; t( F$ t6 G
7 c! f0 {5 u: u

1 R3 c1 J. G1 J+ c+ P' f, |! v
/*1 U+ N- W/ a1 W" b) G1 G( F
*********************************************************************************************************
* f- C# o5 U0 u* n*                                        APP / BSP. _7 s$ o% [* X, T
*********************************************************************************************************) w# S8 I6 {5 z. V
*/
' N3 q0 L4 t$ s! d; Y; J- O8 g#include "bsp.h"( d8 B1 H- {4 x9 S% E  G- d

  [5 W, I; _( X+ I7 M
+ F  ?  N- O; M6 e; U: S. @4 d: s" ~; ~* n
/*2 O- q5 K& ?9 C" T+ y2 G  }# t
*********************************************************************************************************
$ v8 Q5 ^7 X5 H( y& `+ T*                                          变量和函数& d8 p/ D' o) e4 l
*********************************************************************************************************
1 z' ~. Q9 v& B. d2 C*/
8 z7 |, q8 k0 q$ a1 ~7 @3 S/* 方便RTOS里面使用 */
  g+ w, }0 a+ ~' y! U3 Hextern void SysTick_ISR(void);2 S; m$ g3 u( \& ], A& O

& Z. R* d# Y# D( Q, X8 D2 e: K#define bsp_ProPer1ms  SysTick_ISR
8 q3 L3 [, x- g- N
- s  g4 ?1 c" [#endif
! l4 }) M& u2 d- u2 `  L' 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
0ff85fc9774973eb80c1dbfa6653222d.png

; {# d9 k4 g7 U0 ~/ n7 U
& K7 Q# c& x# c4.12 第9步,添加头文件路径: I3 a2 ^, ~9 @
添加头文件路径:' l3 ^9 A) I' H$ `' a

2 D$ W, S+ T# g+ i2 w
3d601bebf02ab97843fdaf69cbe84a46.png
6 j" }1 F/ D3 ?9 N  O$ H. Z

$ e) l) l: \! B/ m' c; [1 e8 f  ?4.13 第10步,创建应用任务(重要,注意启动任务)' g4 M  u! b' R& ^1 Z* T+ _
应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:
' L0 Y/ v2 h  ]4 q: m. m; 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闪烁。
' O3 V+ O( E; u( k$ V* ]) P* o
# u6 v2 Y. I! T9 _AppTaskMsgPro任务   : 消息处理,暂未使用。
0 u( A* Q7 W1 g* c! f, A8 ~( ]3 y: {, }
AppTaskStart任务    : 启动任务,也是最高优先级任务,这里实现按键扫描。- b0 g! f6 h& c; T  _
0 p: c( b: P* H1 P3 f
osRtxTimerThread任务: 定时器任务,暂未使用。
5 z" C# @) e9 v( R7 J! `( j2 d; Q
! V$ S* ]& v/ @+ Z6 ^$ i- V任务栈大小和任务控制块定义如下:4 {. l  ?1 k8 G- B2 s
' p1 [! F- L6 ~1 X$ C; ?
  1. /*2 T. ]# c  N( C* _
  2. **********************************************************************************************************
    ! Y9 v' f% t/ P- |! B
  3.                                              变量
    / L! q) L$ m+ G: Y% s* Y7 V
  4. **********************************************************************************************************; B6 S! q) T9 A
  5. */9 ~4 z4 S7 m- c3 U: d
  6. /* 任务的属性设置 */- S3 q/ q. }4 t8 e
  7. const osThreadAttr_t ThreadStart_Attr =
    9 |8 _$ |% E' X/ {3 _* l6 x  }
  8. {
    7 K( ^. p. _6 x' J5 E/ W; ^- L0 \
  9.     /* 未使用 */
      r8 j$ z" h" P8 e
  10. //    .cb_mem = &worker_thread_tcb_1,4 W: {/ \& k. i7 d2 I
  11. //    .cb_size = sizeof(worker_thread_tcb_1),4 |7 U4 }9 ~  r( U" H  {
  12. //    .stack_mem = &worker_thread_stk_1[0],
    * u5 I5 B# e4 J9 w4 V/ D# I" i
  13. //    .stack_size = sizeof(worker_thread_stk_1),3 n: A; ]1 v" v' ?) U3 q
  14. //    .priority = osPriorityAboveNormal,. v3 D$ S& ~: u) Y1 w
  15. //    .tz_module = 0; j8 A7 ?# E" V8 X
  16. $ A7 D! r' _3 ]: w
  17.     .name = "osRtxStartThread",
    6 a4 d+ v  T1 k+ p4 `+ t6 b" F6 f
  18.     .attr_bits = osThreadDetached,
    : S  p: e( V/ }0 D
  19.     .priority = osPriorityNormal4,
    + H. S; A9 q2 N! }6 ^4 ?
  20.     .stack_size = 2048,
    / ?  ~, w% N' l/ S5 |! M; Q
  21. };4 [" H9 d  r% a4 O5 ~, x
  22. 5 G; x3 K8 h: R, s
  23. const osThreadAttr_t ThreadMsgPro_Attr = 9 J5 t# C0 o" C7 U1 I4 d! O% \
  24. {& m' U1 x9 [/ S- I
  25.     .name = "osRtxMsgProThread",2 v7 T5 r$ b6 ]' j% d( U
  26.     .attr_bits = osThreadDetached, : X8 Y, o8 {- O- }/ Y9 J. _7 u
  27.     .priority = osPriorityNormal3,: `/ g9 T) O& J: X0 Q3 z- |2 k
  28.     .stack_size = 1024,2 |$ [* _% U. e" e" p/ ?6 D* K
  29. };
    0 U5 v4 d- n) x& j5 E
  30. 5 k; F4 O. k, }
  31. const osThreadAttr_t ThreadLED_Attr = ( k6 j# P+ b& X$ U
  32. {
    & j! [* q9 |* S1 y$ |( X" v
  33.     .name = "osRtxLEDThread",
    7 W6 D; v8 ^4 P) P2 Z# d
  34.     .attr_bits = osThreadDetached,
    7 F4 L' }- k9 X+ P
  35.     .priority = osPriorityNormal2,7 H) l9 Z+ d4 C
  36.     .stack_size = 512,
    - F% w& a3 P5 D: c! a
  37. };
    6 h3 Z1 C0 \* A/ |- \

  38. 5 }& d8 N! r8 `
  39. const osThreadAttr_t ThreadUserIF_Attr = ) ]* O$ D/ ?1 `8 ]6 t! U
  40. {1 j' g8 p8 ~& C' E. u, F
  41.     .name = "osRtxThreadUserIF",
    ( t% R, I3 t( i; R- s9 g, J% R
  42.     .attr_bits = osThreadDetached,
    4 z1 W0 g/ {/ a' k
  43.     .priority = osPriorityNormal1,2 U. s1 s+ c9 O" V% p
  44.     .stack_size = 1024,& {# e& C  g( X
  45. };
复制代码
6 L  b& A; b- T. ?5 c. v  o
任务创建:* P' P1 f5 d' O7 h$ q5 G# S
/ H4 {# x" c. S! Y
  1. /** X, I' Q8 _& A; C  I5 x( t
  2. *********************************************************************************************************) \1 K7 Q/ u5 `3 G2 V% d( @
  3. *    函 数 名: main
    # o! ~4 O5 S. Q: g/ W7 @
  4. *    功能说明: 标准c程序入口。1 ^! `; h. l) x' j% u# M- B
  5. *    形    参: 无
    8 i+ B$ t* u- l  f) n0 d' M4 A& J
  6. *    返 回 值: 无
      S; C& Q8 X. X& d
  7. *********************************************************************************************************
    3 a+ K: V" _- H4 L8 C. V5 d  N
  8. */
    / x: b& P$ z* M/ ~
  9. int main (void) 6 h! ~" a5 [. y
  10. {   
    , X  J! n" Z- z$ K8 d, t# Y9 t
  11.     /* HAL库,MPU,Cache,时钟等系统初始化 */
    5 C: H! I# _  e  L6 S# u
  12.     System_Init();
    , s5 E. T3 l: a6 `% c% x0 U

  13. & G' e) x' H9 H6 K% [
  14.     /* 内核开启前关闭HAL的时间基准 */
    7 D( ^& M$ r4 t/ H- s
  15.     HAL_SuspendTick();/ b7 P6 q3 n( [+ B# E4 ^9 j

  16. 7 E  U! t( H( u+ ]$ I
  17.     /* 内核初始化 */; L6 A6 l5 G5 w  g; R+ J9 ]: M9 p, I, S
  18.     osKernelInitialize();                                 
    ! }, J& L* a6 N$ K% \0 y4 p

  19. 9 }3 L; g: @$ b$ W
  20.     /* 创建启动任务 */
    8 a. Z; C( T3 y
  21.     ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  
    8 S/ h, W: q6 m, o0 y' B
  22. ( f* {! |6 }3 \2 a( b! r% m0 B
  23.     /* 开启多任务 */
    . V4 z9 O# o) {1 C
  24.     osKernelStart();
    - q7 g# S4 p0 C* g0 Z, t

  25. & E  [* _0 U- T* b/ i1 K& h
  26.     while(1);6 O* i4 ^6 V. _
  27. }  L' E. q, Q: x& n! l% l% N+ z/ c

  28. 0 c# H& q& d- J$ o1 M' Q
  29. /*$ N) y- t# c& G- A; i
  30. *********************************************************************************************************% C, g) S0 V3 H: G$ d
  31. *    函 数 名: AppTaskCreate
    2 z3 m* |& K5 [, ^8 t
  32. *    功能说明: 创建应用任务" I( m2 g$ k% @6 ^4 F: @% C
  33. *    形    参: 无
    + [+ b0 Y- o8 m! }
  34. *    返 回 值: 无
    ' L+ Q5 l) O8 ~7 B; i
  35. *********************************************************************************************************
    " k: T# J% d. K1 s
  36. */
    ( x7 ~" {, Q# q6 ?
  37. static void AppTaskCreate (void)
    $ z" }# t& o; o6 K6 G
  38. {
    5 a' O8 I" K# w* t
  39.     ThreadIdTaskMsgPro = osThreadNew(AppTaskMsgPro, NULL, &ThreadMsgPro_Attr);  0 p/ Y! N) Q: Q0 A/ t
  40.     ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);  
    ' C, L: _8 F% q' C9 n
  41.     ThreadIdTaskUserIF = osThreadNew(AppTaskUserIF, NULL, &ThreadUserIF_Attr);  
    ! {; e! A* {" L" c- x6 ?
  42. }
复制代码

! q3 e9 P. P/ O- n3 A这里我们重点看下启动任务,主要做了五个工作: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里面直接调用。
+ B. o4 V* Q# w) w
  1. /*
    - i, r& H5 q$ |. M* I: a, {" E
  2. *********************************************************************************************************
    0 K' C! _( w4 S6 @4 {
  3. *    函 数 名: AppTaskStart, q/ }7 I3 l3 q" |( c. k
  4. *    功能说明: 启动任务,这里用作BSP驱动包处理。# E0 Z! C% t  d& P% x# o
  5. *    形    参: 无
    3 b+ Q+ F6 u9 |/ l) ^6 ~
  6. *    返 回 值: 无, @; g2 L; c0 t9 P! R. B: m( F8 h; G
  7. *   优 先 级: osPriorityHigh4  & M' U9 m0 B6 h4 w9 V/ y
  8. *********************************************************************************************************8 h. r1 O3 p# Q3 m9 _. V" Y8 P0 m
  9. */( M+ Y7 U7 ~$ v2 d4 F: O
  10. void AppTaskStart(void *argument)
    % h4 q& z" b/ l0 [
  11. {
    1 _, a6 C; A7 t; a: m
  12.     const uint16_t usFrequency = 1; /* 延迟周期 */* d/ R$ d1 K1 A* l/ m7 }+ Q- }+ y
  13.     uint32_t tick;5 r8 o2 o1 M1 o5 [
  14. 7 _0 ~: `; M7 T3 C5 \+ W
  15.     /* 初始化外设 */8 y. X4 x1 I( o
  16.     HAL_ResumeTick();
    7 o' f, |! l8 y! S* w3 X1 g
  17.     bsp_Init();/ h5 _/ ]9 W# m

  18. , X) H- |* Z6 S( n* _9 R, s  x% h
  19.     /* 创建任务 */0 L# m) v2 `1 I+ M4 A
  20.     AppTaskCreate();
    % a4 |  v& u  `& c- p6 W& V/ P# g

  21. ! v. X, n( A6 X4 C
  22.     USBD_Initialize(0U);  /* 初始化USB设备 */
    ) {- Z0 R7 ]" a% S3 z4 ]) y! U3 u
  23.     USBD_Connect   (0U);  /* USB设备连接 */
    4 P0 M+ M3 i, H( d+ N3 m
  24. 3 N6 y4 P, t* l, g
  25.     /* 获取当前时间 */
    1 E! k% ]  Y; u4 k1 j* r
  26.     tick = osKernelGetTickCount();
    # ]$ p6 d; {. j( b+ |7 \
  27. 7 _3 S. g2 p+ k" r
  28.     while(1)1 v1 K& U& Q. h5 N7 t3 ~# S
  29.     {3 q6 C$ ~$ L! j8 k* C  b
  30.         /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */8 }6 s8 @0 P" P% `. e
  31.         bsp_ProPer1ms();
    ; z0 `% }6 z& d

  32. 5 e) e& E' `6 S" m% L& Q9 t
  33.         /* 相对延迟 */. I. E7 w2 U. R/ t: v, S8 I- `2 `
  34.         tick += usFrequency;                          
    ) w% p5 |8 Z) C8 t" X2 C- x  K2 C
  35.         osDelayUntil(tick);% K9 T0 f( X6 s2 g' Y/ Q
  36.     }" P* j+ s: w, U
  37. }
复制代码

; x# }+ X; A) t2 u- y8 I4.14 常见移植错误总结
' ~* J# B/ x" U5 K7 K  编译后提示如下错误:
7 Z1 T! F- K6 T3 u1 s: L6 r. g# ierror: 'Driver_USBD.h' file not found6 L: k5 R- v. I: X( g* }# [6 K

; D  r8 j0 V8 g, C解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:
/ v. Z/ a7 J9 m8 K- }; S3 `
" w: |$ E1 a# |; Y* @# W
d32a6c67848ac92bf4c29e0fbf5ef220.png

7 `8 p: q% e) [$ Q$ M+ A) @5 j2 d6 E
  提示如下错误
9 Q* T( {. ?$ aunknown type name 'HAL_StatusTypeDef'# R' F7 U8 p# G8 \

% o6 N6 B% o* m: i$ Q6 v解决办法:本章4.8小节。
! d6 q; T( n% N/ v! s
- ^2 L4 A  `( V& O7 s" D/ [" h1 x4.15 使用的MicroUSB接口并注意跳线帽设置' I& r' t1 B$ @/ H4 n8 Z# ?+ A
本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:
0 A+ X  E2 P) D. E0 @5 ?
8 G/ ]+ C( z0 K/ ?
9c04c38f56dbbfd80201520f1e84223e.png

" Q& w5 x  R' M: u
9 V8 A5 }' a* |( i8 u, |注意使用的是MicroUSB接口:
- `' J$ K% c! C  d( k3 |  c; T+ n" @9 t5 K0 m" L% C8 n5 F
374a9b3f00b1d0e7cd589a59b3fe699a.png
  a) n& L* h- r
" a; Q8 j) O6 P7 B( S9 S
注意板子左下角跳线帽的设置:
( {, W( U0 n# A% d: g' k6 j' ^& V# O$ C
f13c6739f82641308861da50db97c44a.png
/ G5 m! G* W- S
: ^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 实验例程
6 `8 M1 @" b2 e% H/ a本章节配套了如下几个例子供大家移植参考:' 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

8 H! E" H/ \* {' r/ h5 WRTX5内核模板。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

: Y. D# p0 O. `/ M5 b# H& ZRL-USB工程内核模板,使用内部RAM模拟了一个U盘。
3 P8 O, ]- B; a4 f. s0 l% B9 Q3 ^; c' [
) @7 [3 E; H" @) y: EMDK进入调试状态后,选择周期更新:
2 S2 e3 X  |& Q( |+ L- u
; x" Q8 [9 a  H. l
dca8f2e82304e411670c3194cde12230.png
8 r9 K/ ^2 t6 W; x0 i+ I  \' c- q
2 V' b* g# r' k
然后打开调试组件,注意和RTX4的调试组件位置不同:+ Z7 E# W! S) h7 t. s9 c

- o8 J7 ^+ h: @: k. z( W/ t* f; R
9daa841c2ebfbe6204c5bb95355e5707.png
2 C; o$ }! C8 V6 A, O; B

" v, f7 i3 _$ v9 K1 O. L' G0 [* u然后点击MDK的全速运行,0 g+ |5 g! k" p: v

9 X3 b4 \7 u1 K$ M- A/ [! y
1d57a73648e5313c246a089fc2a85ac5.png
6 L) e  ^. ?$ A. I: m

' s3 x9 z8 E: {/ y3 q3 m* |- w& Q至此,就可以动态实时查看RL-USB的运行状态:  u  Y/ [+ l- i' S* B' y- n( R
! A- x- y0 O% \# Z* M/ a
1e9d6ebcc79d1df8a4302d0c846080e0.png
8 n+ k: h" G3 ~. X, _4 M) z0 Q* ]
$ B$ x: Z4 C. E: f9 L  H
4.17 总结

5 Z# s: F- Z9 Y5 K7 l5 h3 D" S; j本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。
- ?1 W" J3 h- g/ b& l8 E
1 `' J% o8 ^* N! [% J0 F2 S3 `% 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
收藏 评论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 手机版