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

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

[复制链接]
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

, }8 R* B3 S4 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配置等。
& p4 ]' ~: M, C5 P  第4步,创建应用。
# R, z# Q. z3 m* Z. r总的来说,这4步就可以完成移植,下面将STM32H7的移植步骤和注意事项为大家做个说明。  A  c4 M& R# o8 _; g

8 w- ~+ c/ }: M& L4.3   了解RL-USB模板框架设计

5 ~, \) |4 q/ U8 n$ A9 J6 f2 Z移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植:
. |, e, _2 R+ B
2 J( j6 O  c6 s" {; K
9c6a4f191f47051f48c46fad67830cf5.png
+ n6 \5 Y% S6 x. g' K. ^4 O
) D$ G, d8 i( c3 a: F" n" |6 o
框图如下:
7 d; t0 T4 `# S. T, V, p2 ?  w/ D4 t
3 f1 p+ n$ i/ P* h- J& _
5d53a3abf7c75f1cb8292dc449988f1a.png

/ l- T8 A/ _7 v0 c/ \6 G5 G( d: h8 `* k( k1 ~
4.4   第1步,安装指定的MDK软件包

0 ?/ R3 t# m5 t% X2 E4 T; a% V移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版):
. D# b5 |7 L3 A. v
, _/ ]  ^  M' @* V+ l% u  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
) h$ H% W  o& Q0 G) `4 ~! R1 D  STM32CubeMX使用当前最新的:V6.0.x
) Q  Q' h; ~5 A( c! Z  ARM_Compiler使用当前最新的:V1.6.3) ?' `7 O% V9 @% P5 X* T
  RTX5中间件使用当前最新的:V7.12
5 [8 M4 `  B. F# G" \) Q+ ~: i8 }* Q. g/ `( P$ P! ]5 T

7 e1 A. U* S9 H& t3 v不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:/ c/ q; _4 O* p2 }% j% g
7264b6fa8f70af9cae9f03812878d357.png / _' ^5 T- h: }/ p9 c' w

' H7 I( Z9 q3 p- T2 ~: R
4 \& T& K% n, G# M, c4.5   第2步,准备一个工程模板
) a9 x; z$ s9 s1 a
首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):
4 D  h; r( N2 f8 f" n( g- J" h  {% V1 l$ d- M, c0 K. M8 k1 m% r6 u; R
74269e50c64ab536eeb86097f3884ec3.png
$ Q, E! S9 R. \! A6 {
% V, E( k( x9 B  Q
4.6   第3步,添加RL-USB并配置

& l4 N! l* D$ j2 v- n6 W看这部分内容前,务必保证已经熟练掌握了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

! i5 ]2 j% y: @( @; J
ea12a66af6e60e048bf1b9b81e9aa08a.png

7 e4 X( }" A) T0 G& O6 `6 K/ n! O9 G( j! V, z
添加USB驱动:* H, W" A% X8 j9 d
  [/ g9 a0 x- d, u& H/ J8 A; W
b683b1361cf7de9821e95e9473212e41.png
4 m9 l$ ~, e3 ]& G

; S9 d& i5 }9 L. D) K  G: ?添加RL-USB并配置:% m, |3 \" ]. P
/ s4 c7 u9 U! t4 W. @6 o
4d32bb88eee575ba6da2871d56a1ffde.png

- s, A. C; K) L9 v2 Q4 x
* ]5 Q; f% s- B0 p9 [: Y6 q7 z0 K我们需要的都已经添加好,效果如下:, K) Q* b8 y8 ^1 p

' m. h5 y& ]1 L! Q# f) V4 j+ _2 h
6ce0595add222d31f90d93e116cad4f9.png

7 j& h" [) k, }5 _/ z/ K/ p; }/ \5 v9 J
红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节):
9 a8 S1 C2 O6 c, s+ x1 L, f1 l' Y- r; \( h( D, S
f4cf0f77d674b6a83289142025e72131.png

