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

【经验分享】STM32CubeIDE使用技巧(FreeRTOS点亮一盏灯)

[复制链接]
STMCU小助手 发布时间:2022-5-5 15:52
1 概述
& h* J& Z( y  A1.1 资源概述
- W& f& f; d" g9 g1 d+ N
开发板:STM32F103C8T6最小系统板
# |! a/ k0 _6 m" s开发环境:Ubuntu+STM32CubeIDE
8 b! T: {+ D+ |8 ^2 U主控芯片型号:STM32F103C8T6- p" i# J. u' t8 i! }; f5 Z' I
左侧为STLINK烧录器(ST的Nucleo板),右侧为目标板
: S7 E* }4 J* @" [2 b0 G! u/ Y" n3 y6 z% P9 i. |
2020080809091135.jpg
3 a$ Y! x. E! J2 A0 v& I
1 x5 p% D5 C9 E" z/ h1.2 芯片简介
) v+ D$ k8 s5 F9 k4 m$ r* v4 H1 C1 _C8T6只有64K ROM和20K Ram,比较小,但是可以实现FreeRtos的移植。选择用IDE工具比较香,不用自己写makefile文件,对于菜鸟来说还是实用很多。通过CubeIDE可以实现程序生成编译下载调试等一条龙工作。
" }; N4 n( ~( V! [0 Z3 G) ?, j' l& e6 `: K/ v; b. a) j
2 软件实现,使用STM32CubeIDE
( b% a/ [- U' G! _: d; F' }" @2.1 STM32CubeIDE 生成代码
9 l" C' V# r1 U' t, x+ {6 O
在Ubuntu下安装STM32CubeIDE,STM32CubeIDE内嵌的程序编辑器其实是Eclipse。免费的无需破解,更佳的是ST 提供了windows,linux版本以及MACOS版本,也就是可以在不同平台无缝切换。打开程序,使用内置的CubeMx配置工具配置芯片,勾选FreeRTOS,由于只有一个任务,因此保持默认配置即可。
- l4 }. J; g+ S/ y4 x7 }5 ^0 K $~1ZDY57}RQ_RLEF9Z1KF~7.png + l) x. x0 ~/ M" e" Q8 y# @# ~
; _( I+ t5 k) r0 }  W
FreeRTOS配置
, U8 ?; N% P9 H3 O2 P, h' M) F3 X  i
5(9@`01)5_KBOQ9)QRBS{)W.png
5 f5 U8 K* n* `, a7 d2 T# c5 k1 W
2.2.1 修改Task代码
6 I) V2 N( y* X9 @在生成的Task里边增加LED的相关代码
, ^8 E2 u1 E) f. w+ V; b
2 M4 Y' D- t3 h
  1. void StartDefaultTask(void const * argument)
    ; o6 s4 H& ?. F' H! [7 H5 N
  2. {5 I) d- c" l( q3 C
  3.     for(;;)3 w; Q( H/ z) |+ a
  4.   {& ~* p* R) b- x4 r; y$ W8 r' X5 V
  5.           HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0灯
    - M4 e# d* D( i3 s- M9 E* X3 p, H
  6.           osDelay(300);% I% |8 I; C0 }& f+ p+ B8 j
  7.   }/ `" F5 W' U* m" P7 d
  8. }
复制代码
$ I, h& h) J4 h
main函数如下
5 N: @3 [2 |; y6 T/ c8 s
( k, f, K0 o6 |& M4 w5 M7 [, z" S
  1. int main(void)
    ! M* D/ K, U$ R, ~- U; A
  2. {
    , D6 _/ f2 Q3 B
  3.   HAL_Init();7 ^: y, N$ G7 M
  4.   SystemClock_Config();
    # S# h2 Z! u. ^: B
  5.   MX_GPIO_Init();
    / V) h7 `# X- ^( f- E
  6.   osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);//默认一个任务1 x) P) O1 N7 |5 f' I0 |
  7.   defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);//创建任务7 r0 D; C) I, r9 a- n* A& q
  8.   osKernelStart();//启动任务3 b' U& n- X6 J2 W9 w7 V
  9.   while(1) {}
    7 g+ @7 W3 N& J3 {
  10. }
