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

Windows+VS Code+EIDE+STM32+gcc编程环境搭建

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”
* p0 w1 Y6 u4 [1 J9 f
7 H# Z; h( q. x/ z
微信图片_20240615160241.png
1 g5 `3 \+ U% Y; i
& [/ W, y, I3 ~( W4 A2 X+ C* w. Z# ^1.VSCode安装与配置
$ d8 J! q" {3 d. m  J$ G; z: K& |a.卸载
: f, [5 L. k' ob.安装
6 S: r& C! C( t' F+ kc.git安装与配置
3 L/ a0 U0 M) Hd.安装插件
9 z6 `, @! h4 [. g
  W* F" u* l& P- {5 N% t/ T, k

/ J9 I5 c0 v9 j! H9 K; m2 ^8 k1 S: ]2.Embedded IDE配置% J1 N1 a- n$ J% H
a.安装EIDE插件# p0 [( d( X" H) d( x& o% q% H' O
b.安装实用工具到EIDE+ ^+ H. H( O, F" ~9 E3 Q
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools
    . T) L$ J/ _# j( F/ M) Y. n3 t, Z
3.Embedded IDE项目建立-stm32标准库
) g5 c( X8 M8 W3 K: {a.工程项目建立! Y- p* b  }& x& C# I1 P
b.在EIDE中使用标准库时的设置(无Makefile)
# D7 j+ u5 g" E9 g3 m" f/ lc.编译工程; d. q" G- p* J+ G) G$ V

+ L+ X8 Z' E8 R' X* r* h9 B
4.一些问题的处理:8 g. n! R5 `& e& o/ c) m
5.调试工程* n- f; N$ i( H  n4 f
+ P7 }4 }" k5 E
01VSCode安装与配置0 H7 Y7 z* k/ q/ o9 [6 ~
1.完全卸载之前安装过的VSCode. i& w& L0 Q# P
a.卸载软件. i: Z" T, H$ |! P8 d
b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。
' u. b  E( z& S# W: _0 ^c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。, c3 y. [0 J. ^3 f% V+ h/ D
  v* z' Z7 x! r# x- i
2.下载安装vscode4 |* P2 V# c' R

8 y9 J2 K# G7 J5 U  Q* D$ V
3.git安装与配置
4 ~/ E) \$ m( d1 T安装git1 e+ m' S6 h1 _) q9 r; O

0 e' m  d+ O7 ]- G: {3 g! i
微信图片_20240615160248.png 0 R$ }. f8 s+ a' ^/ H2 C

* i  S! z3 y3 h4 _  X安装完成后,在开始菜单中找到并打开Git Bash  f; \# Z7 s. K, V3 E8 C* D
; l. {* Q$ [, B  W
微信图片_20240615160250.png ) C3 X7 e5 Y. l* F. |) X2 O1 Q
' V& e& J7 E8 F; o: i% B
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git- T; E, h( t4 c# j6 t8 X1 H
$ \1 v# b3 o3 k  s" D5 u
微信图片_20240615160253.png
7 i% J& B# h5 i4 P% h- {8 w3 L
; G6 a9 t8 R8 h6 e/ Y* T
在git bash中输入配置
  1. git config --global user.name 'kevin.kerry' & \( ]$ }3 G7 O& R& V& M
  2. git config --global user.email 'ct15762287606@outlook.com'
    9 b2 I- x# q( D0 a
  3. //检查当前仓库状态
    # ~2 J# F: p3 n7 z7 Y9 Q- b2 f- [
  4. git status. q) {# s" n$ K/ I( F8 j+ l( Q
  5. //确认git配置
    : t0 u7 [5 j! o: w) c; g9 v9 n
  6. git config user.name- d/ k: H. c( |- L1 j7 f
  7. git config user.email
    ! l: _9 \4 R% r' M# q9 e
  8. //查看错误信息& u/ ^$ {' d5 o. m) q6 W/ l* d
  9. git commit -v: y0 O8 S2 b% W. y1 b
  10. //清理缓存
    # P' K; I9 j. }5 n, M( h3 R
  11. git rm -r --cached .
    7 q, r  V! @! d5 ?2 l
  12. git add .1 i+ q: X; D/ Q5 t' `* n
  13. git commit -m "Your commit message"
复制代码
% G$ [9 N) ^% {! F3 X! s
微信图片_20240615160255.png ! C" ]4 e; A) i* v& Z/ ?3 [0 i

6 c8 I+ X$ V4 s. N+ E3 o! f6 _; V! J4.安装插件,如下图:7 |; V# \" k. I3 |
( i. a  H; U7 x
微信图片_20240615160258.jpg / [0 u, ~! r" c1 k* r, d5 l
$ A1 z0 G7 i* ~& ?
微信图片_20240615160301.png
4 Y8 g% D2 v% F1 c* p: g- \; y1 d& R- b( ^( |3 m: s. `9 l2 K
微信图片_20240615160303.png
! L7 k: k" C1 \* G7 k) e
, X6 w3 s& `" E) V1 G" x8 }* B 微信图片_20240615160306.png
+ W! _# D/ a! ]1 A3 N" ]7 |" g# Q. p, r$ k- f/ g) d, `
微信图片_20240615160309.png ! d( J  P& o( v0 M
6 u: a$ G  c) \
微信图片_20240615160312.png , L" r  W4 x6 j

- S) z4 s7 \3 {  A 微信图片_20240615160317.png * D( y/ D6 m/ c, j7 @

9 i! V3 ^  V* X0 B* C1 ] 微信图片_20240615160320.png
" T( F% C6 Q( D. f- }6 h+ |# y' T1 y# k- S( D
微信图片_20240615160322.png 9 K) D  p/ {4 A

2 N) `# ^, o) ]- X5 y  v 微信图片_20240615160325.png
% u. A# g7 t( L; G& x
. ~. y$ P- m8 W: R- F8 o( ?$ h+ F 微信图片_20240615160328.png 7 F( s" @$ Z9 F4 v) s7 w: c6 q# ?" H
& u; a" R) D% R5 D+ b2 t" m# Z$ u
微信图片_20240615160331.png 4 a# Y; X5 S9 P4 h, |& {

8 t) \8 Z. i4 P  N0 K( Z+ ] 微信图片_20240615160334.png ' [/ V- T: [/ @% q& ^. k* Q2 |
" ?  H# E3 t) `& B' ?* z
微信图片_20240615160337.png
1 m2 R) P4 S. }# r+ k( [9 n% k) E: P9 u8 |- m' ~& y
微信图片_20240615160341.png 7 ^+ P, Y/ f0 X; \- _( a
  W- W9 X& }: {  {3 v  S; e
微信图片_20240615160344.png
5 c  [+ Q5 H) O$ J
6 x: |' I: ]9 t 微信图片_20240615160347.png % Q& p; q1 X$ A) O* N* c: p8 P' g
+ E: X% K4 S" W* h1 T$ H
微信图片_20240615160349.png
$ w4 j7 S4 q- z- W6 H, l0 C3 K9 f* D+ F1 X
微信图片_20240615160404.png
% [8 r& ]7 W, J* a. j  ]. y! O8 M7 [! a4 A# Q5 H/ O- L
02Embedded IDE配置
& B  K: S% E- _! s$ ~1.安装EIDE插件到VS Code
3 f& K% G+ x* k, s6 \* q! }0 ^2.安装实用工具到EIDE环境
. v5 g4 q4 F& `. R/ J9 X4 @( R7 qa.安装arm-none-embed-gcc工具链  ]% Q7 C5 B+ a# a0 x

% Z/ ~1 O1 c' m2 N
微信图片_20240615160533.png / A4 {7 x4 k. d/ @

+ {4 G3 \' o" i* k7 z6 v/ ^b.添加其bin文件夹到环境变量
# f0 O4 c$ }7 q' a- A8 n
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址. d8 u( s. H! `( R
/ S% _- Q# g( b6 v* y& m9 z
微信图片_20240615160536.png
5 o$ H0 N0 |8 F5 }# V$ e# P, Q8 }6 K/ n3 y9 s$ m
微信图片_20240615160540.png
/ J  N& o6 a+ q
" I1 h1 R) K5 G7 }
在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试/ ^! f1 t) f/ a+ S1 s" s

7 N$ h  @) g; R' E
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

7 ~6 I3 n7 w0 q3 ?4 H; S6 Xc.安装OpenOCD4 _8 h: J& ~0 c- p+ u) T9 J$ O0 A7 Z: g

# f7 P3 \' e' n4 k
; _# Z" _, o. O4 c" R3 a$ K

- U3 B) L" o7 [7 G! e" m$ P! s, wd.在vscode中安装Makefile Tools: \) ~; x# T! J+ d. D( ?

) {& C" k& `) E+ k1 y/ S
微信图片_20240615160554.png
) u1 F+ K3 i% s' O0 }( w! K) ^- P
3 Y4 V0 f  {+ X6 n1 H7 M+ }+ X% V! [
  • 找到该工具的安装目录( `$ m1 r! s' ]: V( t1 k

9 k+ R4 f! n: g2 J& A
微信图片_20240615160557.png
& ?$ g2 V4 Y9 |) R- H' k4 Q
* M' K5 [+ N# x+ V+ k
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常2 ?5 p0 _# |) q# P  D5 c
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v& e. Y; H; X" l; t2 C) \7 Y
  2. GNU Make 3.818 b) g& m$ Q: S9 i) Z5 b' \
  3. Copyright (C) 2006  Free Software Foundation, Inc.& \& x  x- ~/ p# p3 L
  4. This is free software; see the source for copying conditions.
    ' [& f' F5 W6 X4 O
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    % U: A0 ~2 G% @3 e0 L% P
  6. PARTICULAR PURPOSE.1 J1 n5 u; @; F: l5 P/ Z
  7. ( }/ ^* w* l# t$ C: ]8 Z' ^: a

  8. ) L" j6 ~9 U2 e$ H
  9. This program built for i686-pc-msys
复制代码

& _5 z$ S: f, B6 _* F# C4 e03Embedded IDE项目建立-stm32标准库
# u# T1 P% P# d# n* i3 F1.工程项目建立& ~# W- l- z. T$ ^, F7 k4 _
a.切换到EIDE环境,点击操作-新建项目-空项目图片% d8 l& ^( P& \$ @

% ?7 T3 P4 F) ]& k2 R2 x# v  D
微信图片_20240615160602.png
* s0 H! h7 r+ @) m
* y, D" O1 M/ T6 y* k: Lb.选择一个合适的MCU项目类型,如Cortex-M项目7 R& M* ^) y- C; s4 S

+ `& @  p; N% t& \1 `9 K- W2 u, K
微信图片_20240615160605.png
9 k7 _  h! R9 E& u, p  O8 v9 V' c1 f4 j/ z  }; U+ e
c.点击右下角继续,跳转到工作区! v' z* J( C: d% I& c# Z1 s

3 n3 y0 e, W9 m% r+ c 微信图片_20240615160608.png 7 e5 q$ [( l, L

/ p; j" [6 t& U3 ?9 rd.添加工程文件到工作区路径下。——标准库
9 ~& H/ [# T/ z9 ~" G* j8 D9 Z1 c) X- Q* }$ Q5 i
; [9 I! f) y# f) G
微信图片_20240615160612.png
+ n) ?4 D& ~0 {: V; F7 c2 @, ^- H2 l: v. h3 b' O
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    : U# y; [7 |# U" @' h
$ x! \0 n- T9 Y, F1 a
  • 新建User目录,将STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template目录下的stm32f10x_conf.h,stm32f10x_it.c,stm32f10x_it.h,system_stm32f10x.c复制到User目录,并新建main.c文件。4 r4 U- w$ `5 ]8 W4 q+ \2 i
6 Q9 C: @$ k1 z, P9 r# O6 H
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    * E3 L# Y; q! N, W( u/ m
3 D3 e. v$ Q4 R8 W
& k) q: h6 U/ z
. Z; Q9 L! y' ^, I$ ~- T# O
微信图片_20240615160615.png
- z& [, y1 o, ^& s6 J
% ~# d( u0 N# ^. J" O; D3 D
stm32_flash.ld: x* V7 f, ^, _7 ?& @. h  U4 _
  1. /*! N* S5 R9 S4 l9 L- J
  2. *****************************************************************************2 f- B6 o6 P% ~0 f$ V" G- D
  3. **1 t. }/ l) o4 o; ~
  4. **  File        : stm32_flash.ld
    $ V; V) `* R) e
  5. **
    ! q5 z4 T3 B/ ~4 p- W) k' s" I& q- e
  6. **  Abstract    : Linker script for STM32F107VC Device with" y3 b& ]# d- V6 q2 {* Q- p
  7. **                256KByte FLASH, 64KByte RAM
    # R' J+ _& i' v
  8. **
    & m3 B/ V) e1 d( L
  9. **                Set heap size, stack size and stack location according$ I; q/ @1 ]( j
  10. **                to application requirements.- ^7 s" ?' J- {+ [3 @( R8 ~4 o
  11. **  H7 g, I6 x( h
  12. **                Set memory bank area and size if external memory is used.
      p; z/ P7 z# S/ h' L5 A
  13. **
    5 E: _+ t  ^5 @$ }) }& i
  14. **  Target      : STMicroelectronics STM32  _8 k' _; f' R! E" T* O. r3 y
  15. **# Z0 N: h' n- l' J- J% S
  16. **  Environment : Atollic TrueSTUDIO(R)
    ) g1 \5 ~7 ?9 D- ^$ T. Z* t
  17. **# w7 G! ]( [% [8 ?9 h, E
  18. **  Distribution: The file is distributed �as is,� without any warranty0 U2 u' y( i, O6 c4 [! S
  19. **                of any kind.
    2 D* m9 h1 z  [4 }
  20. **% l1 \  R& i. U5 O/ G. ~, U: h. K" t+ V
  21. **  (c)Copyright Atollic AB.
    1 {3 y1 A! F, }# X+ |
  22. **  You may use this file as-is or modify it according to the needs of your
    # w9 u- T0 n1 L" ]: V4 s% ~
  23. **  project. Distribution of this file (unmodified or modified) is not8 n1 ^% o7 [- b2 T- S
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the( ~" s' \8 l: c2 a) h# M
  25. **  rights to distribute the assembled, compiled & linked contents of this
    ; z2 [, F- z: Z2 r" C5 G* {
  26. **  file as part of an application binary file, provided that it is built
    / @% I5 j2 `3 K. i1 H$ ^" W4 X, g
  27. **  using the Atollic TrueSTUDIO(R) toolchain.
    3 j: J/ z; L, d2 l
  28. **9 n% O# X/ W; y5 i5 {0 g
  29. *****************************************************************************5 R) T5 d7 L5 ]' b! ~2 z+ D
  30. */
    # z+ s# g1 v  |9 c
  31. , E! j  y* d: p) [
  32. " B) P; L* B4 b* X$ `/ r. E( u4 ?7 N
  33. /* Entry Point */7 x$ T+ O% f; F8 b
  34. ENTRY(Reset_Handler)/ Q* P* O% P; T3 s

  35. % ]2 |/ g# A% @5 F$ ]( Z/ n

  36. 8 f# b, i. q9 r- `
  37. /* Highest address of the user mode stack */
    2 d1 R7 p# y6 k5 g
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */' ^: G6 K1 S! ?$ j3 r: q. F. N
  39. 5 f0 @) C" |1 l6 ^9 f" N9 h
  40. 3 J$ N9 e  N( D  O; |" b% O8 Y* H
  41. /* Generate a link error if heap and stack don't fit into RAM */" P3 |. H; R5 {8 V  ?8 z  }% c. f
  42. _Min_Heap_Size = 0;      /* required amount of heap  */
    ) \* }9 L% f2 Y2 m& W
  43. _Min_Stack_Size = 0x200; /* required amount of stack */
    6 i4 B: A9 R' r

  44. , @$ M' i6 y- `5 G3 \
  45. ! f/ E9 y- }9 ^) U" \; l0 ]2 Z% c+ x- O% H
  46. /* Specify the memory areas */! t+ F7 ~) L3 s: }5 I
  47. MEMORY
    ) i; ~/ {2 }) u1 E: p2 E2 q! d
  48. {" \- w1 Q- g6 k  M* t8 ?
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    2 b: G; h* L7 k; N- [6 G7 f; R' e
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K1 Z6 _) L/ R0 ?. P. X
  51. }; k. J; p' {4 t
  52. + ?5 J$ o% y) P1 E' n8 o% ?
  53. & F% w, n, t* Z: N# J! J/ J& s! Y
  54. /* Define output sections */# x+ U1 y# x! G+ k2 ^
  55. SECTIONS1 `! p/ h, L7 D% ^: F
  56. {
    & u  |% K3 k& g' g+ @  }$ H3 l
  57.   /* The startup code goes first into FLASH */  v) i' |7 \( g0 T) i( M) v5 J6 W# j
  58.   .isr_vector :9 v/ `* l# s& {5 x) M- E
  59.   {  T( K1 a$ D+ V! t
  60.     . = ALIGN(4);
    4 H1 _6 {/ Z+ N0 w. Z1 m4 Q. g) e
  61.     KEEP(*(.isr_vector)) /* Startup code */
    2 N/ `+ `) x* |1 E8 o9 L
  62.     . = ALIGN(4);
    ( \: o( [1 s. B) N- ^  Z1 y, t( t+ [
  63.   } >FLASH* k0 X/ C6 g/ R% `+ {

  64.   P1 \2 s. D1 ^8 h) s% e

  65. 0 T7 g+ ^1 F# f" w; [% l, a# D9 n
  66.   /* The program code and other data goes into FLASH */
    + l, F! \( B1 A
  67.   .text :
    % b: Z2 [( {5 W1 Q+ Y, f
  68.   {
    9 U$ t1 I* |# B6 Y. N8 O
  69.     . = ALIGN(4);
    * K, j; ~" U8 Q
  70.     *(.text)           /* .text sections (code) */7 @- W) D1 V+ \& ^, o7 |
  71.     *(.text*)          /* .text* sections (code) *// @( z2 R& S& L" j2 \6 R3 G+ F
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    " R7 {7 ]- L9 N( g6 l# O. V
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */; _% K$ y0 J: g8 t- A2 {
  74.     *(.glue_7)         /* glue arm to thumb code */3 v" c: L. b4 G5 p! r
  75.     *(.glue_7t)        /* glue thumb to arm code */  n8 ~' Q1 \4 p, ]' V

  76. * X" Z0 z* T# E* Q' o/ K" q2 U
  77. 3 V' F4 }' q- f
  78.     KEEP (*(.init))
    $ b, s9 i2 @6 {; {+ U5 d! v
  79.     KEEP (*(.fini))' o6 D0 ]  W3 v1 O# W

  80. . q& j1 [) \. d; k: a4 }0 f2 }

  81. # J/ v; m) W# `; W  m/ `. _
  82.     . = ALIGN(4);0 S8 M) p; S# N' F* c
  83.     _etext = .;        /* define a global symbols at end of code */
    $ e, ?+ l0 Z+ r2 K; c% h
  84.   } >FLASH
    * D+ Z7 x& m8 ]

  85. & O- a" o3 M) b2 o) k3 {+ o8 J
  86. * f4 B4 Y3 s9 c4 @
  87. 9 V% H! H8 X3 q  a  W: a4 E7 ~7 [

  88. . Y; S# C( v/ o
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    " c! ]' ?. ?4 |3 ?% M5 j  {9 i
  90.     .ARM : {
    ( ~7 U, \5 g% J, j
  91.     __exidx_start = .;
    ; o9 I0 T5 {# |  N8 }) G0 B3 x
  92.       *(.ARM.exidx*). D( Y; k1 o" @5 `
  93.       __exidx_end = .;
    % v0 E6 o* {0 c5 N, S" h, i
  94.     } >FLASH2 E- }& Q- s9 R) e$ {1 F
  95. 6 _) z) A4 m" l1 v6 Q# ~
  96. ; U/ \3 _" ^8 V/ M. d: G; Y
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH) K" Z( _. P  t
  98. " `+ q0 T" c  h1 }4 S1 x& f  M! I
  99. # N) ^2 L3 C: A: p: H# [* Q! I
  100.   .preinit_array     :8 t, O' B7 H5 T* U( Q
  101.   {( J0 v& H8 @; u+ ]7 Y
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    + c! _! R' A* @! p! O8 g1 {
  103.     KEEP (*(.preinit_array*))( ]- f. U' X+ }7 }4 t  \3 F
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);& Q7 A- Q% K5 V1 M, d  e
  105.   } >FLASH
    5 o8 m7 i2 w1 d
  106.   .init_array :
    6 @. W6 ?( G* W1 ]
  107.   {
    ) |$ T; t$ L$ i6 @7 J* F
  108.     PROVIDE_HIDDEN (__init_array_start = .);" s1 B" L$ x. R# T# i, _1 W
  109.     KEEP (*(SORT(.init_array.*)))
    . [5 X8 i# |! ?$ ^: Z; d
  110.     KEEP (*(.init_array*))( \$ y9 c  `( J3 ^) e( R
  111.     PROVIDE_HIDDEN (__init_array_end = .);6 E. \; ?- ]* x+ X. M( R; _3 i! c
  112.   } >FLASH' C- z) F8 N) x, y) {
  113.   .fini_array :; e, N. Y/ z7 _: Q( o
  114.   {* `" \5 r/ K$ B. J9 M, F
  115.     PROVIDE_HIDDEN (__fini_array_start = .);6 d/ v" F6 j; Q' }
  116.     KEEP (*(.fini_array*))
    * \! y' _# Q& k: n0 j
  117.     KEEP (*(SORT(.fini_array.*)))
    * V$ T0 O/ K- S5 L
  118.     PROVIDE_HIDDEN (__fini_array_end = .);
    ' ]2 ?* G$ K5 ]
  119.   } >FLASH
    * I( t% r5 h! l

  120. ' N4 H2 J0 i5 p2 C' c1 H9 n" i; y( q

  121. 9 D) a( {. L) @/ F- B, D" {2 {
  122.   /* used by the startup to initialize data */% y0 I8 K$ j' n/ W( E7 s
  123.   _sidata = .;* |' b9 c, ?7 n9 |0 U/ ]

  124. ! h5 X2 T; y1 v3 J3 v( V+ W: y

  125. ' O+ k7 E& v6 Y
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */, J# P" X& F, P- W9 X' F+ O
  127.   .data : AT ( _sidata )
    . |9 o7 W* i$ ~* E% Y9 a: Q! G# j/ {
  128.   {" W, l( a3 s; u* V+ }7 C: v
  129.     . = ALIGN(4);( ]8 \: g3 J% R. z
  130.     _sdata = .;        /* create a global symbol at data start */
    , ?( m0 n& `+ Y' b& W
  131.     *(.data)           /* .data sections */5 i6 b0 \; p- c* ~0 c( u3 P
  132.     *(.data*)          /* .data* sections */+ x; `( ^0 y# o/ k- K' r, }

  133. 1 W% Q. e3 `$ z2 U

  134. 3 K1 T6 \4 E: i' m7 M; v6 ^2 K
  135.     . = ALIGN(4);# G/ b7 h9 E7 a' ~0 j/ ?7 `
  136.     _edata = .;        /* define a global symbol at data end */
    : d, Y/ Z6 X) I; C1 N
  137.   } >RAM) e/ j" n* R$ M+ c) h
  138. + b6 H! |, U" D: f7 a4 P7 h5 e, I

  139. ! r6 T) D* t& M& I( f+ B8 ]+ ^
  140.   /* Uninitialized data section */1 x6 \# a& b5 I. N. u$ }
  141.   . = ALIGN(4);: X+ P+ V, H8 O! ^  U/ G
  142.   .bss :
    * z0 v" D* ^$ R: l  Y, j! ^
  143.   {
    3 S4 x0 v0 \3 A5 L' u1 J
  144.     /* This is used by the startup in order to initialize the .bss secion */3 b5 \& b2 P* N" k
  145.     _sbss = .;         /* define a global symbol at bss start */
    0 R8 U0 \' g, L9 i4 d9 T: m
  146.     __bss_start__ = _sbss;
    % X, H' E( c2 _+ u! A2 Q1 g  G
  147.     *(.bss)& C, B) S& F; J$ r
  148.     *(.bss*)
    ' E) f! L' _8 O8 J' h7 E/ b) k
  149.     *(COMMON)# k' |+ |+ W( W" L  X% @1 _3 A

  150. % d% w' P: x! O/ w: q) F
  151. 0 a0 I! A6 ~- v: V
  152.     . = ALIGN(4);
      _" S" m' M* G) v& V* d/ l
  153.     _ebss = .;         /* define a global symbol at bss end */& _6 `; L# {$ l9 s4 h4 t6 \
  154.     __bss_end__ = _ebss;3 y$ l* o- n1 M- R4 S+ T: g% J
  155.   } >RAM
    / {* ?# F7 F- M" S: \$ e0 f
  156. , f, E/ I) F$ ]3 s7 x3 v# ?

  157. & ]" K, ?0 @4 A1 H
  158.   PROVIDE ( end = _ebss );" \0 Z& D6 l/ }1 R) d, Z' q( s0 N
  159.   PROVIDE ( _end = _ebss );; f# M: E9 ?+ M) H, `7 g
  160. 9 I, _) Q, s  s2 r6 v
  161. 3 f( v$ @0 ?/ t" |3 \" L& t
  162.   /* User_heap_stack section, used to check that there is enough RAM left */. U, l1 z2 q! \
  163.   ._user_heap_stack :+ j4 `/ y6 T: X% U' \' j; b! g
  164.   {0 @8 F1 a& u2 |' e4 z
  165.     . = ALIGN(4);& ~. s% P/ E3 y7 }
  166.     . = . + _Min_Heap_Size;; V# K5 R& N5 ~4 f4 Q4 S3 \2 K# i
  167.     . = . + _Min_Stack_Size;( f# E# `" F5 w4 R" x+ X4 n1 o! D
  168.     . = ALIGN(4);
    7 D7 l% R7 e" [1 ~6 v7 N% y
  169.   } >RAM
    ; U8 e8 ?7 o  L- {+ s# l- Z

  170. : i/ }; x! L$ V. ^
  171. 1 @+ S* z7 o: i: _& Z1 n# }6 A9 U  Z5 }
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */
    ) P5 c: y2 i. p0 J6 T; @
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
    - X/ ^* R+ h& L3 p
  174.   .memory_b1_text :
    4 E% S  S; p0 f1 _5 v
  175.   {
    7 j, M  t% l  k5 K
  176.     *(.mb1text)        /* .mb1text sections (code) */
    + y$ z7 [; Q! u+ [, s
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */6 j+ H( g6 q8 f, ^1 {: R
  178.     *(.mb1rodata)      /* read-only data (constants) */
    : E" g2 Y' c5 T% G2 q
  179.     *(.mb1rodata*)- C1 F. h$ q! q; l* z  |
  180.   } >MEMORY_B1
    4 J  g9 N: j& V4 W& m) n6 v

  181. , C* \' z9 [0 \

  182. , ~% n( K7 S  L; P6 K
  183.   /* Remove information from the standard libraries */, A1 m, e2 m! m! O+ F
  184.   /DISCARD/ :
    ! H; x: @8 F# l* `
  185.   {
    ! c% p7 g- Y" R2 x- y
  186.     libc.a ( * )
    $ [: w+ s0 G5 A6 C# q
  187.     libm.a ( * )/ E% V/ V& ^. E" N6 C( X" A
  188.     libgcc.a ( * )
      j- b" n  r2 A: F0 _4 ?4 u
  189.   }0 A$ T7 T, c" c
  190. }
复制代码

1 ~$ d6 O& }& N: K4 Q! I9 q, t
  • 最终目录文件如下
    ; I' W1 O5 r+ D9 `' `" P
/ z- N5 \, ]. `( ^4 I" U. u0 T
微信图片_20240615160620.png
* A: }) J3 O2 r" N4 f+ ^

" ]9 y2 ^; Y0 Q5 r0 w+ v% f5 P2.在EIDE中使用标准库时的设置(无Makefile)* D, |" O& j- E
a.切换到EIDE环境下; P# P5 d8 P/ b5 f# Z  Y

+ X2 f5 B- _' @9 x" h6 [. t
微信图片_20240615160623.png 4 {% _3 G/ Q2 B* l" A/ d8 m" |

) x8 f0 j. i  I; @! b 微信图片_20240615160627.png ' J; f' g3 [) g& L: ^2 h
3 ?5 T" s1 w, h6 j) M
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
, s- y# y$ m/ N% `  l1 U% B0 Y- z+ I  u+ q" M/ w6 Z
微信图片_20240615160629.png * {( ]0 \: m! V$ Y0 w
- }* N2 v/ ^. B' _
微信图片_20240615160632.png
( H4 e3 Z- C7 k, j/ m3 c" _/ Q) F% j, Q
微信图片_20240615160635.png ) T- k1 o( Z1 K! C. V: a0 {

: E) ^) [. k% E* P8 k+ H, [8 R, W文件目录如下:
+ ?, W( o7 r# K8 e$ B! R
! y+ n4 R. D% u8 d' a
微信图片_20240615160638.png
( i( {/ A8 v  Q( A1 Z
3 J' Q; ^8 ^/ u- X) i7 ~c.点击+号安装CMSIS芯片支持包2 l! p( V% s+ ?* H

; a. O% }: d$ T" U
微信图片_20240615160641.png 9 d" u. J- s: {

: B1 g( v& n; k. A( R8 c3 @, [7 e( ~ 微信图片_20240615160652.png 2 k5 c1 J, q. A" \
2 E. P. u& g, l* f. H( X
微信图片_20240615160656.png 6 t8 V  F- c0 j' {5 M9 V
, O1 x% a% ]* n. E
d.修改构建配置为gcc3 W0 v6 F. |) e; {* ?4 t
+ z4 p  s( P$ Z' g3 E" [% t9 ]1 o( N
微信图片_20240615160659.png 6 c9 z4 K5 I3 S# L3 A7 w% @
2 h  n4 k: _* n) ~& ~
e.烧录配置为STLink/OpenOCD' t. X, k( i' N% g: S

- n5 g8 g' b5 P  H( n' F$ Z
微信图片_20240615160704.png
7 V! B$ E9 }! i- _) q- E9 ^
/ f% z  B, R# If.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。! p- {* U; K+ \0 V" ?
2 p. \& }: O' @3 K% u. |2 w
微信图片_20240615160707.png - y$ l; h  r) f2 L( h1 ]

4 K+ D1 [' J8 b9 Ag.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义* ?$ R5 t8 J  g8 T9 M
! A' S4 O6 S) Z9 M7 s4 N6 T
微信图片_20240615160710.png
  ]2 |( y9 r# g) Z- e/ X  {  W, y
h.此时编译可能会有下述报错, O2 Z8 i7 z9 i5 M" x$ b
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    ) W9 u! f3 Y# j% B6 i
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码
8 p: _9 z: k+ Z

5 S$ p1 Z, ]" v% P
- F# l7 {/ _" A, P# v8 A( T2 d
打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)0 |( D- {* h: O
  2. {
    6 g& ^) [4 q3 \- Q; K2 h
  3.    uint32_t result=0;
    4 R9 M/ [& K( [/ g- ]  n3 h- Q; J

  4. 0 |0 A/ L. p% R( o2 S% V, q
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    8 C6 S0 \3 d1 Q
  6.    return(result);6 u/ X8 y' n" {  T/ F
  7. }6 g2 ^$ K/ f& ]9 a9 O# M

  8. % T8 c4 T' T9 y
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)! s9 M  p3 O! {$ P/ F. Q
  10. {
    $ a2 f7 W' A7 l
  11.    uint32_t result=0;
    , f5 X  I& Q4 f* a- Q; o! I

  12. 7 C/ T3 S7 P$ F2 o/ F8 j- z% p
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    5 P" O' Q# _! O& L3 n5 Z
  14.    return(result);
    " z1 R2 C6 |  K8 h$ k% H
  15. }
复制代码
1 o0 @* D  ]- j  c$ b& g
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    : s; o: f8 S' `; \0 H; O: e6 F
3 P+ d% L6 ~) [) H3 G
微信图片_20240615160713.png 2 V5 s* |2 W. W0 o. [% v$ {+ |& I
  1. {
    6 b1 J! u, u' @0 g. C" R& K6 c+ e
  2.     "configurations": [
    6 ]9 ]5 q. c1 K
  3.         {6 w3 d8 m  t1 h* d+ t% D7 z
  4.             "name": "Win32",. c6 d; `9 x# [& e
  5.             "includePath": [
    2 C" o: H' U' H( N( m; d7 A1 Q$ W
  6.                 "${workspaceFolder}/**",
    8 X7 r8 R' w# _& D) i4 m
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",
    + P1 O8 Z$ D5 Q
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",) v% l* }9 m' s3 l1 @
  9.                 "${workspaceFolder}/CORE"
    ) z7 I* }# K0 u3 A6 E
  10.             ],
    : q: G0 o9 V  t6 K/ N8 S9 l4 l
  11.             "defines": [/ y6 e8 l# ]9 D9 U9 t# [' c
  12.                 "_DEBUG",
    % u) L/ H6 i8 U5 w: i2 ]9 r0 \
  13.                 "UNICODE",
    * L& `) X% _( I  H  u' y( l! K6 Y
  14.                 "_UNICODE",
    6 o+ t# e+ M- f# A; i
  15.                 "STM32F10X_MD",
    / t1 ?$ Z! A/ N6 o
  16.                 "USE_STDPERIPH_DRIVER",/ e* D* f* w! @
  17.                 "__CC_ARM"$ g, Z! X6 [  b9 V  k/ O) T5 n" _
  18.             ],
    # \; b. j" [3 z+ P/ q& c8 U0 F
  19.             "cStandard": "c99"8 h+ `5 }/ x' Y9 A' i
  20.         }
    4 a& t9 R6 F( b, M- V. v% w
  21.     ],
    " i( ^" @4 x& H( m5 G) B1 ~
  22.     "version": 4
    / G- R3 a8 D' X* u0 I3 V

  23. * d9 l  Y; T/ Z7 ~( N; n% W$ _
复制代码
0 o  J# j) C- M8 i, _' |
3.编译工程
3 {% F+ C8 t' x% q9 j) m" X
$ \& P$ S) L8 V0 |5 o4.一些问题的处理:
& {4 u# N# L& l1 A6 D  t+ b) Z5 Na.编译成功,但下载后没有任何反应。2 k/ q5 P4 b# |8 \  Q8 M
注意检查stm32_flash.ld文件内容$ P( _* a2 w: m, L
  1. /* Highest address of the user mode stack */: I9 I9 X6 D( j6 K; [3 w& t
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

$ I6 x$ ~) ]" x; p* b0 ^% B注意对应芯片型号& `) h2 g0 ?- B4 O
  1. /* Specify the memory areas */
    ' G: }; k0 v: Y* s( @! J
  2. MEMORY" B1 e8 x- r6 Z4 G  K+ l- v
  3. {7 I2 i0 G' R% H" ]2 x
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    3 S, y4 Q* G/ Y* H! o
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K" [# N- n$ ]5 U: w; `
  6. }
复制代码

& X  O3 y% ]) E/ j0 lb.vscode提交(commit)代码时卡住0 U; F- Y  {& L- d* u* m+ |
+ S- k3 k. t6 X& d6 F
微信图片_20240615160715.png
6 x; Q: }: [: K  k1 F2 A" R
3 n6 B% M$ I0 z1 }9 W 微信图片_20240615160718.png 8 w% U% C1 D3 q
& A: G* ?3 r' G. W; `, D
微信图片_20240615160722.png
3 Z( W. K& s* n- u' `! w
, l) i' k& M) Y# W! f设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。  y9 m7 s  @& Z. x& E8 A# L

/ X: Y2 o; Y/ jc.结束
& @( O) \) T* f. b; i7 k0 v, h4 ?

6 R- ?0 Z8 ]- Y( }4 s* \5 U0 z5.调试工程
" U, x5 E* v' ]* I! d# V; `/ q3 Z& na.添加launch.json$ j: U4 B3 }& A/ s5 j
进入一个C文件,点击右上角按钮生成launch.json
( M3 m; P0 R4 K8 b; q; R2 g. L  K3 \2 {! l( G1 n) z: k3 {5 @: P$ I
微信图片_20240615160726.png . e3 I) h0 K  Z7 M3 G
& Y2 p, i8 p" L0 S8 R1 A/ ^
b.修改launch.json为下述内容
& Y3 [7 L% a) p2 c3 K, u2 s
  1. {
    2 m3 \& k2 D+ A& ?( f& i. D
  2.     // 使用 IntelliSense 了解相关属性。
    3 L! _8 z1 [. |7 a) B7 o
  3.     // 悬停以查看现有属性的描述。
    $ a1 q8 K, d( ~1 k
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387% x5 t0 x" `6 o8 Z  P  m
  5.     "version": "0.2.0",3 z0 F' {: H1 r3 i  s! O
  6.     "configurations": [; j* H' b4 y% I/ u
  7.         {
    5 e; S# T2 @6 _% u
  8.             "name": "Cortex Debug",
    * t" g2 \2 A# \8 N% P: I
  9.             "cwd": "${workspaceRoot}",  // 输出路径' M$ d! A# ^" n' j- w; w
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序+ _0 ]+ Z* u/ U: w' l# J& b
  11.             "request": "launch",
    , ~9 y1 k  Q& N' P; J" ]
  12.             "type": "cortex-debug",
    + F9 D' }, u/ J4 w2 m' O
  13.             "servertype": "openocd",    // 调试器选择
    6 D- C1 \/ J5 y! _( A5 y
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
    " k, K" M4 K1 n# h  `; G' d
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    3 ^2 r. X. F' c: |; Q1 c3 C
  16.             "interface": "swd",) i' r% N& J) p8 L1 a9 a
  17.             "configFiles": [
    & p7 z4 Z1 }: ?$ m9 C8 A/ ]
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置2 I8 r7 l) r# c: h: f4 T' G/ _& h
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",2 [8 [9 \2 s; s4 Z* L' Q* b
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"
    2 X; p0 b% y4 Z2 y
  21.             ],: p: B: h' ]$ ~9 D9 S
  22.             "runToEntryPoint": "false",
    . ]1 l* s* t+ o" T1 c
  23.             //"runToMain": false,
    ' m7 T8 I3 c9 b' ~; F" X+ U
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    6 r% c# I2 K/ S1 \
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径3 K: C. E! {) }# ^# B8 k+ a, z
  26.         }/ s8 `$ h9 }/ e& l1 D

  27. & o$ L5 \, p. L! }* \2 Q& e- e
  28. }
复制代码
8 d- H' {" D; j0 z8 \: G' T0 ]
上述最重要的是引入openocd的路径。# g1 P6 n* z  ?( ^3 h  n
& ]7 i, d% K2 t3 M2 Z
; r5 `; {; B5 N
c.点击播放按钮进行调试
0 j/ N8 i( b! H5 I6 \: f  T- n0 f4 _' `$ ~* R* y/ O
微信图片_20240615160729.png 3 o2 m: p5 `/ Z0 a" o0 K
5 {9 B( l* S( z8 i" O0 I- l
6.结束
( x. f; \% m3 ~# w. Z% \' @
: x% g# B& G% i: D* u$ O. U$ e3 f  ]! d% e9 N8 G2 |! ?
$ C  s7 j! x2 H( }3 V# L; \0 U
转载自: kevin5 u! U8 L) b+ X) E8 Y- w
如有侵权请联系删除
9 F+ U1 l5 e4 b- b: M+ f
1 p2 h* F, z1 m( P2 @8 H3 i
/ j; @/ ~7 [' J) ^" {, S
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版