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

如何基于STM32CubeIDE结合RT-Thread开发程序

[复制链接]
攻城狮Melo 发布时间:2023-4-6 23:21
一、RT-Thread系统; f2 k6 k) P7 W1 r' A' c
        随着物联网(IoT)市场的迅猛发展,嵌入式设备联网成为了一个刚需。物联网的核心和基础仍是互联网,但不同于互联网强调人与人的互联,物联网是在这样的基础上延伸和扩展出人与物、物与物之间的连接网络。嵌入式设备的联网会使得软件复杂性大幅增加,传统的嵌入式RTOS(实时操作系统)内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。
, N( \4 O# K8 ?$ W  f
% U' i  |5 t7 \$ z. w* v
        物联网操作系统主要分为两大类,一是由传统的嵌入式RTOS发展而来,典型代表有FreeRTOS、LiteOS、RT-Thread、Arm Mbed OS;二是由互联网公司的云平台延伸而来,基于传统操作系统进行“剪裁”和定制,典型代表有Ali OS Things、TencentOS tiny、Win10 IOT。/ ~- b; \3 t# H- [* u; D; b  B: @  X
4 r) Y! _1 U! Q" R2 I# R% b
        RT-Thread 是一款主要由中国开源社区主导开发的开源实时操作系统(v3.1.0以及以前版本遵循GPLv2+许可协议,v3.1.0以后版本遵循 Apache License 2.0 开源许可协议),具有完全的自主知识产权,其社区化,中立,开放等产品特性,在国内开源社区具有很强的应用基础。5 w0 K( F% y- V# \) ]+ d  G

4 b8 M" V6 P/ {8 w  O7 H$ ?
; z3 ?- |- I& _8 p1 Z  _% n
二、cubeIDE安装RT-Thread支持
( F$ o0 ~  ]8 x        【1】打开cubeIDE工具,点击help->Embeedded Software Packages Manager菜单,打开软件包管理界面,cubeIDE提供了离线及在线两种安装软件包的方式。1 Z* s. s( ~; v' {( c  x5 l! a5 m7 E* h9 o

0 A5 j9 T, G( v' Z        (1)选择From Url ...按键(在线安装);, _; y7 h! |% `& i

/ A; i# A1 p1 Y8 w        (2)打开用户自定义包管理界面,点击New按钮;
% O9 u+ i* q2 S; B8 p2 Y8 a" b$ t8 x
        (3)填写RT-Thread在线安装包的源地址
4 l  |6 @) o. }: T# K; x

. J, g; R) t% `* I9 _5 o) t        (4)点击Check检查源地址是否可行,OK的话输入框右侧会出现“√”,点击OK按钮确定。8 q: u  f( P' p5 e0 o+ Q

; @8 k, [8 d3 G2 V9 k8 J% \
a039442db8d94cf4bf1200eb37050337.png
6 p8 b% C9 c7 u! t; {
4 m# l, x4 l5 o" b* X, B1 n9 h1 Z) I: M        【2】 点击 OK 回到 User Defined Packs Manager 界面,再次点击 OK,CubeMX 自动连接服务器,获取包描述文件。回到 Manage embedded software packages 界面,就会发现 RT-Thread Nano 软件包列表,选择该软件包版本,点击 Install Now,如下图所示:, ?7 X) }* `4 ~& y& }$ |* M5 o
+ r3 u' R8 [% D& |) G
0f57fa5a9cd644be81ddeb634d9e3911.png
: ]# {9 y& P  K; o+ P% N$ Q$ |8 G- G0 U1 s
         【3】点击安装之后,弹出协议确认对话框,同意该协议,点击 Finish,如下图所示