复制代码
  K. }% Q8 ?/ ]. }% u: N0 _
2.2.2 STM32CubeIDE自动补全

/ `7 I2 J8 {+ w6 T' e, M) c& g5 Y在STM32CubeIDE 中可以使用**ALT+/**可以使用自动补全功能,不是自动的;$ |6 a! T' d) i0 `
6 o. [% g$ k5 E7 y4 t
9{Q}VF1O]_66HXE{)W%ZQCN.png
- s- h# T( e$ ~6 H
9 M5 ?3 x) \+ O- e' h1 J. F( q( m2.2.3 STM32CubeIDE使用VIM编辑器
1 R% X% G* r2 F% {$ E5 f
vim编辑器真的非常好用,简直爱不释手。谁用谁知道。几乎所有主流的IDE 都支持VIM ,在IDE 中下载VIM 编辑器。
( s) c/ l# T( B8 d( ]/ t8 g/ l- \. I  S5 I7 M- I4 Q: C6 T
0LZ[BGTRIO~ZQB`69PM)W(V.png
  |9 G3 N" }+ _6 d' t3 C* z: u$ ~0 [, ?
设置VIM 编辑器,按照下述设置快捷键,可以使用shift+ctrl+v,激活或者关闭vim。3 D4 b, `% ^% y. g( q$ J  _1 M; E
) A, K( v/ T/ V
OWD%K5GM[NV6V1(JZF763SQ.png
$ U, V7 [' c  I* `4 ]/ A) V" |  k
关闭Vim状态,disabled
8 a2 D5 I. a2 Q7 _# ?# I$ i7 ~
1 ]# @! ?& {. {( L' e: l: s& f B5FAB5G4JJS_9@S`Z5}A8(T.png
* s0 @- g4 r. R/ m/ s& @7 _
0 R" @6 y% o+ Q! F开启vim模式,下述是Normal模式
2 F  {  W. P! \, d" Z* O6 E9 \0 b0 I" X% @. }2 K2 @

4 K) M# R. ?7 h1 A/ L, j! t; @
2.3 编译下载程序/ U4 d. ^7 Q4 ]: W( M. k
编译程序代码,结果如下:( V4 j8 X! I" x( q+ h
3 x6 i& T% N) p) N' L7 L3 H
20200808091759623.png 8 {9 W3 F6 s1 E& O& s
5 U, u4 e7 i7 l3 b. k6 R
我们使用CubeProgrammer软件进行下载。在Ubuntu里边下载程序和擦出芯片比Windows平台快非常多,一瞬间就完成了。
* i3 G/ a* _& e' u1 P# W# G( Y% u4 g" E. X
TDSXRGCNEJIOQI3RI%2OIL6.png $ T5 Y7 a; @7 i/ b) I# i4 q( _
9 b& ]& ]% ]7 o. l
下载完成后,将目标版复位或者重新上电,程序可以正常运行,在移植FreeRTOS时,可能会出现RAM不够的情况,编译报错,这里适当调整下FreeRTOSConfig.h的HEAP_SIZE即可,这个如果调整得太小,会导致部分Task不能正常运行,且编译器不会报错。另外还可以调整单个任务的STACK SIZE,两者结合进行调整。
2 N/ P( m7 Y* f6 i; Q6 Q- l2 O# `  j' m+ S
  1. #define configTOTAL_HEAP_SIZE                    ((size_t)3072)
复制代码

& M+ y; G( \6 N2 K2.4 下载问题解决
( M; [) M, l( _4 ]/ J  T/ w4 l2.4.1 问题1解决
' C: [0 n; B8 ?
遇到了几个问题,第一个问题,提示下列错误,ST-Link Server is required to launch the debug session+ E0 ~! R9 X( u# A# g/ k# a+ B
# i/ t/ z' z* P! W: P* |' u
1YSA}N5GEG703`MKUOT65FC.png
  d# z: X: o$ @6 {! H2 u
0 {6 A; {& I. U  d* y9 J! g# k解决办法,进入官网下载软件安装包,下载链接STLINK Server- M( X: n# U0 S* B( y& A
/ c2 v/ A5 ?8 a
20210605000138412.png
- |  v, v+ z9 E7 p" i' x/ Q( X# _. ?  C$ P  E
下载完成后解压,使用.deb的安装文件,切记不能用双击打开安装的方式,因为安装过程有协议需要输入y同意,如果双击安装会导致安装卡死。卡死后会比较麻烦,需要杀进程,删掉锁等操作+ o& A$ I8 U) ~" H9 A! h, f7 R

2 _; z4 j3 C3 ]
  1. sudo dpkg -i st-stlink-server-2.0.2-1-linux-amd64.deb
复制代码

+ `  X  n5 q. l1 R, V/ j, V2.4.2 问题2解决
' h6 T4 U# H9 F# l! [+ b8 z  Y按装完成后烧录报另外一个错误,Could not determine GDB version using command:arm-none-eabi-gdb -version! ]8 r/ h4 O7 X* n: g  h5 f
TK4DZ~CE3IC17KQSAI]V}U4.png ) z9 M4 C3 A) h4 I8 O& S$ a

