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

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

[复制链接]
STMCU小助手 发布时间:2021-12-30 14:01
4.1   初学者重要提示
; b- o6 A& R7 l7 ~; M6 |  学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植
& ]; ~/ f" `3 x  STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,详情可以看我们STM32F4开发板对应的RL-USB教程。; k5 P0 l2 u* J
  本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。* r, ]3 u5 v* f# Y
4.2   移植RL-USB整体说明
4 t0 ]' o, n: O$ [: I移植之前,有必要对移植过程有个整体的认识:
2 V! C4 \/ g1 |9 x7 ^0 f2 a0 g) c7 a" V
  第1步,准备一个RTX5工程模板。
0 w( K8 j' I3 h/ P* Y  第2步,移植RL-USB。
2 w8 d3 I; N/ ?6 B  移植RL-USB是采用MDK的RTE环境直接添加。当前H7芯片使用RTX5强制运行STM32CubeMX,所以需要大家提前安装好STM32CubeMX V6.0或者以上版本。
2 b7 D6 |7 t# C  第3步,处理HAL库时间基准,MPU配置等。7 N" C: `1 v8 X, u6 p0 {/ P4 J2 e
  第4步,创建应用。& i2 _* N; l4 E1 h
总的来说,这4步就可以完成移植,下面将STM32H7的移植步骤和注意事项为大家做个说明。4 N; n4 ?' v+ N4 }% z

" p2 `+ S+ ^" l0 L, U) Y4.3   了解RL-USB模板框架设计

* S- M" m5 G: O, h1 N移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植:2 d* T; F( x5 ]7 d6 {+ `. s; |' U
7 V" ?3 X! p& C! ?) g4 T: j
9c6a4f191f47051f48c46fad67830cf5.png

& N5 F* p  m; l' o- ?6 S: U3 i6 T/ ~/ g0 w+ V- D- B' @$ a$ D* `/ ?
框图如下:7 `2 ]  D/ {5 m& q+ t( V; C

" W, {6 V: w" S
5d53a3abf7c75f1cb8292dc449988f1a.png

4 Z  N$ W' u' v  L8 m  n0 w) e
- _, K0 Q9 G' W/ g, M* f1 U4 U4.4   第1步,安装指定的MDK软件包

0 T! S/ w. ~& _8 S8 _4 a移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版):2 d, B! h7 ]* h/ k. o" n8 ?
% C6 o! J: n1 S
  CMSIS 软件包使用当前最新的:V5.7.0
# ~$ l! E  L! t1 o2 A) H  STM32H7使用当前最新的:V2.6.0
- `2 S3 I: o4 p6 ~0 s6 [1 ^  STM32F4使用当前最新的:V2.15.07 l- ?4 B9 c, U/ K; E9 x
  STM32CubeMX使用当前最新的:V6.0.x& c2 ?. y0 w* x# L# q- D3 n
  ARM_Compiler使用当前最新的:V1.6.3+ u" @# {' v9 f. i; b, i" x! Z
  RTX5中间件使用当前最新的:V7.122 ^8 D' p& K. a' {* z8 N
& l3 {, ^  ~, z5 V* V% e

* A/ M  g) D. o( j' @. \8 P6 X不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:
! C. P/ P+ @4 M; H& o 7264b6fa8f70af9cae9f03812878d357.png / q1 V& p/ Y9 j9 w% p9 {/ m
! O& y) b. t2 H  F. ^
3 T2 f& d( ?3 z4 f; ~
4.5   第2步,准备一个工程模板
4 R, L% H- X: }$ v9 g
首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):$ @' W) H/ ?- n$ |, J. H6 X
  m% }  J+ a& w* I& C+ W! n7 b5 m
74269e50c64ab536eeb86097f3884ec3.png
: U8 K- c3 S/ A, w7 _; }) K, W
% U+ w% I# W+ W' t; s9 W# z$ ]) A3 ]
4.6   第3步,添加RL-USB并配置

. m# W& E2 J7 J# G, K9 t1 b/ a看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。6 N0 U9 e+ W5 i. B

$ j) ?( p) L# J4.6.1      RL-USB相关文件和驱动1 H4 s' @/ X1 m2 A! Q0 Q
CMSIS-Driver分组中添加USB Device驱动:
# f0 \6 `6 E9 O7 ~& |+ c. ^7 n$ t( B& h+ p
ea12a66af6e60e048bf1b9b81e9aa08a.png
7 y$ I& x8 e, z5 y( R' b( G. D

: ~9 W3 B, v9 i6 u. N, I添加USB驱动:' l$ {# B( t$ v* p

7 A" W1 {' D2 F4 K0 ~! z2 F9 @# p
b683b1361cf7de9821e95e9473212e41.png

+ \+ r; y, ]8 i8 c4 h6 x! C! X7 d' I: v2 d. U9 Q- X. S" R, `
添加RL-USB并配置:
" N( z* `& k/ i+ z: L* L' F
) F/ I& a8 ]( o% ]
4d32bb88eee575ba6da2871d56a1ffde.png
9 I0 K# B6 A0 v/ a