- Y. Y2 V" E4 M/ |
) G4 B( Y9 d3 }8 w4 j' H2 m
fde6f13372c64da6baec466907d8421a.png
1 N/ b0 H# s# Q/ F
+ D3 V2 J3 u- I6 a1 ~         【4】等待安装完成,成功安装后,版本前面的小蓝色框变成填充的绿色,如下图所示:8 }# V  `( n/ {3 s
' V5 ?& Z- _, Z! ~! V6 _4 v
4620450a2e4c43ee9721f5729260b5a8.png
! p9 \% t  H$ T2 O+ `1 \3 i( P, z# }# K
         RT-Thread有多个版本,其他版本安装类似,安装好的版本前面对话框会填充为绿色,未安装版本是白色的勾选框。
% {' @/ n: m/ a: H# ~# e# S/ m- Z9 {/ `# @
        RT-Thread软件包安装完毕,退出 Manage embedded software packages 界面,进入cubeIDE主界面。
( [8 ^' Q3 @! b& P6 L  I5 s- c  i: b, h) U# {% g

, J. d" F% I. s6 N7 H5 u三、创建工程并添加RT-Thread支持4 k8 L1 Z7 @: S: P/ Z
        【1】点击文件->新建工程->STM32 Project,进入工程创建页面,在MCUMPU selecter页面,按芯片选择创建工程(本文stm32496VGTx),选择好匹配自己手中芯片型号后点击下一步。
2 _; ^( r: S& l: l. c
) S* G# L' [; m! `0 g2 t
d060872043424c279c215b02fc710985.png / z# u1 b' {0 {" \3 i6 q6 y

# q( K& X* F& t8 B         在工程设置窗口中,填入工程名称(及工程路径),完成工程创建。) C8 i5 s7 A% h6 H7 ~% c

+ C$ Z" K% m1 D$ U
0c035e73f1074f63aa28eb28d6f07204.png 3 R; T- C* e. T. J
/ x% N' `6 h1 u7 p3 k. M, W* f
         完成工程创建后,会直接进入cubeMx配置界面,若没有,请自行双击工程目录下的"*.ioc"文件进入。* G4 K) G  h$ _1 Q6 x  {
* {" ?2 m- ^4 O, b$ L7 j+ M0 |, z
       【2】 首先开启系统模式的串口功能及SysTick滴答定时器(该配置会出现告警,先故意为之,后续说明如何调整)支持! V) q: n, G7 |! R

6 M# a" W9 r5 O" s# C8 G2 n
8f89d3d4f6f24757b6065df6a4ec6500.png 5 o- k4 U3 e0 H* W
+ u$ y$ j% M; |" m* @  y
         开始RCC外部高速时钟,参数默认设置即可
% p  ^" }4 R* {9 B! v% `
  C" ~; [3 B3 I( T: v* l
ab86a6643cc041e296a38204cf78a15c.png
  A( w! {% P( C7 Y: U9 p1 t% }. ^
7 U' V( ^1 ?! T+ S. {( f/ g% d         本文采用常用的按键及闪灯程序来测试,STM32L496VGT3支持三个按键及三个LED灯,参照其芯片原理图及引脚说明列表,配置按键及LED灯的GPIO引脚。/ R3 k0 V/ k% W" ?$ U

6 J/ ~, i# t: P; i( j
c8c7854cda674634aaf57aa4fe6a0bc4.png $ H+ T0 f* a% r3 A  U9 o; Z
         现在芯片视图选择对于针脚的模式(GPIO_OUTPUT或GPIO_INPUT),然后去属性窗口配置其参数及命名。
$ F; Q$ [( H8 f( m/ G3 C  P* j3 H5 O0 a% L  g3 h5 O
bfb3ed12549445e18c3ad015a01bee5c.png
' N* O! P& Y- ~% M* ~
/ R1 U* f' ^, I3 Y! t) T         时钟设置,简单配置接口,STM32L496VGT3支持到80MHz,本文直接拉满。5 W5 P( d. i/ d" H' ]  e/ p
2 e2 T4 g0 b6 [" Y! N
db5f49981cf74107aa646627f2efbc1e.png . ]/ @2 W& u3 k7 [

: C. w8 m$ c, M" }3 c+ h
, P  g6 ^. K! A: _9 `
        【3】 点击 Softwares Packages->Select Components,进入组件配置界面,选择 RealThread, 然后根据需求选择 RT-Thread 组件,然后点击 OK 按钮,如下图所示:- F8 |1 o1 q0 c$ h+ S6 t

* X2 W8 B0 m6 @5 M/ Z
d5d9518528a345e3ab81ad29fca91a42.png
, ~0 |8 _2 m5 H; B  D' T) b8 r  X3 L3 k; K: ?
         RT-Thread软件包中包含 kernel, shell 和 device 三个部分,4 q4 z1 o4 E' C8 a$ u8 w
            1)仅选择 kernel 表示只使用 RT-Thread 内核,工程中会添加内核代码;) Q* y2 x0 W& S4 E8 A
            2)选择 kernel 与 shell 表示在使用 RT-Thread的基础上使用 FinSH Shell 组件,工程中会添加内核代码与 FinSH 组件的代码。
( \* c& [6 F, `4 R2 r1 D7 a) W: ?' {            3)选择 device 表示使用 rt-thread 的 device 框架,用户基于此框架编写外设驱动并注册后,就可以使用 device 统一接口操作外设。) S$ W5 O# P/ t0 d
9 s$ Z; v4 |+ J: u
        本文将 kernel, shell 和 device都选择,然后点击确定,回到Pinout&Configuration界面,将会新增一个“Software Packs”目录,点击进去,多了 RT-Thread软件包选项。" m) }6 |8 \3 H# m

# j( y  F2 @$ `( G4 c3 n5 c" k
5eeeb211a734487fb59dae0c138af05a.png
) X) r* P& T9 G8 A! Q4 w6 d, k3 w; U
         勾选kernel, shell 和 device选项,页面将会出现 RT-Thread参数配置页面,先按默认配置。. T( ~+ {2 g9 b. c8 R! F1 r6 ^
2 t& p, |1 r3 r! o
39d2e0921f394facb1cdbf61afe0bcb4.png 1 |! r+ z' l/ ~% g2 S4 S, O3 C
( C( S& M. @2 l- g! f
         RT-Thread 操作系统重定义 HardFault_Handler、PendSV_Handler、SysTick_Handler 中断函数,为了避免重复定义的问题,在生成工程之前,需要在中断配置中,代码生成的选项中,取消选择三个中断函数(对应注释选项是 Hard fault interrupt, Pendable request, Time base :System tick timer),最后点击生成代码,具体操作如下图 所示:% e3 o6 w9 r; \# O
7 h4 B0 d6 M0 H# R+ N$ |" t7 x' s& w
977a30ed7b2c42f5b9a736a4ad03f59e.png
& [  S$ h+ D* w) [8 ]# a+ g- j! M
        【4】 工程管理(Project Manager)配置页面保持默认配置,点击保存或生成代码按钮生成输出代码。) h( z0 l( q3 D. p  k5 w
. |! D! t4 A* O9 P3 f' P/ R# e( X
417b6c381b4d4db4b52b65b504fed882.png 7 s3 [, a8 w& X9 V& }

6 x; c; C0 ^5 [5 c" Y$ C8 @) Q, f         届时,会弹出告警信息,这是因为在stm32cubeMX配置FreeRTOS时,选择时钟源为SysTick会有提示警告。! O% p% J$ }. }, c. i4 a2 m

; q; q9 X$ l1 I1 u! U
47966aa52ec746e79e0c8af96daa9fbc.png
2 ^  R, Q* n+ g
1 p0 o! `- t% R. u$ d4 f! F, x

: q* ^! ~$ W; s1 K: ]         【5】SysTick以最低的中断优先级运行,因此,在执行此中断时,必须取消所有中断的屏蔽。虽然是告警信息,但为了安全起见,因此需要将SysTick替换为TIM比较好。回到cubeMx配置界面,选择TIM1为系统时钟,注意,选择了TIM1作为系统时钟后,TIM1被占用,变成灰色,不能在用作它途。  h) I) x5 z! Q" w' z# }
. x0 z9 m, m8 \0 ]& `) g
dd3bf9e77d424bd3976f3070dc906cf0.png . o( F9 P9 {9 {5 Q) ^( x
' C' i% G4 t* d6 X# Z% n9 N8 x1 ~
四、工程调整
2 ?$ Q4 a# T$ p5 w% T6 H        生成代码后,需要我们进行rt-thread调用,在main.c文件中添加rtthread.h:- K# [. q+ S! M0 H7 }
! U; V" @- N% S" B" u: l
cc5a462bbded4eb1b0877f42ad81b41a.png , P# p7 T. R! r& K4 g

; O. ~1 v4 s8 A' }0 E# o         在主循环中,添加如下代码,简单调用rt_thread_mdelay(100)函数验证rtthread是否生效:# [- p& E7 C: I9 d' a
  1.   /* USER CODE BEGIN WHILE */
    1 E" ]0 ?( z+ E7 p% s- V; [9 }& d
  2.   while (1)
    , {/ t4 X; k5 t9 o7 Z+ `
  3.   {$ U& c" ]2 e* e) w
  4.           HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
    9 v. Q9 y! D) M# B/ q7 _$ Y6 S+ Y
  5.           rt_thread_mdelay(100);
    - F3 q) q* U) q5 _% z
  6.           HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
    6 p* _' w9 W! }3 W- ?5 r9 h- Q" k9 p
  7.                     rt_thread_mdelay(100);
    * c4 h& K+ q2 I& |
  8.     /* USER CODE END WHILE */
复制代码
# A+ y8 ]! M* p; q
五、编译错误问题解决
$ k* x5 X2 t1 ]" v
        【1】修改启动文件startup_stm32l496vgtx.s的 bl main 改为 bl entry(图片中第97行),更改此处使芯片在进入main之前启动rt-thread。
# X. u& J- t9 y0 x
# ^" B3 j5 N, O( I/ ^9 j
7949c0487f4c477cb6aca78ac1bd1cb7.png
; I; o! H) L( I7 z! M/ S: m) ?  h/ S; g* \1 i
        【2】Properties --> C/C++ Build --> Settings --> Tool Settings --> MCU Setting中的Floating-point ABI改为Softwae,该选项可解决浮点相关的一个错误。
; U& A5 _; a8 L! G9 P# L
- I% f" J# R& w9 w% z- q
f8b0819b76df4f459354d091523b4d66.png % c8 K% A+ c3 V% p5 _- o3 E, K0 x" X
" w4 U7 M$ ^3 P8 U* W
0b41353313084616bce14a2a5f6e744a.png 3 Q/ b. G2 Y9 a1 _

( U* n& q  N8 s1 s        【3】 调整Properties --> C/C++ Build --> Settings --> Tool Settings --> MCU GCC Assembler --> Misellaneous添加flags:-Wa,-mimplicit-it=thumb1 _! s$ m! H6 {% ], B- Q2 u4 k3 ~
& N/ `2 ~8 w0 c( P) e3 q
da5167310b244e3db33f84c92f2cb74d.png # }3 Y8 M7 L# C0 n0 n5 z, m

) s9 U3 g+ d, [         【4】编译会出现usart找不到的报错,这是由于我们开启了console shell功能,因此需要配置串口支持。
1 }$ t( R& p$ c2 ]/ y
3 v5 n8 o# z" N6 k6 z! `
7500fca47773451fa36c33f0d75523f8.png
0 H9 q6 i- g, D8 Y5 f- g+ q
: C0 ]8 }% i! g) ]5 w! A7 D         在cubeMx中,开启串口功能
* V  J4 k  n1 N7 S1 e7 d: m% ?+ O/ ]$ o
5dd8a03059754aff82622d36976cc2a6.png
& a5 d9 G4 g; B" v1 p$ y
. _8 K0 H8 m2 d9 h- L' X- |
         按芯片原理图及引脚参数要求配置+ F) u  n. M( E9 W  {3 f: M* F7 d

2 b/ H0 H7 `( S& Z% h
59c6dc812b764bc787ea211d17e4d1df.png
' Y& U, m2 W7 H: n' p. K9 \2 _8 b$ O$ V; D% y! S$ a
         【5】生成新代码后,再次编译,此时可能会出现以下报错,也是rtthread的console shell有关:
& K, n- o7 L' ]4 ?9 r
( g6 A* @3 s  j& b# _
d106625bc5e4443380ccbfa9975cc30f.png 2 A: i2 P" w3 O
) M7 S4 |7 F6 c  m+ |3 M9 V$ D
         这从字面意思是需要去rtconfig.h把“#include "finsh_config.h"”注释取消。! P5 H* C; \1 o7 t) T
$ M' E' [4 C, \6 P
0924352513b14685a17794c4294df6d5.png
4 b7 t6 q( W9 x2 ~$ y, H/ r1 ^& @2 M+ f, t; l0 t
         【6】再次编译,下面这个错误问题应该是HAL库及RT-Thread支持版本跟进的问题
; L# D8 {4 H$ Y( P9 D( I( J6 ]) m9 j; j+ Z" @- k$ h

' a: Y! C  w: p7 }
1 F% @' k" n. \/ H+ Q( ^
         本文所使用的STM32L496VGTX和CubeIDE版本引用的HAL库的USART_TypeDef定义已经没有了“DR字段”: b* ?0 ~! h% l9 u6 ]6 v- p6 X5 h$ ~

% R* Q* m8 @. E5 G9 v2 _) \! F; s
df580eca68714696b702bdc06041d6c2.png $ C5 {. B% R* l5 x; k' U: [7 @
: E8 ~" c1 e* a) K8 `+ z: N6 c
         该错误点的函数我从字面意思理解,暂时将其调整为如下,调整后编译通过:, L1 Q# x& O/ J9 ^/ D( M- |& y

% Q/ [% q# \& U
8f01f1c36e7a48dd8a10011c9d386002.png ; d* b2 W, G% M
, f: T% `+ O* U
" T+ U9 z2 h' X6 G8 \( I% O7 f0 |; ]
六、下载及测试
  v2 Z6 H4 l: o" O# N3 J7 j# K        【1】设置CubeIDE对该项目的下载支持,右键项目,打开项目属性,选择程序编译输出选项。0 y! |2 ?. u5 M% G2 R

8 v) ~! J/ G7 y0 x5 e7 o
e814a199e52e42bd9ccb36816cca68c3.png 3 U* l  o- |( }7 Z  o, m' S& x) O

* H* ?8 y  _0 [% @7 w" K         【2】配置运行下载,点击运行按钮下拉列表选择运行配置,进入运行配置界面,配置程序运行加载信息如下图示例。
3 j% z1 k' o6 q' i4 p  u# f1 F$ t+ n9 v( D
eb78210453e249f59d18b61c85b59f8e.png 2 R! W$ Q/ E9 L# }: l

  |  Y5 ^2 _4 Q" B# M- a         【3】点击运行,程序顺利下载到STM32L496VGTX板上,闪灯程序正常运作。* e7 o( l4 J+ J9 b
& z4 T% j. {! U5 r$ A
53ebf31231e2421da343c636ef50ba0b.png
$ x; p4 n1 t% }% i1 O

; u* A) j( `6 u9 b- ?$ L' R         程序效果:
/ a/ y$ Z/ |: @0 j% l* M8 i& c% t' N5 U
e27f9e16db7043fb97acff92e15f3d04.png 6 G9 V7 o! F: u) |
( i/ |1 h6 Y/ K, s
————————————————% K$ m! |( I6 T* {2 K
版权声明:py_free-物联智能% X; `. R: k" v. X7 {
如有侵权请联系删除, a) u8 C$ {) u- `4 f. |
6 ?. A. g6 t3 ^. |9 }
: _& W" r* k2 M' I# E& A

  g0 x5 G& P5 g! v7 {; N
9658cfff911241b39410301639da7c7f.png
赞 收藏 评论1 发布时间:2023-4-6 23:21

举报

1个回答
lugl 回答时间:2023-4-7 09:36:51

我下macos下面做了很多次,还是放弃了,错误太多了,处理起来太麻烦了。

所属标签

相似技术帖

官网相关资源

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