0 ]6 Q2 W, n8 C; c: @* O: T$ Z
/ y0 U3 n! l" M4.6.2      重新添加被隔离的CMSIS-Driver文件

) f6 J7 L% r( B% C! a/ @将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。7 {! X5 i  H0 G. u# F) S$ P
# V) k5 d7 Q, A1 T# y8 u
52112e844aee805fc01a6d40cddc00a7.png
! d( H3 ~. }# x+ |" ]

9 ?3 m5 p0 [+ NRL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件
/ X* M/ g0 T# `! N: ^' n: Z0 t0 M8 w6 O' @' l
7039175ef77263dc5dc73a486e83950f.png

$ w! K- y2 g5 S2 Y3 S, j! }% x, M- U! Y
内容如下,这些文件是来自MDK安装目录:
  _* ?8 D2 T; q& @3 W: Y2 }/ h
2 N( m1 L4 O! f4 ~" H% p
17b8ba3a04288a0e29d94e7ad5f45325.png

1 T$ S& X6 f& ]7 w  \
  R! G+ z' |7 ?: G0 T, a3 W, ?然后将用到的两个文件添加进来:9 g* ~9 D! D8 }; J5 R2 ]

8 a) S( f( ~: M. ?
9ad9fcc23d96b8aec42538dff0552a2f.png
, U! y0 Q& y6 a6 C9 v9 l8 j  E
6 J8 E1 S- `* k: `6 V
4.6.3      重新添加被隔离的HAL库USB文件
* W7 a) H1 I: V1 Z$ C8 Y文件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

8 |* a5 y2 s; i+ N+ }5 T
48241523bce89ad84d2851afef1384e2.png

1 j6 ?  Q% c; I$ u
) H3 E1 g' A1 t: f2 A0 M4.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

, c- h2 I- N9 X" C' c2 H5 d6 K
c5dcc4510924d2ff0e75092f7d4ca9fe.png