: n: [8 L3 @6 M9 q: k& |我们需要的都已经添加好,效果如下:. p( ^$ L$ g8 R) q1 _) n- @. v! L
' p, z: P! w0 m' N, A0 T3 G
6ce0595add222d31f90d93e116cad4f9.png

9 S% d; n- K! N% r$ O3 e- p+ v9 `6 F/ r
红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节):
6 n! ?& z4 c0 O8 g& ?# m: [9 a; ^( g4 k/ Y
f4cf0f77d674b6a83289142025e72131.png
. H; C  F% {7 J2 t8 m

1 N% C& U/ \: \/ w- V' C4.6.2      重新添加被隔离的CMSIS-Driver文件

( K* l' R- U9 x' P) _将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。
; R' k7 s0 H( p  ~/ D2 ^# R
2 o% [! t2 O/ Z$ m- J- v( T
52112e844aee805fc01a6d40cddc00a7.png
' N4 x( G4 P1 [, @
* L: G7 M1 M0 R7 k2 P
RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件' F. `4 Q5 J& [$ ?1 F. `
' t1 i9 W! \  `# G3 _4 Y
7039175ef77263dc5dc73a486e83950f.png
- Y  F. Q/ x7 p9 \$ i' y
) F( Z# D2 E+ J) j) @7 S2 h" y. ^
内容如下,这些文件是来自MDK安装目录:
' X% @& Q9 A7 z! }5 |5 B) G9 A6 A" z9 J2 ]# X6 Q
17b8ba3a04288a0e29d94e7ad5f45325.png
; X- s4 U9 }- H! d1 P

5 K: g$ o5 v1 a3 E" P! u然后将用到的两个文件添加进来:
/ E2 z0 Y' C9 y, @. z( }% ]6 m* T; g1 H6 b
9ad9fcc23d96b8aec42538dff0552a2f.png
! k4 U) d" E5 {6 v& ]
5 H0 P# D  F' w
4.6.3      重新添加被隔离的HAL库USB文件
" b# F: c1 y& q3 M文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来:  u9 P$ E) L; c7 P: E. P

( A0 s- ]. s: x& q% [
48241523bce89ad84d2851afef1384e2.png

  [: E, o& V6 Q. M: g# o4 p. o* e' ?+ x# i1 Y- |; G
4.6.4      RL-USB配置
4 A$ C: m9 I; A+ _( O- r8 F+ D0 `添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。
" ?% h* _7 r( Q0 q+ G- ~" [: r/ ?& o. r# i6 h( C
USBD_Config_0.c文件配置:9 B8 y' |/ m* s. q8 x6 h, o

, Y+ L* }, d, ^
c5dcc4510924d2ff0e75092f7d4ca9fe.png
1 d# F! H$ r' j$ }/ D: S- C
/ B/ r& b) s# s- q, O, x& |$ Q7 G
注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:
# y+ z7 v) t; v8 n5 n4 _. C) ~5 t. W' \2 g
osPriorityAboveNormal:
% n% j9 u. X# k" i0 [6 Q" b% y; @- C) S& ?; M7 o+ i' H/ p1 @3 b2 s, T
f62a8fad5d1ce978c1730b2ad87955e0.png
) r$ Y; D* F. O0 T$ A7 L8 o# u
8 e1 a. U" f) f% t3 n) d
USBD_Config_MSC_0.h文件的配置如下:
: n3 M& s  Z- L/ [* B* ?3 b  w9 w3 }! A" C% X8 S2 q( E! g$ S
1cffb6b1fa60821b7a7ab7900f7f40a4.png
7 C* N1 Y* y/ w2 A8 M% N

6 t5 {" G8 {, U( r$ [这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。
4 d" r1 C! q; d1 f; L7 x0 r3 F" X+ b1 q* ^6 f
fafa76af25304dc853509d2c4dc839f8.png
# S3 d( ?9 I: T
! {+ a2 B1 {' o
4.7   第4步,强制运行一次CubeMX配置USB& I/ i2 [, i: R% k% }  M& B$ G
我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。2 n2 ]$ F& T1 v
' Y  j* r# W$ @$ E9 i1 G  D6 Y
打开RTE环境,点击如下按钮:& c( D6 o4 x6 s5 ]1 p  y1 ~! n, N

1 o) ], [- B. a; Z
6d97a5c7ce435822748232a4fe1b0e64.png

5 \) h+ T0 [% R1 H! b. s
( W/ `7 ~$ a4 N3 S( a弹出的STM32CubeMX配置如下:; y! Z: [* p) ?# ]# }

! n4 }7 R1 x% Z5 o; v" E( l8 v$ a
2f47e57c5008dce25c2c00afe900142c.png
' t( ?1 b1 N  |/ n& U

; A9 l) |$ u: X5 |8 k' R8 V修改位置1:用于选择仅使用设备。5 U( [0 |  S4 }. e) Z
  u) W) f& w2 Y4 q' S+ _
