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

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

[复制链接]
STMCU小助手 发布时间:2021-12-30 14:01
4.1   初学者重要提示; T4 L9 c% {: n& I+ c/ v
  学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植) K9 s  I- ]+ L9 g
  STM32H7使用MDK RTE环境添加RTX5和RL-USB,需要强制运行一次STM32CubeMX,因为H7已经没有配套RTE经典添加方式,而STM32F4是支持经典方式的,所以无需运行STM32CubeMX,详情可以看我们STM32F4开发板对应的RL-USB教程。
  @% Y& ^9 j/ [& X) \- f  本章配套例子使用STM32内部RAM模拟一个U盘,使用的MicroUSB接口。
# Y  e, g  C. h& [% ^9 S2 v4.2   移植RL-USB整体说明7 H. m$ @) Y1 F; h2 P
移植之前,有必要对移植过程有个整体的认识:
% W+ ]! h$ |4 _" G" f0 s+ M! s) I' w+ d! I4 d7 R( ]
  第1步,准备一个RTX5工程模板。3 U! K. v( B* }9 r
  第2步,移植RL-USB。
+ g9 N, M9 K7 [  移植RL-USB是采用MDK的RTE环境直接添加。当前H7芯片使用RTX5强制运行STM32CubeMX,所以需要大家提前安装好STM32CubeMX V6.0或者以上版本。
( O$ D# a5 |0 I- X  第3步,处理HAL库时间基准,MPU配置等。" M( @0 w+ E* o, m
  第4步,创建应用。+ B  m( n6 B# G5 S7 R
总的来说,这4步就可以完成移植,下面将STM32H7的移植步骤和注意事项为大家做个说明。' ]- K% n. l' {3 c/ i* R& x

: E& Z( k8 ~6 B$ o4.3   了解RL-USB模板框架设计

$ I4 ^+ C: V4 e8 ?# `5 I7 w$ ?移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植:, T' n. w- N. C5 m( a6 U9 C
& B# g: g( h' g/ m0 h
9c6a4f191f47051f48c46fad67830cf5.png
4 y! x1 t8 j) d9 w- m

1 i' b' c1 ?9 G6 v6 r3 _1 d  a框图如下:' c! e6 }1 I& A; m$ q+ d

9 p0 C, O; B$ a) T3 ]2 Y
5d53a3abf7c75f1cb8292dc449988f1a.png

: q5 t6 T2 [/ z4 [6 U1 d% \! Y- u9 Z! S
4.4   第1步,安装指定的MDK软件包

! l" R1 z2 P: Q; p9 H# |2 P移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版):
+ f* g' P3 A. O1 U7 E  [" B
+ J: m; K, _+ [4 _4 G  CMSIS 软件包使用当前最新的:V5.7.0
4 R' G+ G" l& m2 O  STM32H7使用当前最新的:V2.6.0
5 n/ y' @0 v2 }; o# A3 o0 w. @  STM32F4使用当前最新的:V2.15.07 `$ h2 R) ]  I
  STM32CubeMX使用当前最新的:V6.0.x
- T- w0 U0 m2 d  ARM_Compiler使用当前最新的:V1.6.3
+ ^) N$ [/ d/ c9 n1 |! F/ f  RTX5中间件使用当前最新的:V7.12
' y9 ~5 {& e, w( O& j+ K" k, T% n" G
2 Q" n, ~$ M8 b% G! |
不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:' Q) O% L8 S- E9 ]9 O; v8 e8 g
7264b6fa8f70af9cae9f03812878d357.png
" C* z8 X* |! [( m/ t) x- j" K4 S- a! [9 H4 E! i1 \/ Q6 e
& Y- X+ o, L) W
4.5   第2步,准备一个工程模板

) v3 Q, G  J' C! ?' o5 d0 T首先准备好一个简单的裸机工程模板,已经为大家做好:V7-4001_RTX5 Kernal Template,准备好的工程模板如下图所示(大家也可以制作其它任意的工程模板,不限制):
, y- {. K4 w  W' C* E. m1 N- A; |  \2 b# }: M- Q. b( U; q
74269e50c64ab536eeb86097f3884ec3.png
0 r* t' Y* }% B5 W3 g8 _

/ X9 {- u" @& }, N* t% o4.6   第3步,添加RL-USB并配置

, V3 U! ]( r7 I4 m. w' q2 [看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。" J! d! ^9 ~! c3 A, H/ f
7 T- a9 }2 b7 E3 i8 z
4.6.1      RL-USB相关文件和驱动9 u* x0 x" g: F* Q5 B/ L0 ~9 S/ G. Q
CMSIS-Driver分组中添加USB Device驱动:" j: m& W) \5 d" H) y% D: O- P9 e
0 A/ l2 t( Z! V& ~1 d) \7 E
ea12a66af6e60e048bf1b9b81e9aa08a.png
6 T0 H2 ]: E# u6 I0 ]7 M, H

3 d: Y# N" N+ C添加USB驱动:
5 z: w8 ~/ O, f
* Q  _; b" v4 p# m
b683b1361cf7de9821e95e9473212e41.png

" ?3 J: O5 A$ a: S
6 H" v! `5 x$ ?, i7 ^/ j' j0 \添加RL-USB并配置:
& K+ u- F! e5 M1 R% ~3 R) S% j1 w6 ]9 z( j" \( g  m
4d32bb88eee575ba6da2871d56a1ffde.png
: y) w9 y2 k0 U
; Y" i# f+ l3 Z7 w8 T7 ]8 G
我们需要的都已经添加好,效果如下:. e6 T0 @# V; |% t" c9 p1 {, d

8 t8 Y. l0 ]/ h4 e! q- a
6ce0595add222d31f90d93e116cad4f9.png
- l$ {3 B8 u3 l
- _; U; V7 _& a5 N" \/ `7 j
红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节):
; E) ^4 u! S! q$ }+ g3 j" m. I1 N  R# T7 F
f4cf0f77d674b6a83289142025e72131.png
+ ?. A5 N- d: l4 I

