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. |
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
+ 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 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- void StartDefaultTask(void const * argument)
; o6 s4 H& ?. F' H! [7 H5 N - {5 I) d- c" l( q3 C
- for(;;)3 w; Q( H/ z) |+ a
- {& ~* p* R) b- x4 r; y$ W8 r' X5 V
- HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0灯
- M4 e# d* D( i3 s- M9 E* X3 p, H - osDelay(300);% I% |8 I; C0 }& f+ p+ B8 j
- }/ `" F5 W' U* m" P7 d
- }
复制代码 $ I, h& h) J4 h
main函数如下
5 N: @3 [2 |; y6 T/ c8 s
( k, f, K0 o6 |& M4 w5 M7 [, z" S- int main(void)
! M* D/ K, U$ R, ~- U; A - {
, D6 _/ f2 Q3 B - HAL_Init();7 ^: y, N$ G7 M
- SystemClock_Config();
# S# h2 Z! u. ^: B - MX_GPIO_Init();
/ V) h7 `# X- ^( f- E - osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);//默认一个任务1 x) P) O1 N7 |5 f' I0 |
- defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);//创建任务7 r0 D; C) I, r9 a- n* A& q
- osKernelStart();//启动任务3 b' U& n- X6 J2 W9 w7 V
- while(1) {}
7 g+ @7 W3 N& J3 { - }
复制代码 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
- 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
|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
$ U, V7 [' c I* `4 ]/ A) V" | k
关闭Vim状态,disabled
8 a2 D5 I. a2 Q7 _# ?# I$ i7 ~
1 ]# @! ?& {. {( L' e: l: s& f
* 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
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
$ 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
- #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
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
- | 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 ]- 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
) z9 M4 C3 A) h4 I8 O& S$ a
0 Z4 B# r: F5 A$ [2 `$ _( B: q解决方案就是安装另外一个软件包- 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- STMicroelectronics ST-LINK GDB server. Version 5.8.0
4 Y+ k* C6 C# K$ ?( j6 u' k1 U8 E, H - Copyright (c) 2020, STMicroelectronics. All rights reserved.% t* \8 v, p8 j) h, h; Z
- y: s6 C! `: d6 C( y8 f- Starting server with the following options:
# ?$ X. u- V3 V! q& {% y - Persistent Mode : Disabled: n3 _2 B/ H0 d# P. a: j* I
- Logging Level : 1
4 I. O5 H# q# Z; y) W2 D - Listen Port Number : 61234
9 l- D2 E4 Y; ~) N n - Status Refresh Delay : 15s
# w+ b) q' i" P; ~: b1 E - Verbose Mode : Disabled i. n2 {0 b# {) v5 R8 X
- SWD Debug : Enabled z# i" T; i7 [9 C' |/ m
6 Y, ?$ }& J5 O+ R7 i/ B- Waiting for debugger connection...7 `9 s. x! W0 [ |. e8 C4 t' K& w
- Debugger connected
! F% e- ^8 \2 H* G - -------------------------------------------------------------------. j" `1 K9 {3 l' g5 u4 j
- STM32CubeProgrammer v2.7.0-RC1 0 g* G3 |7 J0 Q: L' d z- J
- -------------------------------------------------------------------
3 e* } ?" A# a% b' U - : Y! _3 ^* D/ Y$ B/ Q/ s
- ST-LINK SN : 066FFF343530484D43184×××1 v% T; G6 w! M; J# h/ _0 `
- ST-LINK FW : V2J37M278 k- ^- t/ C- u; m$ G& k
- Board : NUCLEO-F103RB9 z. C* p. A5 E
- Voltage : 3.24V
; H( v7 `' Z9 I% ? - SWD freq : 4000 KHz
6 `+ O( m" w3 X9 [# t; i) z& y - Connect mode: Under Reset
6 q! [4 n8 ~$ g - Reset mode : Hardware reset
) r7 l8 j4 J( h* r - Device ID : 0x410% n8 V/ h* f; L2 E
- Revision ID : Rev X
: [$ `# D' Q, K. }8 W - Device name : STM32F101/F102/F103 Medium-density
$ f C( L0 }. P3 T7 m& u% G- q - Flash size : 128 KBytes
/ F' [( s B! ?5 q3 b- i - Device type : MCU- O* n+ p$ M8 h. V: n. \
- Device CPU : Cortex-M3
3 [' @4 `0 R T' h2 v
" F$ `( Z9 k7 `0 j- Memory Programming ...) W8 y2 g$ S+ R5 f& m* K9 b: ]( C
- Opening and parsing file: ST-LINK_GDB_server_L6NIAP.srec" R2 t6 r" {4 `$ M) i2 _" y
- File : ST-LINK_GDB_server_L6NIAP.srec( u s6 a& v2 y+ L! w
- Size : 5696 Bytes* f+ S3 I' }, p$ G
- Address : 0x08000000 - Q$ P' e; i$ P. r% K$ o- [) s
- : G# f; F. F* W
- Erasing memory corresponding to segment 0:
2 T' V9 }6 b: ^% n7 [2 b - Erasing internal memory sectors [0 5]
. q0 N: F1 }" [' Y3 ` - Download in Progress:
$ _7 G9 R4 Z3 o- r1 X - $ V- o% F- Y' Q7 w+ R
- File download complete
, [# \. K) H7 ?4 c - Time elapsed during download operation: 00:00:00.448
( R5 o& P6 {% a) k4 ~6 s2 E - 6 S9 y, L5 Q ?
- Verifying ...& @2 g- r% r; H% l9 x' |
5 u" ?' Y* }, l# w' J! K! a- Download verified successfully 9 E4 V, Z6 W z
- Debugger connection lost.
+ j( h% t4 i8 }+ n/ q# H; x/ ] - 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
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
( 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
) 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
& 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; _
& 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
" 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
' 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
! 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 ]
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
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
: 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
- sudo apt install g++
& I0 U/ s2 L- g - 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 | |