STMCU小助手
发布时间:2021-12-30 14:01
|
4.1 初学者重要提示 学习RL-USB移植前,务必保证已经熟练掌握了RTX5内核的移植 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整体说明 移植之前,有必要对移植过程有个整体的认识: 0 f2 a0 g) c7 a" V 第1步,准备一个RTX5工程模板。 第2步,移植RL-USB。 移植RL-USB是采用MDK的RTE环境直接添加。当前H7芯片使用RTX5强制运行STM32CubeMX,所以需要大家提前安装好STM32CubeMX V6.0或者以上版本。 第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 4.3 了解RL-USB模板框架设计 移植RL-USB前,我们优先了解下移植好的RL-USB内核模板,方面大家后面移植:2 d* T; F( x5 ]7 d6 {+ `. s; |' U 7 V" ?3 X! p& C! ?) g4 T: j
6 T/ ~/ g0 w+ V- D- B' @$ a$ D* `/ ? 框图如下:7 `2 ] D/ {5 m& q+ t( V; C
4.4 第1步,安装指定的MDK软件包 移植新版RL-USB需要大家下载当前最新的MDK软件包版本(如果有最新版,推荐大家用最新版):2 d, B! h7 ]* h/ k. o" n8 ? % C6 o! J: n1 S CMSIS 软件包使用当前最新的:V5.7.0 STM32H7使用当前最新的:V2.6.0 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 不管以后MDK的软件包版本如何升级,当前的软件包版本和以后的新版是可以同时安装的,也就是说可以安装多个不同版本,在这里可以选择指定版本:
! 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
% U+ w% I# W+ W' t; s9 W# z$ ]) A3 ] 4.6 第3步,添加RL-USB并配置 看这部分内容前,务必保证已经熟练掌握了RTX5教程移植章节的添加方法。6 N0 U9 e+ W5 i. B 4.6.1 RL-USB相关文件和驱动1 H4 s' @/ X1 m2 A! Q0 Q CMSIS-Driver分组中添加USB Device驱动: 7 n$ t( B& h+ p
添加USB驱动:' l$ {# B( t$ v* p
7 d' I: v2 d. U9 Q- X. S" R, ` 添加RL-USB并配置:
我们需要的都已经添加好,效果如下:. p( ^$ L$ g8 R) q1 _) n- @. v! L ' p, z: P! w0 m' N, A0 T3 G
3 e- p+ v9 `6 F/ r 红色方框里面驱动要隔离出来,隔离后的效果如下(隔离方法看RTX5教程移植章节): # m: [9 a; ^( g4 k/ Y
4.6.2 重新添加被隔离的CMSIS-Driver文件 将我们提供的程序模板中制作好的RL-ARM文件夹复制粘贴到大家准备好的工程模板中。
* L: G7 M1 M0 R7 k2 P RL-ARM文件夹中有如下七个文件夹,其中只有RL-USB文件夹里面有文件' F. `4 Q5 J& [$ ?1 F. ` ' t1 i9 W! \ `# G3 _4 Y
) F( Z# D2 E+ J) j) @7 S2 h" y. ^ 内容如下,这些文件是来自MDK安装目录: 5 B) G9 A6 A" z9 J2 ]# X6 Q
然后将用到的两个文件添加进来: ( }% ]6 m* T; g1 H6 b
5 H0 P# D F' w 4.6.3 重新添加被隔离的HAL库USB文件 文件stm32h7xx_hal_pcd.c,stm32h7xx_hal_pcd_ex.c和stm32h7xx_ll_usb.c被隔离出来了,我们单独在分组HAL_Driver里面添加。除了这三个文件,同时将两个pwr文件也添加进来: u9 P$ E) L; c7 P: E. P
. o* e' ?+ x# i1 Y- |; G 4.6.4 RL-USB配置 添加完毕RL-USB所需的文件后,就是配置RL-USB,具体每个配置所代表的含义,会在后面章节专为大家讲解。 + G- ~" [: r/ ?& o. r# i6 h( C USBD_Config_0.c文件配置:9 B8 y' |/ m* s. q8 x6 h, o
/ B/ r& b) s# s- q, O, x& |$ Q7 G 注意这个文件里面还有一个RL-USB内核线程的优先级配置,当前是将其配置为: . C) ~5 t. W' \2 g osPriorityAboveNormal: - C) S& ?; M7 o+ i' H/ p1 @3 b2 s, T
8 e1 a. U" f) f% t3 n) d USBD_Config_MSC_0.h文件的配置如下: " C% X8 S2 q( E! g$ S
这个文件里面有一个USB MSC任务的优先级配置,当前是将其配置为:osPriorityAboveNormal。 3 F" X+ b1 q* ^6 f
! {+ 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
弹出的STM32CubeMX配置如下:; y! Z: [* p) ?# ]# }
修改位置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
然后弹出如下对话框,点击Close即可,然后关闭STM32CubeMX。 |3 U+ R: z9 P7 D
重新回到MDK,会有一个对话框,点击“是”即可:5 t8 i- D1 G3 [& n% }3 W
配置后,就可以看到stm32h7xx_hal_msp.c文件里面对USB引脚做了配置。
* p6 c' m0 Y+ A* N 4.8 第5步,修改文件USBD_STM32H7xx.C3 X/ t9 g9 N1 N6 G 这个文件开头的头文件顺序要修改,否则编译会出错,原始的顺序如下: 6 R" v0 M- k0 C$ `, c7 E
修改后的顺序如下:) P& L8 b5 c7 w' F* j2 H, @. i6 { 1 P b+ o8 O- j* v4 y
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
9 X* W4 j, r5 X% K& m 4.10 第7步,修改文件includes 添加USB头文件:#include "rl_usb.h"+ N4 ]( T& @! \' A) e5 p0 @2 e #ifndef __INCLUDES_H__$ N* \/ X2 C4 j5 f2 S4 L #define __INCLUDES_H__, l! d1 q _- B- q2 G /* ********************************************************************************************************* N, v2 d5 b9 [0 Z& I0 a0 E9 W8 C' S * 标准库/ z$ G& @( B7 X# x8 V* `+ l ********************************************************************************************************* */1 W+ ^ d- L) Z #include <stdarg.h>1 @5 f- h+ x% e. U #include <stdio.h> #include <stdlib.h>: g( l9 d3 U) ] A7 j, i #include <math.h>! W' k5 h, w; q/ U! ] /* *********************************************************************************************************6 \" I- ^: C! Z2 i7 C/ H7 O * 其它库 ********************************************************************************************************* */! m- R# M1 V( T' E$ f, g' A" t , \* y1 l% M4 Q" C /* ********************************************************************************************************* * OS和系统库 *********************************************************************************************************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 /* ********************************************************************************************************* * 宏定义, `$ r, N) W T. ~) ^ *********************************************************************************************************; h6 J/ P5 W, y! r ^% c */ 4 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 ********************************************************************************************************* */ #include "bsp.h" ; ^9 V M2 w+ N( c /* ********************************************************************************************************* * 变量和函数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); #define bsp_ProPer1ms SysTick_ISR . S* b7 p. }, }4 t #endif 3 t! y! M3 O' A3 m) ? /***************************** 安富莱电子 www.armfly.com (END OF FILE) *********************************/ 4.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
$ J. k: w) u* j' J 4.12 第9步,添加头文件路径% S+ P7 c, u8 |8 O5 | 添加头文件路径: 9 t1 K. M/ K% ]" V! F
4.13 第10步,创建应用任务(重要,注意启动任务) 应用程序比较简单,大家可以直接复制本章教程配置例子的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闪烁。 AppTaskMsgPro任务 : 消息处理,暂未使用。 2 ^- [# ]! T) U' D- Y AppTaskStart任务 : 启动任务,也是最高优先级任务,这里实现按键扫描。. w4 `/ n! w1 _/ T P" |# C5 ^+ j ; z7 R% R+ R+ f0 j9 p# V4 V osRtxTimerThread任务: 定时器任务,暂未使用。 ) _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 @
任务创建: Q% m, h9 |6 j/ i2 s
这里我们重点看下启动任务,主要做了五个工作: % @; f( \- O! L, P1 I+ b1 N8 u) \ 外设初始化bsp_Init。 任务创建AppTaskCreate。 初始化USB并连接电脑。 需要周期性处理的程序bsp_ProPer1ms,对应裸机工程调用的SysTick_ISR。这个的实现非常重要,这样之前裸机里面使用的API,就可以直接在RTX5里面直接调用。
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 解决办法是将新版 CMSIS 软件包里面 Driver 文件夹全部复制到自己所创建工程里面的 CMSIS文件夹下,并添加路径:1 c& d( z3 n7 U3 }5 I
# D. y. k; i5 O6 M+ z% v+ y 提示如下错误- k# D9 ~1 L. O0 P) Z unknown type name 'HAL_StatusTypeDef' 解决办法:本章4.8小节。 4.15 使用的MicroUSB接口并注意跳线帽设置 本周教程移植的例子使用内部RAM模拟了一个U盘,效果如下: _* Q' ^, i, ] ' k5 S1 [( [+ ?8 x
注意使用的是MicroUSB接口:' z. L/ s4 i! N6 S2 [/ m- \ . Y$ W6 N' c- Z( ^
注意板子左下角跳线帽的设置:
7 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 RTX5内核模板。 , 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盘。 MDK进入调试状态后,选择周期更新:0 l1 Y, _. | B9 ]3 \ - }2 v' Z/ f; C0 z% {/ |$ \# F
然后打开调试组件,注意和RTX4的调试组件位置不同: $ h+ q8 J* X7 k8 z1 y6 ^
" Q. T ~: `; ? Q# ? O" I 然后点击MDK的全速运行,
1 { J8 G% Q; A$ K% x+ _ 至此,就可以动态实时查看RL-USB的运行状态: # _# U2 P8 z+ L& P
4.17 总结! `! q/ I9 M- R# L- c& }9 {/ [ 本章节为大家讲解了RL-USB 在MDK AC5上的移植方法,移植涉及到的知识点比较多,初学的话,建议实际动手操作一遍。( r: Q& b3 l" U5 [7 h & i( e, y$ F) s }4 {8 r5 L |
【 逢7发帖赢大礼】1、利用CubeMX生成正点原子H7R7开发板的STM32CubeIDE工程
【STM32H735G-DK测评】ADC3+TIMER1+DMA 采样模拟信号
【STM32H735DK测评】Ethernet+lwip DHCP获取IP地址
STM32H743基于CubeMx5.0配置手册
【STM32H735G-DK测评】lvgl移植
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
【福利三:逢7发帖赢大礼】使用MPU6050模块、img_dsc、img_btn机制实现一些简单有趣的动画效果
【福利三:逢7发帖赢大礼】使用arc弧形拉条控件控制PWM舵机及使用SPI3接口操作NRF24L01模块进行无线通信
【福利三:逢7发帖赢大礼】调试nucleo-WBA65RI工程测试样板的一些心得
【福利三:逢7发帖赢大礼】lv_timer和BME680实现温度、湿度、气压数据读取
微信公众号
手机版
好好学习