! b" w8 e$ b6 W. {4.6.2      重新添加被隔离的CMSIS-Driver文件

: G' F9 Y7 }$ l9 B9 M将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。" `4 Y! ]/ v; M: d" Q$ n
! P( C9 S( \" c4 r
52112e844aee805fc01a6d40cddc00a7.png
3 c- |: t0 K4 R; W3 V) @
! i$ c: [) T7 B7 R+ g
RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件. s- V: E+ J+ {) q( K" F

/ p6 \: t3 h9 Z5 {: A$ M1 B/ Q
7039175ef77263dc5dc73a486e83950f.png

' h  b! G; N; U
8 M0 A- d, G' t内容如下,这些文件是来自MDK安装目录:& M) M* }9 j( |; Q# @6 c- ^2 D
) ?$ f1 F: i# y9 C
17b8ba3a04288a0e29d94e7ad5f45325.png

# p, Y) f: J' J$ y; h/ \/ @+ {7 n/ [; |3 ~
然后将用到的两个文件添加进来:. u& a0 \+ u7 A9 L6 A; b
5 E0 F, q. K$ s3 x0 J
9ad9fcc23d96b8aec42538dff0552a2f.png

2 H6 I% F) U% r0 |; a5 f; Z! z: h1 s+ W9 q
4.6.3      重新添加被隔离的HAL库USB文件' ^" `" c9 c' I4 w2 H
文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来:
% E- @/ Z/ h4 \3 K" h. q$ ]. ]+ d7 o' T
48241523bce89ad84d2851afef1384e2.png

4 V; C0 ~. d# F+ J  V, [8 C8 w1 ~9 I+ V+ j% L
4.6.4      RL-USB配置
' G! p6 r. z. u/ @' K! T! f添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。
1 k! L6 t$ U- _3 X2 G. U( b! k
% z7 [0 c" o1 o6 f5 j. mUSBD_Config_0.c文件配置:  J. X  `  W! Y; A. R$ K- b

( l+ A6 Z) F. I$ e( ~! s
c5dcc4510924d2ff0e75092f7d4ca9fe.png
3 c9 d- b" O7 b$ n6 y

* p  _/ y. B, O7 j注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为:
1 C" X% H8 j9 H4 y# P5 p
' |. ?5 B3 I+ @; @  ?' CosPriorityAboveNormal:! b$ |" @0 P3 V8 N8 A$ q
; O. |' n8 W- W! Q' Q, ?
f62a8fad5d1ce978c1730b2ad87955e0.png

; C# L: e" t7 n1 A6 \* D/ P+ c+ Q2 A# p  T( I- B9 ~, ]
USBD_Config_MSC_0.h文件的配置如下:: \1 A$ r- n# T9 c; O" s2 H
) k5 `: \6 D8 a0 _5 _/ p" {1 B, Z
1cffb6b1fa60821b7a7ab7900f7f40a4.png
5 Z7 ?$ F8 v) [
! X3 o5 z. f7 G0 c; T2 T+ I
这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。5 Z2 \" W0 t9 V/ Q( a

6 X4 c/ F/ A7 f- a( ^
fafa76af25304dc853509d2c4dc839f8.png

  b* Q7 Q' h  q3 k) f, K5 \1 e
" D$ E  Z( m' L" w. s  d4.7   第4步,强制运行一次CubeMX配置USB
* p8 p) J. ~# A# F# g) U, m我们这里要强行运行一次STM32CubeMX来自动使能RL-USB的相关宏定义,并配置USB接口使用到的两个引脚PA11和PA12。
! p3 I( k& Q# f% B/ l9 q: g3 l% J
6 i/ f( Z+ f* G) m打开RTE环境,点击如下按钮:
. e) V5 }7 V- a: A1 |% a, L4 ^  m+ R  d* L# v
6d97a5c7ce435822748232a4fe1b0e64.png

, {1 y; E8 ^) Z- Y9 ]- I9 Y. V8 w) \" \- G
弹出的STM32CubeMX配置如下:
  w9 }  ^( i* \% V, q8 e* V' r# {2 ?" X6 l+ s) p6 K
2f47e57c5008dce25c2c00afe900142c.png

. p  v0 z9 l) |, A* H8 t3 g5 P1 [5 X
修改位置1:用于选择仅使用设备。
, h! k  {: G& F) |" Z
/ ?' p3 c3 R/ M! k3 T2 f修改位置2:用于使能USB FS中断。然后点击“GENERATE CODE”
: H7 v2 |' V: t( Q5 P8 S
& A6 G' d; }; K' o7 d* s
2259b40b2cc2d5b5819f6ac79dd22c3e.png

$ k( S: O& X$ e' o# A+ g+ S  e- s& }5 r; H# }$ p5 v+ i) \
然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。( L; g8 V: d: A2 T5 e( o$ `& C
4 I( p: Y* W# u" Y9 K* X, l
17f991df1ea61c9ffd2dbb4c7216da25.png
5 I' f& ?- C! P& K" R7 o- a

& |  r/ J2 ~8 B* a9 ?9 f重新回到MDK,会有一个对话框,点击“是”即可:
2 C/ I3 P$ E/ s( `( }9 t/ R( z1 Z5 Y5 U
292e9c0668f8c166995f17f5d58cc2f8.png

: M2 }# j! X; ]. d  c2 e) U$ o9 Y
: y" p2 d$ n+ D1 D0 b+ K( Q配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。8 @6 g  c6 C: I  T2 c

6 P2 H8 y3 G% O* S# b4 i& F  H
db9b1da83c41e9807da4cae3b2618f11.png
! {- a( K) c) V  n6 F0 i: T
/ c3 ~4 d! p& ?7 \  K. @7 x
4.8   第5步,修改文件USBD_STM32H7xx.C+ c* R/ B8 n0 B5 I+ ^+ d, h1 r3 l
这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下:) b0 c! G! j* s3 h/ \( U
5 o! n. p- H8 @+ S! A) B6 P
  1. #include "OTG_STM32H7xx.h"
    8 T$ o9 b" ]% g3 \- B) E
  2. #include "USBD_STM32H7xx.h"- E. ^, ]8 m( Q2 Q  b) ^

  3. + b( F' ~- O% p* |6 [" z
  4. #include "stm32h7xx.h"
复制代码

6 W5 M- W8 r% Z& _) j; Q修改后的顺序如下:7 n' G0 l  L; J- n/ L0 \  Y+ O9 @- y
) c+ L! T+ _0 Q/ M" d/ H
  1. #include "stm32h7xx.h". J5 U. Y* Q( N, R0 k' q" t9 L* a

  2. 9 w1 h9 E/ L+ E" ?1 ]& l! O' E
  3. #include "OTG_STM32H7xx.h"
    , Q. U# ^3 I- P! b# ]1 K
  4. #include "USBD_STM32H7xx.h"
复制代码
, B8 K; H! S0 @( ^% q
4.9   第6步,修改文件stm32h7xx_hal_msp.c2 ~0 r$ T+ Y$ i% o  q6 d* i
需要在这个文件开头添加一个变量PCD_HandleTypeDef hpcd_USB_OTG_FS,此贴变量会被USB的CMSIS Driver文件所调用。最好将其放在如下位置,防止重新调用STM32CubeMX时将清除掉:7 {; k  _- C% w" d6 W* x7 x/ L0 q

/ P& r8 ~" Q7 N) g/ r  u; S
5d9cadc09f4b5d106e20e496c919908e.png

2 }/ y- \, [6 U8 f( m' _: G2 G& k6 U/ _
4.10 第7步,修改文件includes
' r# H5 v( Q4 w: a& W添加USB头文件:#include "rl_usb.h": @- i9 f( T% a7 W2 Q
3 r2 A3 }: E, D2 `7 i
#ifndef  __INCLUDES_H__
/ y$ h1 |, O* t#define  __INCLUDES_H__0 m+ E, y- l$ Z) s2 m! d

- o4 `& Y, F) }0 V/ `" W, E. r' d/*( F* |% w! I! p+ s
*********************************************************************************************************
: q. s7 w1 Y+ a2 L*                                         标准库
3 u7 z. ~9 Y2 `+ g* I" O*********************************************************************************************************1 }, [8 Z0 x3 S" R! F8 l! J2 m) T- S
*/1 ]" I' J3 S! c0 l# Q  E/ d
#include  <stdarg.h>/ t, I4 {7 b3 r9 j" W. g
#include  <stdio.h>/ i$ _' _! V& {! x. O# K
#include  <stdlib.h>5 @6 ^$ L, Y3 g4 v
#include  <math.h>4 D) }  A2 p! B7 A
" X& f" a4 c* y& h

# l! |2 l( W0 T8 f5 j/*$ |! B+ R  L. Q  U
*********************************************************************************************************
, X* ], f' i8 e, G6 \' a6 t+ Q7 a*                                         其它库
4 n9 S" d  T7 r4 o8 V* l& p) u3 j*********************************************************************************************************
4 y/ I& e  B+ ?) E) q*// d& O, D2 S# F7 B1 B% Z8 I, ~

( I2 E( P. g/ I3 j) B" k& [: v/ |/ @* B5 ~4 ]' h4 a
/*8 Q& i" E6 H3 r' W% f
*********************************************************************************************************# `( ]  ]# c# E" D: h
*                                           OS和系统库' E) c4 y$ Z1 a. e5 E
********************************************************************************************************** y- |. e+ _# B
*/% j8 n- g1 D8 Y" {
#include "cmsis_os2.h"
2 Y8 Q, m$ y0 w#include "rl_usb.h"
+ g8 g/ ]- {0 C" X. K* g2 N- `$ b& K* G+ a
/*
# W" Q1 E9 L1 t9 k1 g7 N*********************************************************************************************************! A9 H& s3 |  C1 m' u  Y
*                                           宏定义
( w# O% `  [; ^& e, o*********************************************************************************************************
# b6 m8 s$ x: f9 c8 n* N  e*/: f; _) z6 J1 e! I6 |- O' n

3 E" O1 \/ a" r1 c) R; Y' i0 D/ p
6 f( F+ H, l6 U6 M/ ?6 r
3 X1 e* V6 r) Y% O, l/*5 K4 @; g& A" ]' m' w7 l9 p
*********************************************************************************************************
/ `; O% {2 l' }3 ~0 S0 h$ Y3 ~*                                        APP / BSP
7 k% P" ~0 s% z2 ]" T9 p* `*********************************************************************************************************
( T/ y( p& v+ Q2 {*/% M; p0 ^( g" u* A/ u8 z" L: I" U
#include "bsp.h"
* h9 E. C0 @; ^! g& _6 I; _: f+ g( e& R0 R% h' R) q1 U4 i
) y" p1 [6 C; h- ~, V' s  w

! q3 N" p, V/ ?* i3 ]4 R& V/ y9 p/*$ y( i1 t3 c+ P/ A' v0 j
*********************************************************************************************************9 {# w2 i, F7 o
*                                          变量和函数
0 z! H1 N  g7 ]" h9 q7 e*********************************************************************************************************/ j1 v/ v8 ^& F
*/4 n- j/ |: Z# b+ W: G2 s
/* 方便RTOS里面使用 */
, _" U- I4 M' K% t5 iextern void SysTick_ISR(void);( F* k1 C/ u) ^! `
# B3 X% @0 M/ L' Y
#define bsp_ProPer1ms  SysTick_ISR
3 I( q9 m$ B# q( l3 m1 }
+ a  `$ J$ k" C  u/ {% g#endif$ o4 ], B# Q, C4 S& n: Q6 A/ ^
  l% i9 b$ f5 \4 V
/***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/
/ F* x1 \3 P" ?6 R0 C4.11 第8步,添加两个应用文件
4 R% v5 U, N  [1 t4 t4 s为了验证移植的USB是否成功,我们这里使用内部RAM模拟一个U盘。需要添加的两个文件在MDK安装目录里面。方便起见,大家可以直接从本章配套例子里面复制粘贴(这两个文件位于User文件夹),添加后的效果如下:( F  Q5 u( v+ F- N6 I: x1 c
/ n1 q3 i, {7 ]  R( E
0ff85fc9774973eb80c1dbfa6653222d.png
& b, z. ^" E! Q7 b' M3 L" A+ H
+ ]" i! l5 b6 i6 G0 ]* W
4.12 第9步,添加头文件路径
% W* a( S. T: `: v* i% G4 }& U1 U添加头文件路径:4 ^5 L. m) d8 W' U) P% i

- p$ f. h7 @7 ?, J" F/ S& R; [' U9 c
3d601bebf02ab97843fdaf69cbe84a46.png
' D0 ^7 T- @% U% M2 C

3 o# }9 J1 @. E. I9 J3 H6 }  F, V4.13 第10步,创建应用任务(重要,注意启动任务)
) l5 e3 u8 q$ q应用程序比较简单,大家可以直接复制本章教程配置例子的main.c文件中的内容到自己工程里面测试。主要创建了如下几个任务:
+ B" ]8 _" u6 D% k# P* v/ f9 f) K0 h9 x9 N6 w. `  G- a
AppTaskUserIF任务   : 按键消息处理。# j/ o# X! Q/ b5 B

$ r- S7 c! G9 l5 JAppTaskLED任务      : LED闪烁。
6 @9 U0 N7 i0 r! @) c/ g6 E  G- N7 m; |# O' ?
AppTaskMsgPro任务   : 消息处理,暂未使用。
% U$ N( W: E* I+ T/ k$ k% z
* \# L3 h4 n- j  U6 cAppTaskStart任务    : 启动任务,也是最高优先级任务,这里实现按键扫描。/ y, r& _: U' S' t
" V. \, V, M" r+ [4 e9 g: K2 U  J
osRtxTimerThread任务: 定时器任务,暂未使用。
- e4 O$ c/ _5 a. k; f# o. l4 R/ f% n# P4 `: u0 f* }- F
任务栈大小和任务控制块定义如下:
: n8 D8 }6 S% _, C4 s3 }- v, L; C# S& u; f; S
  1. /*4 D& V; J/ x; U7 }
  2. **********************************************************************************************************; M" i, G' [4 A) t7 T) x: k
  3.                                              变量
    ( [; o# S6 s. z7 m* u3 x, M
  4. **********************************************************************************************************5 J# O4 I) }6 m1 ^5 v: \! N$ e
  5. */- P7 B* _8 w+ }+ Z& M# n
  6. /* 任务的属性设置 */
    / n1 }* q" B" i- Y9 p5 I( o  d
  7. const osThreadAttr_t ThreadStart_Attr = ! {# E# H4 ]6 T8 M2 W1 B& q: \4 D
  8. {1 ~& r# {0 S5 K* S8 @+ n
  9.     /* 未使用 */
    4 _2 U5 `6 a: f, X: {; y/ P: c$ W. @
  10. //    .cb_mem = &worker_thread_tcb_1,
    % O# z) y+ g$ _; y
  11. //    .cb_size = sizeof(worker_thread_tcb_1),. n, W# v. O8 j: f  Q& A
  12. //    .stack_mem = &worker_thread_stk_1[0],
    7 U2 _, J* K' }- A; _/ X7 p" g
  13. //    .stack_size = sizeof(worker_thread_stk_1),) K* l, }7 }4 D( G  k5 G9 E& O$ d6 g7 [
  14. //    .priority = osPriorityAboveNormal,$ ~$ ^4 _; I5 S' q- v, U% h
  15. //    .tz_module = 0
    . t2 n5 z* O, B
  16. & C, `+ O# B0 `; M* S
  17.     .name = "osRtxStartThread",! g6 ^7 ?4 i& t  p/ j% \' s
  18.     .attr_bits = osThreadDetached, ) B4 f( y9 A% s! X
  19.     .priority = osPriorityNormal4,5 p3 z: e" S4 Q7 W5 w
  20.     .stack_size = 2048,, K# T$ S! j+ O; h6 j
  21. };
    8 I3 x: q' O: X4 Z, ~3 f
  22. ( R- H2 w$ T5 h  _) I
  23. const osThreadAttr_t ThreadMsgPro_Attr = " m# i7 B- F0 M- C7 V
  24. {7 G% r/ k+ B. G: c
  25.     .name = "osRtxMsgProThread",$ G9 K+ p" k5 N9 C" m! Q
  26.     .attr_bits = osThreadDetached, ) J7 w- i4 e) l. R& `
  27.     .priority = osPriorityNormal3,8 U; X6 {& b& u* i4 D
  28.     .stack_size = 1024,
    ' R7 o3 T" c7 e8 k: \- H  Q
  29. };
    - ^+ R/ U$ P# |$ Q
  30. ( C4 y+ ~/ h# f& b5 i( I
  31. const osThreadAttr_t ThreadLED_Attr = 9 p3 q0 a+ Z4 m- r; I' b: v2 }
  32. {
    # {4 T1 k3 ?8 r+ Q; w$ D
  33.     .name = "osRtxLEDThread",5 X- V6 U6 d" O; Z7 z4 s+ G4 G9 f/ F5 t* |
  34.     .attr_bits = osThreadDetached, ' [  Z4 F* W6 z6 d3 |
  35.     .priority = osPriorityNormal2,* x2 [: R9 Z( M; h- V5 ^! p* j
  36.     .stack_size = 512,
    ( w0 d3 X  x  x/ ^8 b' o2 V" V8 V
  37. };: o$ M) h" v7 o5 I# f) R  }2 e
  38. * G! O; b' P6 O, S
  39. const osThreadAttr_t ThreadUserIF_Attr = 5 m- I  I) H/ F
  40. {& v: `' @% z0 r8 ]2 L9 O$ a0 G
  41.     .name = "osRtxThreadUserIF",
    " L6 x- ]/ x$ w4 v% Y$ |
  42.     .attr_bits = osThreadDetached, ( \  I/ a9 B& q0 z. |
  43.     .priority = osPriorityNormal1,
    $ D" _" b2 Q; [$ V
  44.     .stack_size = 1024,$ x4 v( ?7 Q2 j$ K/ Y& \2 ?
  45. };
复制代码
7 m% N1 G* d+ C6 f
任务创建:, |. J6 k& g6 }

6 k9 O5 Z5 l3 m$ n" A% N, f
  1. /*
    ! Y. e1 j  L* [7 a4 v0 N
  2. *********************************************************************************************************
    ! V. }5 l) t1 J9 k5 w( G9 z2 Q' ^5 [
  3. *    函 数 名: main; s6 R( A, G# Q! P7 o- ?/ w2 g" ~
  4. *    功能说明: 标准c程序入口。
    & W) A3 B. j3 R  u+ j
  5. *    形    参: 无% D; Z. z$ }7 c: {' W; X! |
  6. *    返 回 值: 无
    8 G5 Y6 K" i6 ^% S: z" A
  7. *********************************************************************************************************
    3 |- [+ h6 w6 E" B) U' B
  8. */$ d+ P9 D9 {% w' Q& i8 [$ Z
  9. int main (void)
    : I/ J3 S+ E8 X# n
  10. {    % D5 g% I5 x) [7 B( ~  g3 D: L9 x
  11.     /* HAL库,MPU,Cache,时钟等系统初始化 */
      N+ `& _6 f# K2 n. n% `
  12.     System_Init();; j4 l, m& f3 J9 g. Q

  13. # t, d5 N6 Q$ j6 w9 f. Z4 Z* b
  14.     /* 内核开启前关闭HAL的时间基准 */5 d" o. z1 y% U+ ]0 O  C" Z$ {9 l' l3 H
  15.     HAL_SuspendTick();
    4 B- T8 `$ U5 q% u7 Z
  16. 9 e9 {: a4 K  t/ u6 q9 ^! y
  17.     /* 内核初始化 */
    8 _. ~$ u, {% q
  18.     osKernelInitialize();                                 
    3 G4 A0 d7 _9 x" D8 \

  19. - |: f" W( U& \9 ~; H
  20.     /* 创建启动任务 */, X# P) v/ i: M4 _$ {
  21.     ThreadIdStart = osThreadNew(AppTaskStart, NULL, &ThreadStart_Attr);  
    5 ~# L+ k& v$ H" A; O; n

  22. # q& H$ X5 H% }# Q5 [6 ?! C
  23.     /* 开启多任务 */
    0 h# T  h& d6 e
  24.     osKernelStart();  ]. ]+ b* f$ b- p7 N/ ?4 `5 n

  25. " z( h7 S) r8 @( o6 q+ p
  26.     while(1);" l9 Q/ K$ l, X/ j' \. N; ?
  27. }
    9 v1 N) Y1 n) `7 ~" N: e
  28. . g; k7 x5 u4 a; q) n8 Q( `- O) \
  29. /*
    * L% Q3 _5 t" O( T
  30. *********************************************************************************************************
    9 M# h2 P+ W0 \! I4 {
  31. *    函 数 名: AppTaskCreate+ p0 K5 t* e$ b
  32. *    功能说明: 创建应用任务
    ( ]1 I7 f3 Q! W: G% j$ _7 r1 S) l6 H
  33. *    形    参: 无4 t! O! L, z; l9 b8 y6 P, j
  34. *    返 回 值: 无5 f0 v% x8 T' P4 R( U
  35. *********************************************************************************************************
    8 [) V7 ]1 P6 l; {2 V( {
  36. */  l. K3 c6 N# o- O
  37. static void AppTaskCreate (void)/ D$ ~5 E0 m0 z) g
  38. {0 x5 `4 {, V2 e- n
  39.     ThreadIdTaskMsgPro = osThreadNew(AppTaskMsgPro, NULL, &ThreadMsgPro_Attr);  
    / b8 {( ~# V) c$ C2 a
  40.     ThreadIdTaskLED = osThreadNew(AppTaskLED, NULL, &ThreadLED_Attr);  6 \0 s+ F# t; B/ F; U/ C5 ^- f2 L
  41.     ThreadIdTaskUserIF = osThreadNew(AppTaskUserIF, NULL, &ThreadUserIF_Attr);  7 S' J8 i" \0 R6 D- ~
  42. }
复制代码
+ X6 H# I& d1 s) _* f6 |
这里我们重点看下启动任务,主要做了五个工作:
8 V( k. Y6 P( |2 v6 e) U# P% d  N+ \: N. S; U& M" ~8 w
  外设初始化bsp_Init。
* b) Y% s9 L; W9 P" p  任务创建AppTaskCreate。  ]. C2 G# U/ f1 U9 Q9 K
  初始化USB并连接电脑。7 _" \' Q! M. n" z
  需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。, P' ^* M3 i  H5 s- U7 Z$ q
  1. /*. H  i; N  i; H" r8 G
  2. *********************************************************************************************************
    " v, O' L; j* ]4 d
  3. *    函 数 名: AppTaskStart
    * m( b" R# W3 l4 T2 \' x
  4. *    功能说明: 启动任务,这里用作BSP驱动包处理。
    ; q) h) A9 i9 _
  5. *    形    参: 无
    ; M" E5 i4 j$ f
  6. *    返 回 值: 无6 ]  |- J; M; [8 E3 C% o9 m
  7. *   优 先 级: osPriorityHigh4  
    $ Q/ D2 Q3 d' _: }+ H
  8. *********************************************************************************************************
    : _3 a6 R0 }' g
  9. */
    ' R! x: _& W( m1 i+ H1 q
  10. void AppTaskStart(void *argument)" ^. E$ _+ a# ~+ e
  11. {
    7 r; V5 c( w  ^
  12.     const uint16_t usFrequency = 1; /* 延迟周期 */4 Q9 V4 i! W; V( K3 Z
  13.     uint32_t tick;6 U% l$ V, p: c
  14. % E3 B# B% ~* u/ V) G
  15.     /* 初始化外设 */' }* z, C5 [7 ^0 e  }
  16.     HAL_ResumeTick();) Y+ N+ r  r: w& z- i3 t6 U5 C
  17.     bsp_Init();
    / r* @) c7 I5 e2 R" H0 `- K
  18. / E  a2 I# r7 u9 M& J9 u% F9 H6 s8 M
  19.     /* 创建任务 */* h! w: \* z$ M& u: j
  20.     AppTaskCreate();
    . T1 V! v& m6 s+ w, L
  21. 1 B3 W6 Y4 R4 C- I
  22.     USBD_Initialize(0U);  /* 初始化USB设备 */
    # e1 i& l4 U" |2 r  r/ Y; y
  23.     USBD_Connect   (0U);  /* USB设备连接 */" V4 p+ n% N% Z
  24. + I) ?$ }% K. W$ y
  25.     /* 获取当前时间 */
    1 ]0 o" `. a1 \% g3 |( \+ E! t) ~# h
  26.     tick = osKernelGetTickCount(); # V4 `# @$ R" `5 ?% @# l" a
  27. # i" k' ^. c& k" E  Z
  28.     while(1)8 D% H- R5 e  A3 ~9 ^
  29.     {, e" d; J7 U, r$ {$ @# w
  30.         /* 需要周期性处理的程序,对应裸机工程调用的SysTick_ISR */+ c: ?0 i$ H8 C# D, R
  31.         bsp_ProPer1ms();& r* ^" Y& A/ k9 g  C
  32. , B! ~1 H# h  R, |; u/ L
  33.         /* 相对延迟 */
    ( w: u. \6 ]! p& m
  34.         tick += usFrequency;                          # A1 P1 {" G( y
  35.         osDelayUntil(tick);( W+ X/ `( k: f4 A
  36.     }
    ( ]3 x1 d3 H$ ^$ w5 s
  37. }
复制代码

+ U. h4 I( \; e8 a" F4.14 常见移植错误总结
; p7 `2 N8 T7 }/ {  编译后提示如下错误:- {- L: c+ `8 j- [2 _- p
error: 'Driver_USBD.h' file not found6 \2 P$ _) `1 Z+ ~% S
6 B6 T6 M, [6 S: d# A, \/ R. f* V
解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:& u; i( d  W; w! @+ c1 O! L

4 F" V: }( X% t1 F
d32a6c67848ac92bf4c29e0fbf5ef220.png

: `- s& p6 }! I" y- _' ]
. J8 d  V9 x* U# Q  提示如下错误. @6 O/ D, `8 o3 `
unknown type name 'HAL_StatusTypeDef'1 W$ F$ p* Y8 G  N/ p2 @1 b
3 ]) [( G2 \/ u% L) N
解决办法:本章4.8小节。
6 z5 S2 r6 y1 a& M1 I- M! n
. \" r. V! L. t1 |9 A4.15 使用的MicroUSB接口并注意跳线帽设置" e- O* z  ~- t- M+ L% V
本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下:5 X- e1 W" K6 t8 o: X

  ?) I; Q3 f1 F3 J
9c04c38f56dbbfd80201520f1e84223e.png

6 b; b/ {2 k" l4 \" q! s. k2 u
2 k& ]' O. w! O注意使用的是MicroUSB接口:
" y/ k4 Q" |' b; `1 {( K5 R9 }6 R8 W4 C; q+ K7 D" D
374a9b3f00b1d0e7cd589a59b3fe699a.png

# Y; {2 I" ?7 u. v2 ^7 y7 X% l1 V: g
注意板子左下角跳线帽的设置:
) D4 ?  I& E/ A: `; i/ ^9 t) ]! P/ K
f13c6739f82641308861da50db97c44a.png

' o/ D6 l' S  O! F5 \1 N0 Y' x& c
这里是用于选择CAN1 TX使用PB9或者PA12引脚,CAN1 RX使用PB8或者PA11引脚。大家这里可以什么都不接,或者CAN1 TX通过跳线帽短接PA12,CAN1 RX通过跳线帽短接PA11。切记不可以短接到PA12和PA11引脚上,USB要使用这两个引脚。
/ Z, `6 `, t8 E3 v
6 x: t9 i. k/ [) C5 A$ ^! t' @4.16 实验例程5 Y/ D6 ^0 j4 Y" {9 C1 S% ^. U
本章节配套了如下几个例子供大家移植参考:& C4 C, ~* U- k0 m8 C7 v( H
& E4 `: p- t  t* H6 W. a: `- ~1 w7 t
  V7-4001_RTX5 Kernal Template
  z! D$ r6 E2 f3 H5 w( b7 ~2 S/ m; R1 n; N' N% p. R0 {" S$ v) ?
RTX5内核模板。
* C' X" Y. j  i" \) ~8 n' d$ a3 l6 A( u6 Z+ S2 R
  V7-4002_RL-USB Template
: ]% B8 N" Y$ m1 E9 j' \8 r. ~! j
RL-USB工程内核模板,使用内部RAM模拟了一个U盘。6 A) u7 R3 p- p( O* k4 @8 K4 e4 r6 K. p
* d$ ^5 E4 n/ E9 B7 H- {7 W
MDK进入调试状态后,选择周期更新:
" c. g+ _9 `/ }& z8 h, B' l% v0 c9 K9 x  \* \' o- u4 j; Z
dca8f2e82304e411670c3194cde12230.png
" ]3 ]$ m# A% z* B% a
* P7 x* K+ k- @, _, w$ z& x
然后打开调试组件,注意和RTX4的调试组件位置不同:
. s9 o* K4 N1 o% a! u( F& P4 q
  v1 s1 H9 z) I3 O" r4 l- K
9daa841c2ebfbe6204c5bb95355e5707.png

1 O- o) b# ?0 o7 F  N" I# ^: k. Y7 _
/ z! g# \, l" o# U* y# ?: j然后点击MDK的全速运行,1 U, r, N) J2 p! d% y" j  U8 O

$ x: F: ~0 _/ D3 q- @
1d57a73648e5313c246a089fc2a85ac5.png

4 J5 }. i, R  Y+ H. n5 d4 v7 B$ R
至此,就可以动态实时查看RL-USB的运行状态:2 x$ Q4 Y1 ?- b9 x! k

# }" |1 e# G) O$ X% l& ]" U
1e9d6ebcc79d1df8a4302d0c846080e0.png
; _, r* B! r  x4 t

0 M$ b7 v& o& R8 x6 B  U4.17 总结

2 ?* f7 e: }& t! H* B2 @本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。
3 ]) P2 q. \. h$ U
3 _9 I. x# z8 c7 c  L4 Z8 H1 I* [" j$ Q" x4 K; i
( R; o; k; U  n% ^" N: f4 N7 m- I

8 k5 l2 f. _7 w' C7 B4 c
3 k3 \; g. J! S# E3 O# ]
收藏 评论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 手机版