0 Z4 B# r: F5 A$ [2 `$ _( B: q解决方案就是安装另外一个软件包
  1. sudo apt install libncurses5
复制代码
9 i) i: a& r/ o
安装完成后就可以正常下载程序了(点击RUN 按钮),单板运行正常了。下载成功的调试信息如下9 w0 Q' W: L7 O) H, z7 h

. ~+ C/ \* o- _  O# R  n
  1. STMicroelectronics ST-LINK GDB server. Version 5.8.0
    4 Y+ k* C6 C# K$ ?( j6 u' k1 U8 E, H
  2. Copyright (c) 2020, STMicroelectronics. All rights reserved.% t* \8 v, p8 j) h, h; Z

  3. - y: s6 C! `: d6 C( y8 f
  4. Starting server with the following options:
    # ?$ X. u- V3 V! q& {% y
  5.         Persistent Mode            : Disabled: n3 _2 B/ H0 d# P. a: j* I
  6.         Logging Level              : 1
    4 I. O5 H# q# Z; y) W2 D
  7.         Listen Port Number         : 61234
    9 l- D2 E4 Y; ~) N  n
  8.         Status Refresh Delay       : 15s
    # w+ b) q' i" P; ~: b1 E
  9.         Verbose Mode               : Disabled  i. n2 {0 b# {) v5 R8 X
  10.         SWD Debug                  : Enabled  z# i" T; i7 [9 C' |/ m

  11. 6 Y, ?$ }& J5 O+ R7 i/ B
  12. Waiting for debugger connection...7 `9 s. x! W0 [  |. e8 C4 t' K& w
  13. Debugger connected
    ! F% e- ^8 \2 H* G
  14.       -------------------------------------------------------------------. j" `1 K9 {3 l' g5 u4 j
  15.                         STM32CubeProgrammer v2.7.0-RC1                  0 g* G3 |7 J0 Q: L' d  z- J
  16.       -------------------------------------------------------------------
    3 e* }  ?" A# a% b' U
  17. : Y! _3 ^* D/ Y$ B/ Q/ s
  18. ST-LINK SN  : 066FFF343530484D43184×××1 v% T; G6 w! M; J# h/ _0 `
  19. ST-LINK FW  : V2J37M278 k- ^- t/ C- u; m$ G& k
  20. Board       : NUCLEO-F103RB9 z. C* p. A5 E
  21. Voltage     : 3.24V
    ; H( v7 `' Z9 I% ?
  22. SWD freq    : 4000 KHz
    6 `+ O( m" w3 X9 [# t; i) z& y
  23. Connect mode: Under Reset
    6 q! [4 n8 ~$ g
  24. Reset mode  : Hardware reset
    ) r7 l8 j4 J( h* r
  25. Device ID   : 0x410% n8 V/ h* f; L2 E
  26. Revision ID : Rev X
    : [$ `# D' Q, K. }8 W
  27. Device name : STM32F101/F102/F103 Medium-density
    $ f  C( L0 }. P3 T7 m& u% G- q
  28. Flash size  : 128 KBytes
    / F' [( s  B! ?5 q3 b- i
  29. Device type : MCU- O* n+ p$ M8 h. V: n. \
  30. Device CPU  : Cortex-M3
    3 [' @4 `0 R  T' h2 v

  31. " F$ `( Z9 k7 `0 j
  32. Memory Programming ...) W8 y2 g$ S+ R5 f& m* K9 b: ]( C
  33. Opening and parsing file: ST-LINK_GDB_server_L6NIAP.srec" R2 t6 r" {4 `$ M) i2 _" y
  34.   File          : ST-LINK_GDB_server_L6NIAP.srec( u  s6 a& v2 y+ L! w
  35.   Size          : 5696 Bytes* f+ S3 I' }, p$ G
  36.   Address       : 0x08000000 - Q$ P' e; i$ P. r% K$ o- [) s
  37. : G# f; F. F* W
  38. Erasing memory corresponding to segment 0:
    2 T' V9 }6 b: ^% n7 [2 b
  39. Erasing internal memory sectors [0 5]
    . q0 N: F1 }" [' Y3 `
  40. Download in Progress:
    $ _7 G9 R4 Z3 o- r1 X
  41. $ V- o% F- Y' Q7 w+ R
  42. File download complete
    , [# \. K) H7 ?4 c
  43. Time elapsed during download operation: 00:00:00.448
    ( R5 o& P6 {% a) k4 ~6 s2 E
  44. 6 S9 y, L5 Q  ?
  45. Verifying ...& @2 g- r% r; H% l9 x' |

  46. 5 u" ?' Y* }, l# w' J! K! a
  47. Download verified successfully 9 E4 V, Z6 W  z
  48. Debugger connection lost.
    + j( h% t4 i8 }+ n/ q# H; x/ ]
  49. Shutting down...
复制代码

# E' h5 p% \6 j2 l. |很奇怪为啥这个软件不对这些进行集成,导致折腾了比较久的时间才搞定
( D1 }7 @. C9 c  U6 [+ P/ }/ S  {' Z( J9 ~# l2 l! x  ~. r
2.4.3 问题3解决
4 V) w; O, S; T+ C- d" \7 E6 j+ K下载程序,点击编译器的Run下载到目标板,报错Fail to start GDB server,这是由于目标版的芯片是山寨芯片(最小系统板10块钱淘宝货),ID不对。使用正版芯片不会有此问题。已经使用ST官方的Nuleo板验证。
; a& U# H, Z4 l9 j9 ]7 P. K5 W; e# D3 n: q8 h; J! n
0I{N]T08(~{ZLC8%PO}E.png
4 W; b) s  `, G) b0 E" E$ f' M) L% C% F0 U( G' \
2.5 调试5 r. |* [, C  Q& o1 y) l; M6 \1 _
可以像Keil一样调试,单步运行和设置断点等
3 m3 n. T/ C- g% V& Y  w( Z4 A+ E5 k/ B9 ^; N3 M% z' A
`%_LJJF6II_~424H}~E)@G2.png
( A8 u" g# M' U: d+ i7 ]0 U, N7 I, p% m) q+ z- Q8 D6 H
在断点列表中选中需要跳转的断点,然后右键goto line( [* C6 P' Z% d* `: Z! B# t) v

/ X7 B) J! G# J0 y- j* i9 g2 U$ A  z 20210605083715690.png
) F- c, D8 B* {! ~
3 M. l, c9 c7 E0 m/ `$ O& l2.6 cubeIDE工程无法导入无法编译问题解决7 n  P, a8 a4 B+ T' b  \
下载的工程,不要放置在工作目录下,否则工程将无法导入,仅支持工程的创建。创建完成后的工程,如果在工作目录下移动位置,也会导致工程无法导入。正确的做法是做一份拷贝,放到非工作目录区。如下是我们的工作目录,已经实验多次,克隆下来的工程,在工作目录下无法识别为工程,在其它目录可以正常导入和编译。; Z2 g5 d5 |7 t& z% R
0 Z1 p- v6 I* S/ X2 g" W
VCF}BGX1AGHWF[3GO@5BNK7.png
& N8 M5 E: B6 J6 ?) O6 E( a" K) {- ?) {; c) w) k6 k7 w
工程拷贝时,需要对整个大文件夹进行拷贝,因为工程目录下有几个工程隐藏文件,没有这几个文件,会导致导入工程后,built project时灰色的,不可编译,而且工程的右键菜单少很多选项,这些文件包含了工程的相关设置等,如果误删除这些文件,可以新建一个空的工程,然后把core和drivers的代码拷贝进去即可。就能重新编译使用了。通过ioc文件创建工程是一个比较快捷的办法。: v: h9 t0 e! {; k, E0 Y1 |6 c
, F6 f5 s% T& t; L# X+ L' O4 p; _
J_8JGYCT1JD`S)3$M1J[66W.png
& N* `6 P( p* w  a" {  s! q0 M
& N' l7 r$ w& m" a" S6 b; ~3 使用STM32CubeIDE在电脑端输出hello world.
: ^( l0 E7 q% l既然软件集成的是 eclipse,那么是否可以编译标准的c呢,这引起了我极大的好奇,经过一番摸索,发现答案是肯定的。
3 x: j& |# K2 k7 l( u% S& @  Y" K: D' ^8 \' \: x2 ~/ y
3.1建立工程
+ r" R% l1 U5 w2 p, J选择file->new->c/c++ project,
& U9 M7 K0 _; o6 U6 t1 E7 h' _
, }, L- x; b9 d) e6 {3 z# f ZCOVH[GU3}(_@@Z22CK}T4E.png
" q/ v) s2 d4 E9 a* Q4 D. B
, T" J+ ~6 ~2 w1 b; \. b. e选择第三个,选第一个也是可以的,弹出的窗口中输入工程名。
0 `0 N9 Y8 C- c  K% |  Y
; b; }# ^; y  s* F' J M%Q8M([MW4MG_U)JZBX8C.png ' Q  Z# _; V: R
9 D9 A! q+ y* s
3.2 写入代码
( z- g3 Z6 W# u; L5 [写入一个两数求和的代码,看下是否可以进行交互。
4 ^# ^1 O# J4 I0 c. ~; v
5 \/ M8 I  w( t )0%FG7BY5{[U[KIL7WG0M[N.png
! h# Y7 D! p7 n" Z
/ O4 Y: r: g& k& F4 [- F3.3 工程编译
  d7 V# D% u: X2 R5 t选中工程,右键built project,0个错误0个警告,说明编译通过( L! D1 J7 _" F, q& q3 Q: Y$ Y

% S$ X% @7 D; e1 ] 20210604220901897.png   a) |; O1 O4 h8 \
* p& j" C/ O$ H9 N
3.4 编译后运行& ^! N. e& N5 X( @
选中工程,右键,run as-> local C/C++ applications,控制台有输出,且可以输入,结果与程序完全一致。/ p  ~1 b3 S" M+ }) K
; K% s! w0 b8 U2 W
20210604221128503.png 8 k! m9 t- t2 w/ y

9 X( i0 H; ^( a& @输入字符不是数字,而是字母的错误时,可以提示错误信息,和程序一致。
7 Y5 h4 y+ O( p& v% u3 G. }7 Y6 l
6 c* k/ Y+ E* r( e, c 2021060422243111.png : Q+ \$ k' ~4 H) i/ X

( g& ]- v7 Y, _4 a3 }3.5注意事项
- v4 X  V$ v: Q; r7 c& E初次使用时,可能会报错没有g++或者make,使用命令行安装这两个软件即可
! z: Y) R  A/ v/ `& {! Z! c5 B& A! W
  1. sudo apt install g++
    & I0 U/ s2 L- g
  2. sudo apt install make
复制代码

$ g! Z* M: g8 o3.6 windows中运行
% @1 n# _# B, l, p6 M: gSTM32CubeIDE的windows版本软件中,也可以编译运行,编译生成.exe文件,但是输出的是乱码,run as的设置和linux下的版本相同,更改编码方式乃无法解决,即使输出的是全英文。
1 q/ V( x7 K, [' Z- _- H& D9 f( f" c; @) ^8 A1 `
) b# L+ ?5 `; {  b$ E8 e/ ~5 {

  b2 T) f9 T4 p( @( u) n1 |
赞 收藏 评论0 发布时间:2022-5-5 15:52

举报

0个回答

所属标签

相似技术帖

官网相关资源

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