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

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

[复制链接]
STMCU小助手 发布时间:2022-5-5 15:52
1 概述
) x; T' |7 D. f- E% u0 X1.1 资源概述

( Q3 v3 R. r9 _8 }开发板:STM32F103C8T6最小系统板
! u5 l5 w( P9 g7 a开发环境:Ubuntu+STM32CubeIDE5 v2 X) ]+ ^; y2 E3 P; G" L. K( E
主控芯片型号:STM32F103C8T6
( F6 r1 g9 G7 T, K6 I& ?) _左侧为STLINK烧录器(ST的Nucleo板),右侧为目标板
' h- q  g8 F/ c
7 T) k; |/ |# ?% x, L$ f- ]- e 2020080809091135.jpg
: Y, Q' `9 d* P1 h$ V2 {7 _' y5 Q- g( X. V+ _/ v6 r, H1 k
1.2 芯片简介
$ M& A- A: y  a1 }+ FC8T6只有64K ROM和20K Ram,比较小,但是可以实现FreeRtos的移植。选择用IDE工具比较香,不用自己写makefile文件,对于菜鸟来说还是实用很多。通过CubeIDE可以实现程序生成编译下载调试等一条龙工作。
% L3 i0 F; d0 K$ c, e
1 l2 S% y$ Q* P, ?/ ]- n/ g2 软件实现,使用STM32CubeIDE, ?5 d6 L0 s2 U
2.1 STM32CubeIDE 生成代码
5 d- B5 E+ S- x+ {' d
在Ubuntu下安装STM32CubeIDE,STM32CubeIDE内嵌的程序编辑器其实是Eclipse。免费的无需破解,更佳的是ST 提供了windows,linux版本以及MACOS版本,也就是可以在不同平台无缝切换。打开程序,使用内置的CubeMx配置工具配置芯片,勾选FreeRTOS,由于只有一个任务,因此保持默认配置即可。% A( R! `& _* i6 S) z$ e* N
$~1ZDY57}RQ_RLEF9Z1KF~7.png
5 h( Z5 c9 g0 i- g+ G' |- F: l/ o0 g3 U* q; N' E4 M" \
FreeRTOS配置9 J$ t9 Y- X# _& Y  B; {0 G

1 N8 E0 `! s* v" p2 e; Z* H 5(9@`01)5_KBOQ9)QRBS{)W.png . q7 [! N8 g* e8 S% B$ f) l
$ v( _0 Y* y2 y; S" O( b
2.2.1 修改Task代码+ n# \, T. M' ^8 B3 T0 O
在生成的Task里边增加LED的相关代码" K- y+ c  l$ M6 w
. t: t) a2 A! ?9 w/ p
  1. void StartDefaultTask(void const * argument). \7 L. Q5 l+ ~# M) {# F: X9 ^! N
  2. {" j2 t4 R; L: M; x
  3.     for(;;)
    ' p3 {7 {- Q( f! {8 i! H# {
  4.   {( Y8 i% p2 Q+ H  _; y  u5 ^
  5.           HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0灯' T6 h7 `. z& W" O/ `7 c* z* q+ \
  6.           osDelay(300);  F' C% N* |! Z4 I
  7.   }+ K8 R/ L5 {- _0 c& g3 ^
  8. }
复制代码
8 n9 U+ Z5 k6 i1 d
main函数如下
' C2 X" W8 O3 e
; y9 q& S$ y2 F7 d8 \1 V
  1. int main(void)1 p5 G$ k" ]0 N
  2. {4 V$ F: L+ V4 ]& D5 X+ O, U$ a" ?( J5 |
  3.   HAL_Init();
    " M5 F8 n0 B2 x# S0 J& m; p& a$ ~
  4.   SystemClock_Config();
    2 F+ J  C: ]- G" V4 R  F
  5.   MX_GPIO_Init();* [4 c  ?# J% r: q
  6.   osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);//默认一个任务
    ' N  {4 P% o2 \8 b  p
  7.   defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);//创建任务0 N: a, r2 E$ J& a* Z) j# H: Z
  8.   osKernelStart();//启动任务
    ! n6 ^! `3 s& ]7 l0 O$ k
  9.   while(1) {}
    & m3 m  O- z2 L
  10. }
复制代码

2 J/ S9 ?1 ]5 o# C& [' n: A2.2.2 STM32CubeIDE自动补全
; I$ j4 Z# \8 N; W$ |* S# f2 [3 I
在STM32CubeIDE 中可以使用**ALT+/**可以使用自动补全功能,不是自动的;
+ u' A: `3 J  Z. q$ n* d6 a8 Q0 d# j% P( N6 f* V8 [% s) j1 r
9{Q}VF1O]_66HXE{)W%ZQCN.png
  P+ y! C& o; w& o( Z- Q3 n: s2 X$ i5 O7 S' l
2.2.3 STM32CubeIDE使用VIM编辑器
' d/ l; @% M6 r- ]3 J' y
vim编辑器真的非常好用,简直爱不释手。谁用谁知道。几乎所有主流的IDE 都支持VIM ,在IDE 中下载VIM 编辑器。% E# S  h6 D1 J3 ?" j, K& \5 M- D

6 m+ }+ i; M% e( g$ q3 K 0LZ[BGTRIO~ZQB`69PM)W(V.png
; T3 C  X- M& U6 h# j, d5 O
4 \9 T6 i; r/ V3 ^% U0 Q设置VIM 编辑器,按照下述设置快捷键,可以使用shift+ctrl+v,激活或者关闭vim。
, w5 Y$ r/ T9 ]- F6 i+ `& u9 v; [0 \
' w5 t1 W) @. C$ l OWD%K5GM[NV6V1(JZF763SQ.png
+ m' f$ g; ]& f. I; K+ Z* {# Z, y( ~$ A
& o# V- r- W* N2 P; N, f1 S, A关闭Vim状态,disabled- `9 r4 l# A9 G- T$ }: u  y! I" ]2 \
7 R  u  A7 k7 q) j
B5FAB5G4JJS_9@S`Z5}A8(T.png " v" F# @. c+ z+ X. R0 ~7 B
" d" Y& o8 w( _% y
开启vim模式,下述是Normal模式7 K' j1 M# u( l9 l1 K
- r& R, j7 D$ Q; }9 s8 F, ]! @) @* Y
. ]6 t6 P+ k# h- D7 o% p+ \3 l
# C/ d; B7 \- L! H
2.3 编译下载程序/ t. a! j8 I" O- h
编译程序代码,结果如下:: u1 _8 H0 e9 j0 h: }' a
% a$ S# p8 [; f! N
20200808091759623.png
. U, k8 @- s/ t7 C; @3 k( _* D8 `. ?& f3 l! R: Q
我们使用CubeProgrammer软件进行下载。在Ubuntu里边下载程序和擦出芯片比Windows平台快非常多,一瞬间就完成了。
! K- O2 d" v  N" x( h  T+ V8 }6 d! r2 B& N, \/ I
TDSXRGCNEJIOQI3RI%2OIL6.png
7 U) F8 V0 p* _; v9 J: }
+ T5 L- [; ]' C& @! T- q% g  J3 g2 b下载完成后,将目标版复位或者重新上电,程序可以正常运行,在移植FreeRTOS时,可能会出现RAM不够的情况,编译报错,这里适当调整下FreeRTOSConfig.h的HEAP_SIZE即可,这个如果调整得太小,会导致部分Task不能正常运行,且编译器不会报错。另外还可以调整单个任务的STACK SIZE,两者结合进行调整。
* R4 B6 b9 f, z" V, _4 u0 C
$ o. J' j( ?/ u8 o! h
  1. #define configTOTAL_HEAP_SIZE                    ((size_t)3072)
复制代码

8 O9 }$ c* B& d1 {9 Q2.4 下载问题解决+ O. N! t! ^4 i+ y+ d- }; M
2.4.1 问题1解决
. M: v8 c8 E/ B- H/ i5 L: k, T
遇到了几个问题,第一个问题,提示下列错误,ST-Link Server is required to launch the debug session3 P3 X/ X# `8 V1 ~" Q4 ~* }+ t

  E. B8 }, D- k" u# f 1YSA}N5GEG703`MKUOT65FC.png , K% [" K: [* M, j' S+ N

$ i) Y, R: M5 ~& s. F2 Q解决办法,进入官网下载软件安装包,下载链接STLINK Server( ], t" A5 d% M  i& \
! c: l1 y3 |% w3 P8 U
20210605000138412.png
3 Z, \$ t6 J" T( M# _( Q
- r7 M1 l4 Q" z5 Z下载完成后解压,使用.deb的安装文件,切记不能用双击打开安装的方式,因为安装过程有协议需要输入y同意,如果双击安装会导致安装卡死。卡死后会比较麻烦,需要杀进程,删掉锁等操作& L3 c4 Y& T  f- L  z

