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
: 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
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
. 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
- void StartDefaultTask(void const * argument). \7 L. Q5 l+ ~# M) {# F: X9 ^! N
- {" j2 t4 R; L: M; x
- for(;;)
' p3 {7 {- Q( f! {8 i! H# { - {( Y8 i% p2 Q+ H _; y u5 ^
- HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);//翻转LED0灯' T6 h7 `. z& W" O/ `7 c* z* q+ \
- osDelay(300); F' C% N* |! Z4 I
- }+ K8 R/ L5 {- _0 c& g3 ^
- }
复制代码 8 n9 U+ Z5 k6 i1 d
main函数如下
' C2 X" W8 O3 e
; y9 q& S$ y2 F7 d8 \1 V- int main(void)1 p5 G$ k" ]0 N
- {4 V$ F: L+ V4 ]& D5 X+ O, U$ a" ?( J5 |
- HAL_Init();
" M5 F8 n0 B2 x# S0 J& m; p& a$ ~ - SystemClock_Config();
2 F+ J C: ]- G" V4 R F - MX_GPIO_Init();* [4 c ?# J% r: q
- osThreadDef(defaultTask, StartDefaultTask, osPriorityNormal, 0, 128);//默认一个任务
' N {4 P% o2 \8 b p - defaultTaskHandle = osThreadCreate(osThread(defaultTask), NULL);//创建任务0 N: a, r2 E$ J& a* Z) j# H: Z
- osKernelStart();//启动任务
! n6 ^! `3 s& ]7 l0 O$ k - while(1) {}
& m3 m O- z2 L - }
复制代码
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
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
; 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
+ 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
" 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
. 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
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- #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
, 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
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- 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
7 | H( ~& n( @# P! k' z( D4 `3 t% y8 f3 \ ?4 q+ ]
解决方案就是安装另外一个软件包- 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- STMicroelectronics ST-LINK GDB server. Version 5.8.0
, p; G. n# U/ |0 S: d - Copyright (c) 2020, STMicroelectronics. All rights reserved.. T' W' B. S9 w; B* Z* ]7 C
- * P# V) |% i( A# ~8 z6 x
- Starting server with the following options:2 D5 r% z0 U6 j2 {% ]6 |1 `& k
- Persistent Mode : Disabled
3 K! c6 h+ v1 L% n - Logging Level : 1& M$ g' |1 w2 l+ o/ S
- Listen Port Number : 61234, S7 y; S& d$ m% y3 V3 W: L9 W4 F
- Status Refresh Delay : 15s K# y% R6 K+ o$ Y! n1 F
- Verbose Mode : Disabled) U4 E* ?. I2 }, p0 F& }4 J; X
- SWD Debug : Enabled L4 d! ?& E0 @* H
- 4 B) k7 y4 y7 {4 t1 K. K
- Waiting for debugger connection...
& q4 C! p9 ?7 T: t - Debugger connected
- c* A5 E4 q1 A C$ e- g - -------------------------------------------------------------------# Y" V7 Q" t' `. t! y
- STM32CubeProgrammer v2.7.0-RC1 7 V) A# l5 V, m. v. U
- -------------------------------------------------------------------
0 P) |1 X# X! t% S - / Y2 {: j6 Z$ \8 Z) D& x
- ST-LINK SN : 066FFF343530484D43184×××) `* y& @ Z3 y
- ST-LINK FW : V2J37M27
! h! X. g6 I+ B& D& N" }- T - Board : NUCLEO-F103RB) \ i2 Y9 z; [8 z O' w& m
- Voltage : 3.24V2 a4 V% M6 q; o+ c. _
- SWD freq : 4000 KHz
9 r4 J% K4 L: T4 p5 T) Q* \ - Connect mode: Under Reset
1 s; y" `) h8 a - Reset mode : Hardware reset
$ y( h) c& L! H - Device ID : 0x410
0 V1 E3 @& u; L0 L q, W9 f" | - Revision ID : Rev X
* d G$ n e+ r6 D - Device name : STM32F101/F102/F103 Medium-density
. j' y; [3 a4 r, K6 c - Flash size : 128 KBytes% B0 I5 N: L X- o8 `) w: @
- Device type : MCU! w; u3 m3 _ A9 |$ L8 {
- Device CPU : Cortex-M3' T! y/ e# E7 _! c e* ^/ w% s
- % e9 A7 N& n1 l$ z$ [5 B) k9 X' Y) \
- Memory Programming ...
) r7 R L; E: N1 B: x+ Z - Opening and parsing file: ST-LINK_GDB_server_L6NIAP.srec+ Y' Q w! H$ b: } H
- File : ST-LINK_GDB_server_L6NIAP.srec
+ {' u3 k( c1 {: U+ |/ d: `7 D' y - Size : 5696 Bytes' @9 U* W1 m3 F$ ^. n6 X
- Address : 0x08000000
0 |! X7 r7 U$ {2 ? - / [& N9 \& I5 {# K9 o
- Erasing memory corresponding to segment 0:
. Y X" Q1 ~8 I L' V7 | - Erasing internal memory sectors [0 5]
& p6 y; h& O- \1 g% [3 A* K - Download in Progress:
) \6 Z# s- A# ?( c' `
; `3 p K9 g. P* e- [- File download complete
% f5 n, b+ Y. u9 w7 J9 o+ y4 \/ b - Time elapsed during download operation: 00:00:00.448
' N" q( g& F9 i9 X4 w3 j - : f8 P7 U( l6 @0 L6 {+ X' B
- Verifying ...; f1 |7 n4 ^+ F: H
- 8 Q& D) I* I' A
- Download verified successfully
! T1 Q3 W* h' n - Debugger connection lost.
5 Y! U$ q" W$ ^6 j$ O7 A) b3 Z1 C - 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
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 {" ~/ @
: 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
( 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 |
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
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
- @ } 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
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
# 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
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
) c3 q+ N" u& _7 N1 i5 F) _3 D' {$ x8 F
输入字符不是数字,而是字母的错误时,可以提示错误信息,和程序一致。
8 y, Q/ D! c' ^3 ?1 P& l; r/ A- _" x5 {
/ 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
- sudo apt install g++
3 r; @* A) ~3 R6 I2 z/ E2 G# v& L' ^ - 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 |