修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE”% l8 J" _0 k$ e7 w. P0 D
/ u* q3 r5 X: o9 N
2259b40b2cc2d5b5819f6ac79dd22c3e.png

: I* z! J6 W4 N: G* k: l  i
# w( X; ?+ t+ b" L- D' q然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。  |3 U+ R: z9 P7 D

) h( l3 ?( ^0 W, G! z1 g$ d4 h
17f991df1ea61c9ffd2dbb4c7216da25.png
& j! D# I/ N, |" a6 ?7 `

% r8 V' q" @1 ~; \* h( {4 ]8 h重新回到MDK,会有一个对话框,点击“是”即可:5 t8 i- D1 G3 [& n% }3 W

* r8 P5 i$ M$ U. d, G( s; y
292e9c0668f8c166995f17f5d58cc2f8.png
; H& Y0 u8 K1 F& C( F0 x5 r

: x, O) b  D8 a配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。
5 K: n: a" N( d0 h0 A
7 p0 P0 `# Z% b+ u" [2 S4 t" e( Z9 f+ k
db9b1da83c41e9807da4cae3b2618f11.png

  d' D% b/ @1 {* p6 c' m0 Y+ A* N
4.8   第5步,修改文件USBD_STM32H7xx.C3 X/ t9 g9 N1 N6 G
这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:
. P6 X! L& g% a. _. Q3 v+ F& p/ J6 R" v0 M- k0 C$ `, c7 E
  1. #include "OTG_STM32H7xx.h"; u9 O! u' F! U1 T- g
  2. #include "USBD_STM32H7xx.h"
    ; `: ]  I4 d" E- `

  3. 9 h+ u5 |- f$ @! A; |% i- u2 d
  4. #include "stm32h7xx.h"
复制代码

/ J( a+ w) m: e( o6 i" Z, |修改后的顺序如下:) P& L8 b5 c7 w' F* j2 H, @. i6 {
1 P  b+ o8 O- j* v4 y
  1. #include "stm32h7xx.h"
    0 H. f) x% m8 i% d

  2. - a  q  {: K4 q% R
  3. #include "OTG_STM32H7xx.h"
    2 w, r$ @# Y2 e+ m! S6 h% ^' m
  4. #include "USBD_STM32H7xx.h"
复制代码
( T8 M; V3 b0 I/ l
4.9   第6步,修改文件stm32h7xx_hal_msp.c5 ~) W9 x0 n( b! ?7 L2 H
需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:9 D- \4 ^3 s/ e8 R2 M
! K8 r1 ?; X$ ~) l; O, A
5d9cadc09f4b5d106e20e496c919908e.png
( x! I0 N4 e" i4 u: X' Y# j
9 X* W4 j, r5 X% K& m
4.10 第7步,修改文件includes
! A8 {4 F* H: L1 F0 P4 X& c添加USB头文件:#include "rl_usb.h"+ N4 ]( T& @! \' A) e5 p0 @2 e

8 Q& f  k7 |0 a3 G#ifndef  __INCLUDES_H__$ N* \/ X2 C4 j5 f2 S4 L
#define  __INCLUDES_H__, l! d1 q  _- B- q2 G

: I4 i1 h$ |. m2 u" B/*
' E1 x& |; s) G3 ^3 m2 b3 y- a*********************************************************************************************************  N, v2 d5 b9 [0 Z& I0 a0 E9 W8 C' S
*                                         标准库/ z$ G& @( B7 X# x8 V* `+ l
*********************************************************************************************************
# r: f' t5 S# ?* d  g*/1 W+ ^  d- L) Z
#include  <stdarg.h>1 @5 f- h+ x% e. U
#include  <stdio.h>
  M$ R9 r; |# j7 b9 g#include  <stdlib.h>: g( l9 d3 U) ]  A7 j, i
#include  <math.h>! W' k5 h, w; q/ U! ]

  P) O' o  Q) D* A/ i, x. N6 Q9 r
3 z. a' t! m+ l8 O( @/*
, x( B7 I8 o3 n*********************************************************************************************************6 \" I- ^: C! Z2 i7 C/ H7 O
*                                         其它库
" n& Y. Q- F, \9 C*********************************************************************************************************
4 p! _8 t2 q& @" }; I: _1 a*/! m- R# M1 V( T' E$ f, g' A" t
, \* y1 l% M4 Q" C

8 K! N* J5 c" _! G" q' B$ b  J# U/*
# k0 Z0 Z) C9 P7 H5 T; U& G*********************************************************************************************************
! V# x  l  o/ t& [( r  n6 h* r*                                           OS和系统库
: u% ]* ~1 o4 H8 {4 ~" ~*********************************************************************************************************1 t) ^* t8 _: r% o1 Z* s
*/$ c4 T# u0 o# m
#include "cmsis_os2.h"7 U% M1 g: M! X7 q) k) B
#include "rl_usb.h"( Y( {' J+ _) c  E6 ^5 J& h( B

7 a4 m% r& E$ M7 D- K& i/*
- o2 B! G$ N2 h9 A- k/ L* S*********************************************************************************************************
) M$ X2 H- v+ G) r$ k6 j! @*                                           宏定义, `$ r, N) W  T. ~) ^
*********************************************************************************************************; h6 J/ P5 W, y! r  ^% c
*/
% \$ ^: U. q( f: C$ C! n. P
) v' [; d, l# X
/ b/ b7 A0 g- _) t! Q4 R+ e' n: u) n& C/ D; u
/*, ^3 j7 a  f; a3 t$ [# c2 R
*********************************************************************************************************5 Q% j# ]% o1 p0 N, q# \$ _
*                                        APP / BSP: L) |- Q) e* s( k: F6 `* Y
*********************************************************************************************************
0 Z" {6 W2 ~* `2 j3 J*/
+ J+ L% Z! D8 N#include "bsp.h"
6 [; x& R6 x6 S; ^9 V  M2 w+ N( c

  `4 W# W: z: K; x5 P
9 ~8 U. b/ Z* x, D- h/*
; H/ u3 ^# {0 j$ p/ l. L*********************************************************************************************************
% i2 x8 o3 z& B; w/ V*                                          变量和函数5 V: e3 q$ |' Z4 |
*********************************************************************************************************8 m$ U1 ]' T' J
*/) E9 K# _! `3 k( t
/* 方便RTOS里面使用 */4 Z* L- c: v8 ^& d  X- f2 y0 C" r
extern void SysTick_ISR(void);
! W' z. u+ }$ F/ F
8 p2 `2 ~" Q" w#define bsp_ProPer1ms  SysTick_ISR
1 S/ Y& W- k6 M3 q5 K' v. s. S* b7 p. }, }4 t
#endif
; m3 X; v' E1 y2 v3 t! y! M3 O' A3 m) ?
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
: c$ x- x' a$ {5 N' Y& C4.11 第8步,添加两个应用文件6 B1 [* m" O7 ^5 |
为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下:, \! N  ~1 I0 S# k3 l  C! c4 R4 Q
) y- _; Q/ l; D' C4 h: B! S
0ff85fc9774973eb80c1dbfa6653222d.png

" W4 I% l; t- j$ f$ J. k: w) u* j' J
4.12 第9步,添加头文件路径% S+ P7 c, u8 |8 O5 |
添加头文件路径:
- C. ^- R" t3 d8 e! H9 t1 K. M/ K% ]" V! F
3d601bebf02ab97843fdaf69cbe84a46.png

7 H- O7 y' c) k
* k: q5 ?. m- K4.13 第10步,创建应用任务(重要,注意启动任务)
; [! o6 b# \/ Q+ x9 K& G; W应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:! V  f) {/ v6 U+ n2 F
& j' Q3 c8 i3 P8 E* M
AppTaskUserIF任务   : 按键消息处理。4 f' k) i) D+ N' b
7 |7 R2 ]/ h5 N
AppTaskLED任务      : LED闪烁。
7 I# ?) V4 y4 u8 U& R! e: u8 g0 X
* m7 C  j- H4 l& k$ E+ o% @AppTaskMsgPro任务   : 消息处理,暂未使用。
$ ]  h5 q  |: P' n) L2 A2 ^- [# ]! T) U' D- Y
AppTaskStart任务    : 启动任务,也是最高优先级任务,这里实现按键扫描。. w4 `/ n! w1 _/ T  P" |# C5 ^+ j
; z7 R% R+ R+ f0 j9 p# V4 V
osRtxTimerThread任务: 定时器任务,暂未使用。
4 s$ ?7 i( b: E1 r+ m) _2 K# z$ A: u2 J; k/ x/ V
任务栈大小和任务控制块定义如下:9 t2 W2 C" X% b" Q# h" i' t! O
: v  D+ G0 y& F0 [9 @
  1. /*) q) Y0 q& E1 f: M1 p
  2. **********************************************************************************************************" }" M' m3 f- H6 ~( ~: }
  3.                                              变量
    3 |' u# a8 ]8 e  X# c$ D& z
  4. **********************************************************************************************************
    : V& h) E1 a$ B7 T7 h
  5. */
    ( n1 Y& I% m9 E2 Y* U+ n# w
  6. /* 任务的属性设置 */9 v' O, A2 Z" }+ L$ t! G$ z3 N
  7. const osThreadAttr_t ThreadStart_Attr = / Z( `8 ]1 m1 T; u
  8. {
    + h) a- @& x/ ]$ S! _
  9.     /* 未使用 */- q$ B. q( i+ X3 z/ X; A" U
  10. //    .cb_mem = &worker_thread_tcb_1,- d5 j: a; F4 [1 b: W& c7 z
  11. //    .cb_size = sizeof(worker_thread_tcb_1),
    - P4 Q' @1 k! }( s5 Q, X3 j
  12. //    .stack_mem = &worker_thread_stk_1[0],
    6 l, F+ w( ?$ j; k
  13. //    .stack_size = sizeof(worker_thread_stk_1),
    ; L( ]$ R0 U7 f& S3 E
  14. //    .priority = osPriorityAboveNormal,* ~/ F# e" Q- g& n
  15. //    .tz_module = 0! E( ~- c5 K! ]

  16. + c  ~- _' u+ G& H) S- j0 P* X
  17.     .name = "osRtxStartThread",* R3 D* U' o$ F; A4 P- Y
  18.     .attr_bits = osThreadDetached, + ]8 @2 S4 D. U6 ~9 a1 z
  19.     .priority = osPriorityNormal4,2 f1 O0 E. m+ I8 P
  20.     .stack_size = 2048,. \+ _4 M! w4 V( T$ A& C4 i
  21. };( s7 `2 B* \0 t

  22. ' y+ m9 K' r% q- x# k& K. d
  23. const osThreadAttr_t ThreadMsgPro_Attr = - N7 w, Q$ x' y7 k- D- I
  24. {
    $ b( m3 I7 y. s) x
  25.     .name = "osRtxMsgProThread",
    " |; Y3 T/ \& B; c. T9 {+ A
  26.     .attr_bits = osThreadDetached,
    * H& F  \( K- z
  27.     .priority = osPriorityNormal3,1 \6 E- \  {4 W% g! s
  28.     .stack_size = 1024,
    - k7 r. t# h% i6 n* j1 k
  29. };- A' K( n# I% t& N0 U; C
  30. 5 x. L4 Z7 `* d& t, p+ a* H" C" C
  31. const osThreadAttr_t ThreadLED_Attr = 2 p, n7 \- D/ s8 z; F& I0 l
  32. {9 B* R$ f/ @! P1 F3 v& K( y- b. K3 w0 G
  33.     .name = "osRtxLEDThread",$ l( Q  o7 H& J& _
  34.     .attr_bits = osThreadDetached, " j8 y( f( n2 g2 n2 p  j
  35.     .priority = osPriorityNormal2,
    . x. f& x* C. e; K' E& z
  36.     .stack_size = 512,
    ' J( W% n# l( e) |3 i" m! d: B! Z
  37. };
    " \( a5 d& |) e1 Y; v) I( ?
  38. 4 _3 i2 @: A4 k! C, B% B6 Z
  39. const osThreadAttr_t ThreadUserIF_Attr =
    + Y+ {6 p. A; [) v* j. b. Y
  40. {5 j# P! b, a5 C$ W: M5 J
  41.     .name = "osRtxThreadUserIF",
    $ r" n, p7 {) f7 {4 f
  42.     .attr_bits = osThreadDetached, * L: d# p$ _5 C: F% j
  43.     .priority = osPriorityNormal1,
      V, ?4 Z8 {6 I/ }/ a; b' x! j* m- M" L
  44.     .stack_size = 1024,
    $ U9 v. b) ~. M" S! A( \
  45. };
复制代码

0 x, ^- j- p# F9 A0 n任务创建:  Q% m, h9 |6 j/ i2 s

! o( w8 ~  s* B# W6 S- I
  1. /*
    0 w' V: W" E% ^: N  p8 V9 x  f
  2. *********************************************************************************************************6 X  C1 \& o2 l( V
  3. *    函 数 名: main
    * J9 D# `% k+ Z% w! q1 s
  4. *    功能说明: 标准c程序入口。- ~# _2 J5 O/ f- m
  5. *    形    参: 无
    * m3 d' V) n7 |3 M
  6. *    返 回 值: 无
    , K# }; m) U8 `! e
  7. *********************************************************************************************************
    ! U% a0 F* K# P8 S7 h4 i
  8. */  R: S3 h( \; w, d0 m" D4 m+ E
  9. int main (void)
    & ?# @6 W5 b  g4 u
  10. {    3 g; X. P+ D6 a" P+ S" y" B3 Y
  11.     /* HAL库,MPU,Cache,时钟等系统初始化 */
    ) G/ _* h5 x4 Z; @3 X0 k& A# e7 C1 k
  12.     System_Init();
    5 A* ]5 {) w' T, z9 p. L
  13. 0 b: r, G4 {5 G( n
  14.     /* 内核开启前关闭HAL的时间基准 */
    4 G" A( d& n3 c$ E1 p( p& ~/ l; E
  15.     HAL_SuspendTick();* E6 S8 k' h* A( t7 [. T6 [
  16. 9 l' C7 N4 n- d( m
  17.     /* 内核初始化 */
    + z3 g7 j, y% s+ h# V# n$ d! ^
  18.     osKernelInitialize();                                 
    % O  l0 _/ G! H/ H* i' r; `

  19. 8 O' T: B% |/ V$ g1 I
  20.     /* 创建启动任务 */
    " Q7 g' o0 l% ]
  21.     ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  
    & J1 F5 q3 q  j% ~9 D

  22. 7 k8 H2 Q$ N0 }, e- S
  23.     /* 开启多任务 */
    . ~* g4 u" ^# |, B  B) M" [
  24.     osKernelStart();' i1 K3 F0 u% i1 q" H$ `
  25. & \* x+ W6 B; F1 m7 u! n
  26.     while(1);$ u1 T) `4 [3 c: v  s4 h9 r' R
  27. }9 J: e, Q, O% ^4 _: j6 `

  28. 9 z. N" D! B; h$ z9 c5 {# [
  29. /*
    1 \- }# y2 T. X6 l, r
  30. *********************************************************************************************************( h8 P6 l! x. R$ G! Z
  31. *    函 数 名: AppTaskCreate
    . U7 q: m. s/ F* }
  32. *    功能说明: 创建应用任务$ v) b' I" f, a- S8 P
  33. *    形    参: 无! a' J& n- U7 v1 E
  34. *    返 回 值: 无8 _3 \3 V' v$ m# c4 `
  35. *********************************************************************************************************& c% h' \0 O/ @* Q7 H$ |5 M0 |
  36. */
    & k; B  I( S5 p; R2 H
  37. static void AppTaskCreate (void)1 D; L4 T5 P- y  n& X& i3 f; q
  38. {
    % a6 ^: X7 K# i6 K1 _7 I4 J. Y
  39.     ThreadIdTaskMsgPro = osThreadNew(AppTaskMsgPro, NULL, &ThreadMsgPro_Attr);  
    ( Y, F% E% e( o1 C( ^. V" M4 G
  40.     ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);  , i3 ]. q' t( W6 S; y# p
  41.     ThreadIdTaskUserIF = osThreadNew(AppTaskUserIF, NULL, &ThreadUserIF_Attr);  
    # ~/ Q, g, a' N) o
  42. }
复制代码

. ~! q2 @7 t# T# s这里我们重点看下启动任务,主要做了五个工作:
, b3 v$ ^- `8 p  d; u% @; f( \- O! L, P1 I+ b1 N8 u) \
  外设初始化bsp_Init。
$ E- X+ o% T3 A$ S  I+ b; x$ E& T  任务创建AppTaskCreate。
, d1 W! d7 F0 V4 k! x* L( I  初始化USB并连接电脑。
0 t: i: p3 T) G9 R; o- P  需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。
8 v* ?7 g/ W& B1 H8 |1 w
  1. /*
    , I& L* [- ~5 }8 X6 v6 k
  2. *********************************************************************************************************, C5 H! m0 v) \. b0 E6 [
  3. *    函 数 名: AppTaskStart
      M$ B5 |, _; u7 q8 k
  4. *    功能说明: 启动任务,这里用作BSP驱动包处理。
    # C5 S8 ]- [2 Q& R8 N7 G# c! o
  5. *    形    参: 无
    ! @) c& |: A% V2 D, D% L  o0 e
  6. *    返 回 值: 无  g% D$ }! q( i, Q7 C3 N9 s
  7. *   优 先 级: osPriorityHigh4  
    ! y9 W; a& N, A  G9 D
  8. *********************************************************************************************************$ R9 i! z& F: o+ F2 C
  9. */
    5 u1 {3 [/ _! G5 g; {' ~! J
  10. void AppTaskStart(void *argument)
    ; f5 D$ j8 j$ L) l  y* B* S
  11. {+ p; {( Z) P8 S, g1 K* G# ]# p
  12.     const uint16_t usFrequency = 1; /* 延迟周期 */$ ^3 F9 n) ~8 O4 G. f& B; D
  13.     uint32_t tick;0 S: J" P  @% W) R: ^4 l

  14. ( Z- {& F$ a4 K
  15.     /* 初始化外设 */
    : ~$ `2 f. R5 w7 v& C* ~. C
  16.     HAL_ResumeTick();
    % Z' R$ ^9 c; X/ }; o; o% a2 Q
  17.     bsp_Init();3 o# O: d# f$ Q" c* R& T; d

  18. 0 Y5 s! X6 Q$ N5 f# ?+ `$ Q
  19.     /* 创建任务 */8 N: z& Y+ H& T% J2 x
  20.     AppTaskCreate();
    8 {% _6 x! m4 }! F8 ^

  21. $ N; i9 y7 S* _! T; S8 ]
  22.     USBD_Initialize(0U);  /* 初始化USB设备 */7 M5 o0 N9 i$ D% b. F. @8 z
  23.     USBD_Connect   (0U);  /* USB设备连接 */* u, Y# l9 \1 u% D
  24. , J5 s) M$ j- g) A
  25.     /* 获取当前时间 */
    % G! j4 u" Q, S  B$ N& p
  26.     tick = osKernelGetTickCount(); 2 E: M- {5 Z/ ?6 |9 Q( a3 L

  27. % ]% T6 ?0 J3 ^6 ~# i; A
  28.     while(1)
    : D9 d" f2 S: v+ @: A7 G: r
  29.     {. ?+ e# Z9 ?" a3 @$ \
  30.         /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */5 r6 c$ X+ k  t3 C/ i3 m
  31.         bsp_ProPer1ms();
    % Z% k0 K. y+ o7 K8 M' P$ I4 f
  32. 4 t! i5 R$ y$ c, T& {( `
  33.         /* 相对延迟 */
    : V8 F; u+ x" V3 u4 s
  34.         tick += usFrequency;                          
    ) N$ _% V9 j3 D2 Z' k( |
  35.         osDelayUntil(tick);
    0 ^& {; i$ n' j, K" Y
  36.     }7 O8 ~5 e2 p5 p! @/ [+ P$ }
  37. }
复制代码
. |/ \; W% P6 p8 N' ?# x# c
4.14 常见移植错误总结% g8 N; ?# g$ s; o/ A
  编译后提示如下错误:1 F- }8 x( K0 ^4 y0 M3 y- U
error: 'Driver_USBD.h' file not found
0 m: \. r9 Z& n% X  p% a/ J
$ O9 l1 b) C  c7 [- F- j  d; A解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:1 c& d( z3 n7 U3 }5 I

. Q" J0 M/ |  Y8 ^6 U" R9 j
d32a6c67848ac92bf4c29e0fbf5ef220.png
1 Q/ U. Y6 }- Q& e
# D. y. k; i5 O6 M+ z% v+ y
  提示如下错误- k# D9 ~1 L. O0 P) Z
unknown type name 'HAL_StatusTypeDef'
7 c2 o3 }  Z/ G  r* y  P
+ Q% y  I  X9 \) l9 c解决办法:本章4.8小节。
+ p2 |5 ^3 M, M# |6 I
  @1 T! R/ Q# u5 F# S' D4.15 使用的MicroUSB接口并注意跳线帽设置
/ ?" b- f: I6 m9 V. `% i6 e本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:  _* Q' ^, i, ]
' k5 S1 [( [+ ?8 x
9c04c38f56dbbfd80201520f1e84223e.png

4 s5 H; |4 K7 E# o9 G8 B  J
1 w4 H6 ~+ Q& x  U/ a0 n注意使用的是MicroUSB接口:' z. L/ s4 i! N6 S2 [/ m- \
. Y$ W6 N' c- Z( ^
374a9b3f00b1d0e7cd589a59b3fe699a.png
6 d& Y$ [9 b* F

+ q- N8 S# `) p5 Q2 C. e& v注意板子左下角跳线帽的设置:
4 f- h6 e% X- P$ l$ {$ Z
1 ?5 `9 m( u& S
f13c6739f82641308861da50db97c44a.png

2 Y. V/ l) ~* W7 I# X4 Z1 r9 l. r8 B! d
这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。3 V4 M& h- P3 W
4 ]' q& F- n* P# v4 _0 @
4.16 实验例程# @1 V* Q7 d3 t( E6 {4 P
本章节配套了如下几个例子供大家移植参考:5 Y/ P6 h# G. D; }- N1 b/ ~+ Y- H
3 i/ E% ]" R& ?" s/ u
  V7-4001_RTX5 Kernal Template
+ `# R. y5 c! z- |
4 ~' d$ Z3 d! n: {! W* \RTX5内核模板。
0 U) h% Y- I+ p5 ^; \, e& K) _9 Y+ q5 l0 o, G: L) h
  V7-4002_RL-USB Template7 s( b7 z$ B3 w; [! h
) G0 b1 V) Q2 K8 M. U- G( ]% |
RL-USB工程内核模板,使用内部RAM模拟了一个U盘。
$ \7 `8 ]# ?- e5 N
) O7 L2 \+ A5 K" ?# Y; h3 X$ B) ?/ kMDK进入调试状态后,选择周期更新:0 l1 Y, _. |  B9 ]3 \
- }2 v' Z/ f; C0 z% {/ |$ \# F
dca8f2e82304e411670c3194cde12230.png

5 f/ [8 M' w' Z
1 p5 n8 {0 j8 e; \5 R. q- t9 p, o. L然后打开调试组件,注意和RTX4的调试组件位置不同:
6 r" Y. W9 n; K# p% [( V$ h+ q8 J* X7 k8 z1 y6 ^
9daa841c2ebfbe6204c5bb95355e5707.png

( l; [& I6 O- a( w  L5 ?" Q. T  ~: `; ?  Q# ?  O" I
然后点击MDK的全速运行,
+ f7 Q. f! m4 G# b
" b7 R  m9 s- F7 R! U; @
1d57a73648e5313c246a089fc2a85ac5.png
5 j: k  o0 a* Z" I
1 {  J8 G% Q; A$ K% x+ _
至此,就可以动态实时查看RL-USB的运行状态:
/ g" I8 Q; Z' R# _# U2 P8 z+ L& P
1e9d6ebcc79d1df8a4302d0c846080e0.png

- Q/ @/ L& t& G$ _( s
2 j) D7 O2 N0 l! a7 o$ `4.17 总结
! `! q/ I9 M- R# L- c& }9 {/ [
本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。( r: Q& b3 l" U5 [7 h

4 Z* V" T& m( V) C( ]. Y5 E
" [% `5 J# t6 Y% x* `5 ~, I1 ]# s& i( e, y$ F) s  }4 {8 r5 L

5 B4 J. E9 v: d0 M# a" T
0 p* J1 ~' C* {* _, B5 M0 C
赞 收藏 评论1 发布时间:2021-12-30 14:01

举报

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

好好学习

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版