: f5 ]1 z6 {0 Z# `. n! p
  1. sudo dpkg -i st-stlink-server-2.0.2-1-linux-amd64.deb
复制代码
$ o; V& }" m# G" U! u
2.4.2 问题2解决- `1 z. ^; D% y/ z' h2 S
按装完成后烧录报另外一个错误,Could not determine GDB version using command:arm-none-eabi-gdb -version) L) P" L% r+ r8 n2 K4 T9 t
TK4DZ~CE3IC17KQSAI]V}U4.png
7 |  H( ~& n( @# P! k' z( D4 `3 t% y8 f3 \  ?4 q+ ]
解决方案就是安装另外一个软件包
  1. sudo apt install libncurses5
复制代码
' |7 y: f  [- J1 m( ]! K: Q
安装完成后就可以正常下载程序了(点击RUN 按钮),单板运行正常了。下载成功的调试信息如下/ `" G0 i4 W2 T- E& P. v6 \2 B1 A

+ u5 j# y9 C% ?( {9 f0 o
  1. STMicroelectronics ST-LINK GDB server. Version 5.8.0
    , p; G. n# U/ |0 S: d
  2. Copyright (c) 2020, STMicroelectronics. All rights reserved.. T' W' B. S9 w; B* Z* ]7 C
  3. * P# V) |% i( A# ~8 z6 x
  4. Starting server with the following options:2 D5 r% z0 U6 j2 {% ]6 |1 `& k
  5.         Persistent Mode            : Disabled
    3 K! c6 h+ v1 L% n
  6.         Logging Level              : 1& M$ g' |1 w2 l+ o/ S
  7.         Listen Port Number         : 61234, S7 y; S& d$ m% y3 V3 W: L9 W4 F
  8.         Status Refresh Delay       : 15s  K# y% R6 K+ o$ Y! n1 F
  9.         Verbose Mode               : Disabled) U4 E* ?. I2 }, p0 F& }4 J; X
  10.         SWD Debug                  : Enabled  L4 d! ?& E0 @* H
  11. 4 B) k7 y4 y7 {4 t1 K. K
  12. Waiting for debugger connection...
    & q4 C! p9 ?7 T: t
  13. Debugger connected
    - c* A5 E4 q1 A  C$ e- g
  14.       -------------------------------------------------------------------# Y" V7 Q" t' `. t! y
  15.                         STM32CubeProgrammer v2.7.0-RC1                  7 V) A# l5 V, m. v. U
  16.       -------------------------------------------------------------------
    0 P) |1 X# X! t% S
  17. / Y2 {: j6 Z$ \8 Z) D& x
  18. ST-LINK SN  : 066FFF343530484D43184×××) `* y& @  Z3 y
  19. ST-LINK FW  : V2J37M27
    ! h! X. g6 I+ B& D& N" }- T
  20. Board       : NUCLEO-F103RB) \  i2 Y9 z; [8 z  O' w& m
  21. Voltage     : 3.24V2 a4 V% M6 q; o+ c. _
  22. SWD freq    : 4000 KHz
    9 r4 J% K4 L: T4 p5 T) Q* \
  23. Connect mode: Under Reset
    1 s; y" `) h8 a
  24. Reset mode  : Hardware reset
    $ y( h) c& L! H
  25. Device ID   : 0x410
    0 V1 E3 @& u; L0 L  q, W9 f" |
  26. Revision ID : Rev X
    * d  G$ n  e+ r6 D
  27. Device name : STM32F101/F102/F103 Medium-density
    . j' y; [3 a4 r, K6 c
  28. Flash size  : 128 KBytes% B0 I5 N: L  X- o8 `) w: @
  29. Device type : MCU! w; u3 m3 _  A9 |$ L8 {
  30. Device CPU  : Cortex-M3' T! y/ e# E7 _! c  e* ^/ w% s
  31. % e9 A7 N& n1 l$ z$ [5 B) k9 X' Y) \
  32. Memory Programming ...
    ) r7 R  L; E: N1 B: x+ Z
  33. Opening and parsing file: ST-LINK_GDB_server_L6NIAP.srec+ Y' Q  w! H$ b: }  H
  34.   File          : ST-LINK_GDB_server_L6NIAP.srec
    + {' u3 k( c1 {: U+ |/ d: `7 D' y
  35.   Size          : 5696 Bytes' @9 U* W1 m3 F$ ^. n6 X
  36.   Address       : 0x08000000
    0 |! X7 r7 U$ {2 ?
  37. / [& N9 \& I5 {# K9 o
  38. Erasing memory corresponding to segment 0:
    . Y  X" Q1 ~8 I  L' V7 |
  39. Erasing internal memory sectors [0 5]
    & p6 y; h& O- \1 g% [3 A* K
  40. Download in Progress:
    ) \6 Z# s- A# ?( c' `

  41. ; `3 p  K9 g. P* e- [
  42. File download complete
    % f5 n, b+ Y. u9 w7 J9 o+ y4 \/ b
  43. Time elapsed during download operation: 00:00:00.448
    ' N" q( g& F9 i9 X4 w3 j
  44. : f8 P7 U( l6 @0 L6 {+ X' B
  45. Verifying ...; f1 |7 n4 ^+ F: H
  46. 8 Q& D) I* I' A
  47. Download verified successfully
    ! T1 Q3 W* h' n
  48. Debugger connection lost.
    5 Y! U$ q" W$ ^6 j$ O7 A) b3 Z1 C
  49. Shutting down...
复制代码
: s/ Z9 R; |  K; o
很奇怪为啥这个软件不对这些进行集成,导致折腾了比较久的时间才搞定
" Y: e5 h+ M( R' ?3 d9 S( ^8 s6 C+ }8 A5 X9 D+ i" L
2.4.3 问题3解决
( @- Q- Y' @2 ]* @) z下载程序,点击编译器的Run下载到目标板,报错Fail to start GDB server,这是由于目标版的芯片是山寨芯片(最小系统板10块钱淘宝货),ID不对。使用正版芯片不会有此问题。已经使用ST官方的Nuleo板验证。
. L% C) B( I9 Q7 D/ k% G
0 F: W& H; J. g1 H6 h 0I{N]T08(~{ZLC8%PO}E.png 1 m: b/ W* m6 f' m, o7 ^4 q" U/ k

: t3 H2 {$ y8 \* o1 v% k2.5 调试* @( Q5 G$ H7 \$ J/ ^. j$ e7 S
可以像Keil一样调试,单步运行和设置断点等# E" I+ ?0 j! F$ D6 P

, k' n( F0 {" ~/ @ `%_LJJF6II_~424H}~E)@G2.png : G% B1 E4 ~8 \
1 p; {9 j3 e& w# |: ?6 y8 t
在断点列表中选中需要跳转的断点,然后右键goto line' {7 c- Q% h; D( x# b+ {  l" z

, D7 h  J6 g/ V  D 20210605083715690.png
( d4 @  Q. U8 G  C6 ]4 S' M6 {6 @$ ^' c
2.6 cubeIDE工程无法导入无法编译问题解决- I3 m/ B6 b6 {# p- X
下载的工程,不要放置在工作目录下,否则工程将无法导入,仅支持工程的创建。创建完成后的工程,如果在工作目录下移动位置,也会导致工程无法导入。正确的做法是做一份拷贝,放到非工作目录区。如下是我们的工作目录,已经实验多次,克隆下来的工程,在工作目录下无法识别为工程,在其它目录可以正常导入和编译。
# ~- @$ @# X0 y1 S% I
+ Q6 d! b; v( v. X, I, A: ]/ f- Y3 | VCF}BGX1AGHWF[3GO@5BNK7.png
1 g; C# e  w6 D+ |" {# e
/ T8 K' \  N6 N, `2 ^工程拷贝时,需要对整个大文件夹进行拷贝,因为工程目录下有几个工程隐藏文件,没有这几个文件,会导致导入工程后,built project时灰色的,不可编译,而且工程的右键菜单少很多选项,这些文件包含了工程的相关设置等,如果误删除这些文件,可以新建一个空的工程,然后把core和drivers的代码拷贝进去即可。就能重新编译使用了。通过ioc文件创建工程是一个比较快捷的办法。
5 j6 A) {: b1 t2 t2 s- f
. q' _/ k( k0 W) D! w; [* ]3 C J_8JGYCT1JD`S)3$M1J[66W.png
8 @9 e9 k) n* z( v6 K( T/ N; |5 R' i9 ~' V. M
3 使用STM32CubeIDE在电脑端输出hello world.
1 J% [+ y& t5 j3 f( K! N8 h既然软件集成的是 eclipse,那么是否可以编译标准的c呢,这引起了我极大的好奇,经过一番摸索,发现答案是肯定的。: F2 A# T6 Q) A- W& e7 M
; O9 O% T7 ]( Z/ d1 O2 j
3.1建立工程
2 P4 Y* Y+ B+ M选择file->new->c/c++ project,9 F% s9 q, H0 x8 Y4 D+ K

' g% [' |6 l* C7 A: P$ A& G ZCOVH[GU3}(_@@Z22CK}T4E.png
- @  }  V3 M/ l) @. o5 K0 F: T* q- x1 l- j! i$ ~4 Z
选择第三个,选第一个也是可以的,弹出的窗口中输入工程名。
- C  s0 g" v' g5 P& b
* w# r$ P# u" M" Y, G  T' S M%Q8M([MW4MG_U)JZBX8C.png
6 i% B5 r' \0 N( s, e- I$ h% q& c
( {7 Q, V" q6 ]3.2 写入代码! d# ?+ c+ B# i! j1 y) o
写入一个两数求和的代码,看下是否可以进行交互。
  M, T9 [. D0 c2 w  C
) L. I: f, U+ b/ T8 q/ E )0%FG7BY5{[U[KIL7WG0M[N.png # f/ z7 w- g$ r# u' g; Y

+ {2 t$ J: c4 r3 A% _$ y: g  W3.3 工程编译# ]( o) Z' k) t
选中工程,右键built project,0个错误0个警告,说明编译通过* r$ o4 n2 H' [. }

7 V7 |1 Z  w; r; F5 }  d; F. I) A) R 20210604220901897.png 9 c# ?1 m3 V5 ?/ T7 o% G3 u& a0 J

% d0 j; @6 H! I4 O3.4 编译后运行
1 W" c5 n0 r- [4 L) B7 V选中工程,右键,run as-> local C/C++ applications,控制台有输出,且可以输入,结果与程序完全一致。
2 z; \, |, X5 {6 s( G# F& O7 ?* R5 S) F2 ~! K2 C+ v) B
20210604221128503.png
) c3 q+ N" u& _7 N1 i5 F) _3 D' {$ x8 F
输入字符不是数字,而是字母的错误时,可以提示错误信息,和程序一致。
8 y, Q/ D! c' ^3 ?1 P& l; r/ A- _" x5 {
2021060422243111.png / V5 ^. Q* t6 h& B* @
- {7 u4 c6 J! u& Q' Z/ @
3.5注意事项
/ r6 `' w( a2 P- C7 r9 Q- l初次使用时,可能会报错没有g++或者make,使用命令行安装这两个软件即可2 z. ^) k# i) o& X# X
  @9 H! n$ J: T4 N  t, ~, Y
  1. sudo apt install g++
    3 r; @* A) ~3 R6 I2 z/ E2 G# v& L' ^
  2. sudo apt install make
复制代码

/ d+ |2 W  a% D1 U3.6 windows中运行
( r" b7 |. y8 t$ QSTM32CubeIDE的windows版本软件中,也可以编译运行,编译生成.exe文件,但是输出的是乱码,run as的设置和linux下的版本相同,更改编码方式乃无法解决,即使输出的是全英文。, F7 |( K) H8 b6 f+ h% G/ F

* K9 _  {% ]2 _
, J0 q3 [, ?5 N* A3 l. [$ m
/ r/ t5 a) Q7 H! U3 q
收藏 评论0 发布时间:2022-5-5 15:52

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版