2 t* l& f! l' o1 f2 q1 c, R
( {. {) V8 _( a7 j5 m4 M+ t$ x5 J注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:
5 `  s6 `6 k' m9 ?" S4 L
. A' ]. K9 c1 j1 r7 U7 t; J" p; MosPriorityAboveNormal:
) h8 a" Z- f) A8 s- ?& V- R2 ?5 D: F8 M1 ]
f62a8fad5d1ce978c1730b2ad87955e0.png

" s+ w9 a+ P; A. q7 y
" _9 E* m. L4 C3 a: t) t* F- cUSBD_Config_MSC_0.h文件的配置如下:6 `# K$ R, m2 {6 w  E" i
  A, j0 K2 z. R( }; b5 v2 l/ n
1cffb6b1fa60821b7a7ab7900f7f40a4.png
4 h: W+ M" m& b6 r
+ l  j* |9 s" F" F
这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。/ {; y4 j* k6 E

4 [! j, Y) J. R* ]3 ^2 {
fafa76af25304dc853509d2c4dc839f8.png
4 J/ P* n6 R9 ~$ T

' X1 N9 X0 n6 `" z4.7   第4步,强制运行一次CubeMX配置USB3 ^8 g+ L* z: r9 `$ P+ R) D
我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。& {% E# M: T4 y: g

: {5 n; ?) a, U( A5 X' @打开RTE环境,点击如下按钮:3 I; z/ u4 m8 d* K

0 u' V" K! ]+ _8 A1 o* Z
6d97a5c7ce435822748232a4fe1b0e64.png
. c4 Z. Q! C4 K5 M
( j9 Y$ n, h- Z9 z, b5 m9 p
弹出的STM32CubeMX配置如下:
1 t% e2 g! r% u7 ~; F' h0 T. T1 }
$ l0 R  p4 z4 B! _* [( x6 a$ h2 t: U
2f47e57c5008dce25c2c00afe900142c.png

1 G5 K& U) T4 _2 C' ?. 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
2259b40b2cc2d5b5819f6ac79dd22c3e.png
  y4 X; k5 _6 b' I
; f0 ^% Q4 v. T
然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。( d2 e+ M# c! d. y& y' p3 E, W

, l( D6 o, Q  F6 w; D
17f991df1ea61c9ffd2dbb4c7216da25.png

& ~) N1 p  \. B, f. h6 `
; G! f9 c1 v, [$ C重新回到MDK,会有一个对话框,点击“是”即可:8 f/ Q( e. c2 F$ _

$ r( `! y5 f- ~2 Q# ]' h8 i, w! O
292e9c0668f8c166995f17f5d58cc2f8.png

6 e, w  X9 I7 Y: f  Q
* n/ h( @) b  p7 C; ?配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。
* G, L. ?. V  d
$ N, S# t9 P0 _
db9b1da83c41e9807da4cae3b2618f11.png
; o( i6 z* z" O4 K3 w

. _5 }3 ]( T( {0 Z( F4.8   第5步,修改文件USBD_STM32H7xx.C
! d' X( d# q$ n2 i( G" d6 O  s  _; H这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:
. k* I: v. \4 {$ W5 w. t5 A9 M
. \  V( j% X% ^' _5 @) H
  1. #include "OTG_STM32H7xx.h"  M( @$ ]! B& U7 i* a
  2. #include "USBD_STM32H7xx.h"
    0 z2 D0 o5 `) L

  3. 1 B0 X$ i0 g9 I0 S/ F* g
  4. #include "stm32h7xx.h"
复制代码

2 o8 s, c& v3 h8 k- @/ B/ o1 ?修改后的顺序如下:# m0 W3 p1 X5 J5 |3 T
: {% u( N4 K1 E  x9 ]( [* ^
  1. #include "stm32h7xx.h"4 [" Z( {& X& r( K( W
  2. 3 q* p5 a4 e  \. _! e1 C* Q
  3. #include "OTG_STM32H7xx.h"8 ?% _5 K% X& p
  4. #include "USBD_STM32H7xx.h"
复制代码
6 F; _: X+ G5 O# e) `' A
4.9   第6步,修改文件stm32h7xx_hal_msp.c
, H0 L7 j& j5 Q需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:" h$ G9 Z: |$ u' `! l4 h

6 M" m4 i  N+ T, s
5d9cadc09f4b5d106e20e496c919908e.png

( z3 g% y+ {( |9 J" ]+ _4 C! J/ g7 h; C
4.10 第7步,修改文件includes
2 F: R) ?+ h7 Q# |, A9 x添加USB头文件:#include "rl_usb.h"
8 H3 W' N% v( c) W6 c& `' 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" _

4 Z% l" y. L, g, a/*5 _2 ]4 o# p: P, |, m8 w
*********************************************************************************************************
6 w+ b$ @8 }* _- u9 l0 ~*                                         标准库# \- ]. |3 }, _$ j( ^
*********************************************************************************************************' g  `7 n6 X* n" p8 [1 R: o
*/+ I0 D% C3 O8 n1 i
#include  <stdarg.h>
. E4 Z% G' Y# x9 q#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: {

; @1 |5 F# I5 ^; R+ }$ A' z1 k/*
+ {/ s  M2 u$ C*********************************************************************************************************/ 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
*/
; c8 s6 {& Q% q8 N3 p1 j+ ~
" K8 F/ r8 I: r% D( x8 y- H8 i. X
* N* s8 g, l* b. L/*/ u; Q3 |4 U! X! ^- {- U
*********************************************************************************************************
- N% {( e1 }7 Y9 k2 b' l2 J*                                           OS和系统库
8 W' f$ q- K- B1 `2 H/ s8 v*********************************************************************************************************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
*********************************************************************************************************
  m& C2 L4 @. Z5 E5 _*/
+ Q  J5 d5 o# P% o+ H& ]. p' h6 A) z( C' y; p
) S2 C# ?1 a% c3 J

# l9 c# H/ `, t/*- b& I2 `+ a4 l$ \! j( [
*********************************************************************************************************
9 p" ~  x6 [0 q! _*                                        APP / BSP
1 b2 G0 x2 n3 K: j* {+ a8 B*********************************************************************************************************
, Y. d% U" Y+ d5 f, u*/, p( x# c3 _. t$ P: N$ _
#include "bsp.h"+ O# R  l- S# E3 z

# n# o6 ]3 {- r" s
7 V+ Q; x& O4 ^/ E7 P. J& m1 t" F1 {/ m
/*" c8 R/ g( Z! }5 T  P8 Q
*********************************************************************************************************
8 C  m3 x6 I* d: B*                                          变量和函数( K' H% j! e# Z) s! y- j! v
*********************************************************************************************************
: N7 l; U! F) h*/: t  [) O- y+ m+ J5 B' H* @
/* 方便RTOS里面使用 */  p4 X- \' T0 b
extern void SysTick_ISR(void);
6 u; f# ^1 c3 p4 B; `+ `# 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
3 ~" O1 t3 C3 G
! @1 s' a+ g! O: J* y/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/+ x& M0 ~( q: s
4.11 第8步,添加两个应用文件/ g( a7 M5 b- H2 j
为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下:
- ?, q3 X( A2 P" q7 `7 g3 ?) t7 G+ w& t( B" O: p0 d2 o* }! D
0ff85fc9774973eb80c1dbfa6653222d.png

8 ]! g9 d" Z1 a) |
6 Y3 [3 o. x/ s4.12 第9步,添加头文件路径
: n4 d- V7 e+ {" j  y+ h7 J添加头文件路径:
( q) }& T2 }; T- A! V5 }$ N6 ], o6 S. ?$ U1 N4 ^/ M
3d601bebf02ab97843fdaf69cbe84a46.png
8 i5 ^, b, s, O. F- [6 Y$ S

" _" C* Y% {3 d0 k4.13 第10步,创建应用任务(重要,注意启动任务)+ H$ Z" S8 \. @; q& H% u/ d3 k, T2 r
应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:2 W8 u5 E) T8 H6 y" J% k

- W/ ?# Y" _/ O% P6 I4 fAppTaskUserIF任务   : 按键消息处理。. w$ r( @% F* y% R

* j/ G, l+ z2 t( B6 X6 [AppTaskLED任务      : LED闪烁。
8 m. x' a5 \& \3 h0 n
1 b# c, l; `* E1 z! ^AppTaskMsgPro任务   : 消息处理,暂未使用。
5 y5 \* ^& z; ?- ]" i
# w- o0 e. n  cAppTaskStart任务    : 启动任务,也是最高优先级任务,这里实现按键扫描。# t( z, b& {# N6 G

7 ?6 B. m# B( K3 y+ E: C+ fosRtxTimerThread任务: 定时器任务,暂未使用。* ~7 P( \! V+ O+ X
+ ], F* w* L& R" k
任务栈大小和任务控制块定义如下:  h' O2 N" c- X; B/ V

- L* q+ g: `* E$ k# N! S
  1. /*
    5 {- J( W2 u8 a
  2. **********************************************************************************************************
    : [: F- S) v7 D5 |9 h
  3.                                              变量! {+ D% V# k$ q( \% Q4 ^
  4. **********************************************************************************************************" i1 u. [% F& ^$ g
  5. */
    - E  k8 ]. e7 }7 t3 p$ }
  6. /* 任务的属性设置 */+ z3 C- M9 c9 ~
  7. const osThreadAttr_t ThreadStart_Attr =
    # \6 C/ B- h* ^9 P$ G
  8. {
    " @; o# m7 D, s
  9.     /* 未使用 */+ |1 ^5 K4 f+ _9 p' j! C7 e# F* f
  10. //    .cb_mem = &worker_thread_tcb_1,# V) y1 H4 ]" g* ^9 S0 o6 }
  11. //    .cb_size = sizeof(worker_thread_tcb_1),: w5 N5 `+ t- q3 y8 L( \
  12. //    .stack_mem = &worker_thread_stk_1[0],( b% b' Z  s: J0 X' M
  13. //    .stack_size = sizeof(worker_thread_stk_1),9 I* A  p# b& o2 P. j9 M
  14. //    .priority = osPriorityAboveNormal,
    " z1 k* Z6 c8 _0 \
  15. //    .tz_module = 0
      s( E  c0 T' Y( n+ D+ O0 {
  16. 4 _2 D& y: B0 w/ J9 i7 r; J
  17.     .name = "osRtxStartThread",% M9 P8 [/ E. h& g
  18.     .attr_bits = osThreadDetached,
    " E2 T- I3 l( P( v7 _
  19.     .priority = osPriorityNormal4,
    # a9 G$ v4 Y4 ~$ e. F6 f
  20.     .stack_size = 2048,/ N& O1 `% u3 m2 u' O; g
  21. };
    0 d# y1 j( C3 Y& o3 j
  22. & z$ e7 t8 T% S2 T7 ^9 f
  23. const osThreadAttr_t ThreadMsgPro_Attr =
    3 i( |, L3 T/ i8 {) w5 |
  24. {/ `$ @+ J+ t4 P0 j
  25.     .name = "osRtxMsgProThread",
    7 J( t( W1 u7 H- H( k$ a6 H3 J4 M0 U
  26.     .attr_bits = osThreadDetached, 8 R% p, K* P0 u6 o3 _+ }4 k: r
  27.     .priority = osPriorityNormal3,
    0 c9 G* w0 l9 F/ m  q" R; Q0 D/ {
  28.     .stack_size = 1024,
    " j8 E& ]; e! r7 C
  29. };
    7 E( ^/ h* t: b
  30. 5 ~, K9 g% s1 m/ [6 w+ o& z
  31. const osThreadAttr_t ThreadLED_Attr = / c' G3 q1 ~3 X/ p4 d1 F- D
  32. {
    : ?+ G2 F9 H+ E6 u4 F8 z
  33.     .name = "osRtxLEDThread",. k- n( e0 f- \# X9 ]/ a
  34.     .attr_bits = osThreadDetached,
    * Y3 D* f7 x# N( R& B: x1 M
  35.     .priority = osPriorityNormal2,
    % O+ ^8 t; a2 R$ ]
  36.     .stack_size = 512,, k3 l* W) Q  X# E8 o! t
  37. };
    3 g8 @  P7 H4 s* D6 Y  P* M$ V

  38. & _- W3 ?$ j' U' y: t( [
  39. const osThreadAttr_t ThreadUserIF_Attr = ; [$ g" [0 h: X7 L$ A4 w9 z
  40. {
    3 ~( b9 Y2 H$ |  t' l
  41.     .name = "osRtxThreadUserIF",5 _" T: I9 I( w, t9 S3 Y
  42.     .attr_bits = osThreadDetached,
    : e/ V) W, l  D% A' h* H+ U
  43.     .priority = osPriorityNormal1,' O" _  J  u- r7 J4 V
  44.     .stack_size = 1024,* W4 K% o: Z* U8 F  t
  45. };
复制代码
, X5 x' b$ K1 @" D
任务创建:4 c/ ^) x7 Q, O# Y- `* ^$ p' }7 r

! @' z* J% c- a  S
  1. /*
    & e" q+ S9 z/ o
  2. *********************************************************************************************************
    * Q! d6 D& k4 x: k. P$ d0 i
  3. *    函 数 名: main2 q( o: x% ^/ j  Y) [+ c2 d
  4. *    功能说明: 标准c程序入口。
    # k5 p; v+ S, q5 P9 p9 d, s- J
  5. *    形    参: 无
    3 l4 B8 {! [+ Y' B* C  E
  6. *    返 回 值: 无$ W. A' y$ M# ?* {- `, I* \
  7. *********************************************************************************************************
    " n1 `4 z2 I) [; W/ J
  8. */  x0 t' ?" F9 F. o" g" C$ v4 A! F
  9. int main (void)
    + i  t9 M- R1 d" a5 V3 d$ m9 H
  10. {    ; y/ F( y& A+ l' W5 l+ l
  11.     /* HAL库,MPU,Cache,时钟等系统初始化 */
    : O3 @9 |3 ]2 k; ~8 x! S  j
  12.     System_Init();6 p) v1 i+ [. c4 n7 {

  13. . J2 {# k( h, X( P# R
  14.     /* 内核开启前关闭HAL的时间基准 */7 c! H; ]" I# U6 L4 i- U
  15.     HAL_SuspendTick();7 v0 t( U4 ^: y& Y1 p

  16. ! F% s# W" {$ q# K, j; l  \
  17.     /* 内核初始化 */* j5 _: `: [1 H$ T2 _2 w& }# V: U
  18.     osKernelInitialize();                                 
    ) s% K+ K: J- o) n

  19. ( D. Q0 F9 B# s0 m$ D9 k" e. D
  20.     /* 创建启动任务 */) v9 O7 Y  m* B, g: M5 Z7 @
  21.     ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  - x$ v4 e% i* M4 ~- U" e6 a4 }
  22. " p9 V* Z3 O6 N0 b- B( H8 K
  23.     /* 开启多任务 */
    ) _5 m2 x4 `! c' [5 f8 }$ X$ w) o6 g
  24.     osKernelStart();0 Q+ m- T1 t1 [/ u+ @0 S5 ?
  25. ' F6 n/ Z  \- v' `! g! x
  26.     while(1);
    4 n) Q) y9 i6 F* w9 g9 T
  27. }5 v2 {3 ~+ [2 l4 [
  28. ( `' z2 h; g4 `( b+ y# s* l. e2 r
  29. /*5 o8 l$ e% w: {4 Z) u
  30. *********************************************************************************************************7 z! L/ s0 ]+ Z* M+ J/ b0 _, |# T
  31. *    函 数 名: AppTaskCreate1 e# F4 G: k$ {% K+ f
  32. *    功能说明: 创建应用任务3 y% ]) M/ d3 b8 t4 i
  33. *    形    参: 无+ P7 k0 s, y% S0 b- D
  34. *    返 回 值: 无
    , g& ?( _$ o2 G, i" T' X
  35. *********************************************************************************************************. Q, v) C' L) T
  36. */
    ' \3 D0 e0 B* M6 m
  37. static void AppTaskCreate (void)
    : e+ c$ Y  j1 Y& E. d
  38. {
    . Q" N; F+ b5 D& T. z& Z
  39.     ThreadIdTaskMsgPro = osThreadNew(AppTaskMsgPro, NULL, &ThreadMsgPro_Attr);  
    0 A. I) z, }# T. `  z' p, w
  40.     ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);  
    + C: O- R, C, A6 t; U
  41.     ThreadIdTaskUserIF = osThreadNew(AppTaskUserIF, NULL, &ThreadUserIF_Attr);  
    * w( {& P; c  T1 `8 j& l
  42. }
复制代码

+ X; F: F5 r, U* ^这里我们重点看下启动任务,主要做了五个工作:
" R+ t  e8 Q& \4 ]# [' W
6 P3 K; V) N! _  外设初始化bsp_Init。
  _: L& n* A2 r% K  任务创建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里面直接调用。
- k% k; O' y- _8 [; V
  1. /*/ C" Q' B* T/ ^; e
  2. *********************************************************************************************************  U" J3 k$ a# R3 b6 M7 `& g. k5 p7 ?
  3. *    函 数 名: AppTaskStart3 S% O& V. F6 ]+ r) v
  4. *    功能说明: 启动任务,这里用作BSP驱动包处理。
    / F- Y5 O/ x. e9 L' d( J2 T& o7 d0 R
  5. *    形    参: 无
    ( m- P+ L! r6 Z* L) h, P; n
  6. *    返 回 值: 无/ v3 Y/ @# |- a, G* T4 p; l: b$ `& B
  7. *   优 先 级: osPriorityHigh4  
    & R% C0 m9 }) P( m  ?8 q4 M/ S
  8. *********************************************************************************************************# w  X  K4 k& a8 n% E; _
  9. */- `4 c2 z, L4 d" r
  10. void AppTaskStart(void *argument)
    ( k" f2 M' t' h6 V. Z4 \/ Y
  11. {
    0 B* @, l; b- B: B4 k# C% o! I) ]- y
  12.     const uint16_t usFrequency = 1; /* 延迟周期 */
    0 ^1 u" C; p$ Y: S' P0 u
  13.     uint32_t tick;
    0 G; W5 a, F' i6 z! d. [  A* n' ?+ X

  14. + U. }- {$ n; o/ u% p
  15.     /* 初始化外设 */, X' I/ @% V! P' @0 }; B; X
  16.     HAL_ResumeTick();
    2 U$ L* |0 [0 A# |* N( `' L
  17.     bsp_Init();
    8 r* O+ k' t7 ]6 `  ]/ [
  18. ' O7 L5 d0 r( W& X
  19.     /* 创建任务 */
    * r# @. D( ]% I' l5 U
  20.     AppTaskCreate();
    / |/ r- v2 B7 S4 e% F- Z' A0 d& x

  21. * s; a# Y4 ~( k. @$ ]4 J- k, p( q
  22.     USBD_Initialize(0U);  /* 初始化USB设备 */! J& R- b% ~5 p6 B/ P- f
  23.     USBD_Connect   (0U);  /* USB设备连接 */
    % F7 X' @6 D+ o- x8 ~

  24. 7 {# X9 N4 R5 x5 _+ V7 s
  25.     /* 获取当前时间 */! [: t6 _/ K1 r; d. S. X7 G
  26.     tick = osKernelGetTickCount();
    & W1 [3 Q  c" s& W8 i/ b

  27. 5 ]& @  c0 E- i; P/ t  }# i! A
  28.     while(1)
    ) b8 q$ o" {1 M" c; X, r) t, [2 k1 P
  29.     {/ O" F& M# k; P
  30.         /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */
    ' u3 z2 L. j% ]2 H( p7 ^
  31.         bsp_ProPer1ms();
    : R: u- H* S+ A$ ?8 o6 y- _

  32. * d/ ?, V4 q$ U& [8 i
  33.         /* 相对延迟 */
    2 y+ L7 U# |% \( a  {
  34.         tick += usFrequency;                          : Y( a1 F6 z1 O& B- M3 j
  35.         osDelayUntil(tick);& F" `' O. {6 q
  36.     }
    % }; @, ~# E/ J7 P1 Y
  37. }
复制代码

- j0 X& B) c+ n4.14 常见移植错误总结
  {" C7 {5 B. P( {- ]- M  编译后提示如下错误:! 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
d32a6c67848ac92bf4c29e0fbf5ef220.png

% {0 N( E1 i. c7 [. G0 u8 ~
, ^: ^5 f7 I7 Q, q+ h  提示如下错误  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小节。
1 g5 e, `0 F- L; M# 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
9c04c38f56dbbfd80201520f1e84223e.png

, W7 L& }0 A5 s6 N
/ e0 a/ p0 k0 `" r1 b  U2 z' I  n* P; d注意使用的是MicroUSB接口:
3 D: F* v: R( X) X/ V2 q  ]2 s& V' |" `- j8 I
374a9b3f00b1d0e7cd589a59b3fe699a.png
& r3 A5 O* P" |& w) F
/ L. w. [: [8 ~8 V7 P$ D1 K
注意板子左下角跳线帽的设置:
; ^: N4 f. }) I! n7 \8 z  v2 U$ b: H4 t0 O
f13c6739f82641308861da50db97c44a.png
! R, k( ?7 D% u( w) b
# H- G5 J# _  _- E5 J- q1 h
这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。
  e/ [/ `2 ~: l
( x% d, e0 e' u% R; ?4.16 实验例程0 P$ @# ?6 X+ E# y+ s( z
本章节配套了如下几个例子供大家移植参考:
; \; ]4 f7 i7 O& J) R
. f' V$ j# N1 w6 q3 M  V7-4001_RTX5 Kernal Template- N$ U. \$ y: m  \
7 C( s& v* G; k* {# [3 U
RTX5内核模板。
+ v+ _9 k( X% A7 ?8 R) {+ _* H% T% n; k# O* X( Y- J1 |
  V7-4002_RL-USB Template! R/ ^( }. M" Z9 M; X* g

# ^* p# C* F, D% Z8 T1 y7 vRL-USB工程内核模板,使用内部RAM模拟了一个U盘。7 P, u* b: H* L" i# U

4 I- K/ C- u+ Z1 x* [MDK进入调试状态后,选择周期更新:
+ Q. \& B- R7 K* h) M% A1 j, ?
) `! _7 J# F! E  [
dca8f2e82304e411670c3194cde12230.png

, ~4 c( ~% T4 s& k! l& M
' L' T/ Y& D" s9 q7 q0 s) l- K) E然后打开调试组件,注意和RTX4的调试组件位置不同:( |) p) Q8 q. Q) X4 ^2 T
+ \! ^+ P3 i/ _- c3 B$ S
9daa841c2ebfbe6204c5bb95355e5707.png
+ E/ u( T) X; n$ N: v
4 w/ ~) ^- s( p1 [* ^+ s8 J/ W
然后点击MDK的全速运行,2 z8 v* ]) V/ @+ C# P, `
1 Y. G( X  Z4 i* J( _
1d57a73648e5313c246a089fc2a85ac5.png

2 K/ A7 H. ]  k
# o5 V  R3 w& _至此,就可以动态实时查看RL-USB的运行状态:
' w7 w) V* {* G$ A1 I/ W. k& o; |; @, N. }
1e9d6ebcc79d1df8a4302d0c846080e0.png

# x; G9 |; j' {8 y
/ ^* [/ m, [3 u+ v0 O4.17 总结

1 M) q( A) v9 }& l, k本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。
) D& ~& p# W: y' ~; X$ J
8 x. w9 p2 \7 r! b* `
' S& m. F! M5 J2 H3 R1 _# V$ _" {# y6 a5 W2 y
2 \1 U2 u; v* |! e7 S! F* M

+ \$ N6 T5 T8 U# |& f
赞 收藏 评论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 手机版