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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”2 E$ K' y( }7 h  S6 ]2 r

; ?& }2 u' {9 K. ~; o! T
微信图片_20240615160241.png . R# _0 f' \) N  D' M" G
, k$ E, y/ F1 C
1.VSCode安装与配置
( X/ H; S5 Y7 P; }/ A0 w: ca.卸载
; r# X* L3 L) m2 t0 ]# d4 j) _b.安装
5 N! s3 ]7 @  U) D% G; m) D8 Wc.git安装与配置  S. ]4 N! z( j5 X: @" R& u
d.安装插件
- R5 o' e4 }& }' }$ Y, b2 C% j$ J; [0 Q7 a; g- k+ N- C
8 I: \! X3 g& F' V' T4 x
2.Embedded IDE配置
* y& [1 C- R5 \" m8 m. H/ wa.安装EIDE插件' ?. d7 |% r% E5 z$ p# a" \" _
b.安装实用工具到EIDE4 W1 u9 ^8 l$ _; `
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools" Z; W; W0 ]  `3 C9 N$ m
3.Embedded IDE项目建立-stm32标准库3 a. M+ Y; H4 G: K1 i3 e
a.工程项目建立
  H% {3 M5 \" _3 |b.在EIDE中使用标准库时的设置(无Makefile)
1 x0 D: M6 G: p4 _c.编译工程
0 ~( i# o; _" e+ P; h
/ E/ ~6 m7 ?7 _8 G
4.一些问题的处理:
4 K. V' {, E1 V  S, ~6 n" p5.调试工程
  |# N( p, u# o) s: @& _3 `" o& ?+ N2 s" u& }
01VSCode安装与配置
# g* u5 u4 A+ Y0 N' y1.完全卸载之前安装过的VSCode
: e7 m  r: ]) _1 s' b3 Ja.卸载软件
" ]9 b. T* f  p0 ?- }b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。
0 p+ C8 L( V/ z+ z& F  }c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。9 n( Q) w& a$ a& v- D3 H8 \: ~
: n" e- K" y! N5 h; x5 C1 \
2.下载安装vscode9 o  t2 F3 S  k6 E( i3 H1 L7 M

4 e& L* ^- Z3 B. |
3.git安装与配置% T7 U0 o5 \6 d
安装git7 u0 I  J. Z) Y4 N' C- ?
1 G' }2 \, J& ]4 P- L
微信图片_20240615160248.png - m& z9 c' ]& S1 \. r

9 z: u/ N9 R* Q安装完成后,在开始菜单中找到并打开Git Bash% B/ Q9 L7 [0 G/ ?; Y
$ O6 e1 s2 h) h/ S' B9 F9 W+ ?
微信图片_20240615160250.png   Z* E; M: R. o
' N7 N, [" ~$ @- h) p9 m/ x
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git! ?* r! w) r" T; M
* W! J8 f! [1 ~4 w, D& k" h
微信图片_20240615160253.png
; p% V4 S, [2 v
0 H  p# `7 n' K6 W1 @: n
在git bash中输入配置
  1. git config --global user.name 'kevin.kerry' % x$ G) }" Q; @4 J( M
  2. git config --global user.email 'ct15762287606@outlook.com'
    / G5 l. h8 H8 I# q
  3. //检查当前仓库状态: X4 t) u/ G, t- I
  4. git status! [' e. x2 X" D9 m" m
  5. //确认git配置
    3 @) q; b0 ~( x+ g5 t
  6. git config user.name
    / y7 r2 Z# R5 o, C9 P  y4 L5 G
  7. git config user.email4 R) Y% M" b0 d5 R1 Y
  8. //查看错误信息; M7 ~2 f3 h6 Z* B# [- f
  9. git commit -v
    8 L5 O) z& E5 T
  10. //清理缓存
    0 Y* S* @6 [) ]+ E. c
  11. git rm -r --cached ., e# _7 N/ i; c+ a7 W% `7 R% ~- `4 ^
  12. git add .4 |0 ~1 ~6 V+ Z$ `) i& D
  13. git commit -m "Your commit message"
复制代码
$ p! I0 p, I4 H5 A/ t
微信图片_20240615160255.png * v# M+ u9 {) f, @% R5 _! W1 q
! i4 O8 C6 O7 j
4.安装插件,如下图:
) K( C4 R6 b: ]& m+ a* O3 ~  G4 U9 t$ e, |
微信图片_20240615160258.jpg . i) X; ^9 K" ]# Z/ w7 C! B

- k: u! p2 U2 C( `7 R2 M
微信图片_20240615160301.png 3 i( {$ }# L0 b3 J, s, g' {; T9 a' g. ^

( |: q, {  {) f- d9 r; v) E
微信图片_20240615160303.png / O4 @3 R5 A3 n! `5 y0 A$ k! u  n% n; I
( M5 w+ H! F4 @, ~$ U
微信图片_20240615160306.png + a1 c$ C# \$ H- J

' t5 ~  ~& E6 L# i4 o 微信图片_20240615160309.png & |$ B# b) a! A# t1 ]

7 z2 d2 A: j7 ]2 ~: I) X 微信图片_20240615160312.png ( ^- p! @9 \& s
( C& x  w$ ^! w+ p7 U  q- f" ^
微信图片_20240615160317.png
) f6 |0 w8 k" R" R" V9 d  j' i+ }6 G# G. v
微信图片_20240615160320.png
7 L! [% [6 W( b5 ]! Z7 u" v( f5 b8 b: D
微信图片_20240615160322.png ( D0 V, h$ p" D# l9 o( [

  F4 f2 G& o( q% j3 ~6 F 微信图片_20240615160325.png 8 ?) Z( l8 O: v' H# y+ c
# s$ v* S7 i$ i8 _& x1 x
微信图片_20240615160328.png
) d  X& O6 Y9 y  [3 C7 y# j2 `0 m+ O0 p/ i
微信图片_20240615160331.png
& @6 H8 M: ?& T/ ~, q7 w
  e$ z0 ?2 w8 x- n3 b, Z( ^ 微信图片_20240615160334.png
/ d1 R8 b4 S) x; {- k* k$ J7 d& H- j1 _
微信图片_20240615160337.png
$ W. ]$ r; B1 o7 v8 Z7 d5 A' I5 q) t( S
微信图片_20240615160341.png ) }8 K$ C; F" \: ]- v) l

3 `# w" o- ~7 o 微信图片_20240615160344.png ( R5 q1 u: O& q6 a) m" o2 c

2 g$ P* e! O( h' M 微信图片_20240615160347.png
' V. v+ }# a9 L+ H7 i" w2 T# q. e( E2 T- I. V, q. v' Q9 x
微信图片_20240615160349.png ! ]2 R2 P! l, A8 ~

/ W0 B" q; |; I, I& k9 E 微信图片_20240615160404.png
* t2 q" I/ w$ H" z* w
/ i% r& K1 b+ E! {! t0 W7 M( v) Y0 I02Embedded IDE配置
, y$ @0 Y# C' T. g" H1.安装EIDE插件到VS Code
7 w8 g& Z- i! Q9 m  n6 T* @' l2.安装实用工具到EIDE环境$ Q- w9 v5 |$ G6 ~% Q8 ?. B1 N% D$ j
a.安装arm-none-embed-gcc工具链
8 }7 T# h# {7 L. D7 S. `, |
: n+ I$ D9 K6 I
微信图片_20240615160533.png
+ f: y8 u; b9 y4 y3 r
- q9 g7 ^$ O/ B# W  {4 J: Lb.添加其bin文件夹到环境变量( c- f2 m! @6 i
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址2 z! ]8 X9 m, y, [; ^

7 t" t) L, P" q+ f- O: b
微信图片_20240615160536.png
0 C$ Q, h: ]9 d  c6 _* }1 `+ N$ u6 L# I4 P
微信图片_20240615160540.png . q& Q) F# Y7 }$ K, y6 M

7 D  I/ i: D/ e& q/ v# R在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试3 N" D. {/ {5 Y3 b7 ?
2 O) p$ b, {4 D8 s! L9 l
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

0 ^+ |" d" e% S" m3 n9 ac.安装OpenOCD
( @. F/ W/ C+ x2 J1 a9 D8 P$ D  v9 _* r$ i4 j- ~8 t1 r
+ P$ ~) z' A" ^7 j+ e5 g% J
- P8 E+ N  h# `! e: H
d.在vscode中安装Makefile Tools! l6 |5 ]; {$ @7 V/ K; }' C- M

* o" k6 |& i5 j$ ]* @
微信图片_20240615160554.png , b# H; Q1 v) U7 d; }  s

* E3 y0 m( x9 P, |/ R
  • 找到该工具的安装目录- l* v' d# A* b4 ?6 Q
+ r0 s% {, V# n+ c" q* [2 u
微信图片_20240615160557.png + p# O8 v4 \0 x! C
3 O6 {$ \, F$ y" Y5 }" X! P
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常
    / y9 b" n* j. M9 \4 c
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v
      F8 U8 J- c7 H: Z
  2. GNU Make 3.81: ?; Y$ A9 ^$ v4 y6 e& W
  3. Copyright (C) 2006  Free Software Foundation, Inc.
    8 w! _* V0 t* R8 j0 X
  4. This is free software; see the source for copying conditions.7 D; g$ r1 ]8 o8 c  @  J/ N' N
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A6 }9 q1 q5 |; N; Y- Z$ N
  6. PARTICULAR PURPOSE.
    9 U7 x6 |( Z0 c* D; t/ T: e1 Z

  7. ; o% X' j0 x9 A; `
  8. ; r; W" g: f, \$ `$ Z. O, Z2 P
  9. This program built for i686-pc-msys
复制代码
) ]# T/ C" h0 X) ~: a  s" B
03Embedded IDE项目建立-stm32标准库! J2 W! f+ w' ^2 h6 P. M6 ~" Z
1.工程项目建立+ M% |6 a1 t5 ]0 x8 p; _8 q
a.切换到EIDE环境,点击操作-新建项目-空项目图片
% i6 b( o4 h1 ]0 b' H0 u% \) P/ C' s+ l! x$ a3 P
微信图片_20240615160602.png ! _0 j; v$ `. h1 k  _" x" _- ?" H

1 B5 O3 m- c) h- ~+ z$ |b.选择一个合适的MCU项目类型,如Cortex-M项目; z% M" K% _1 F$ A  T

8 {' O8 C# ^, m8 K+ z8 c  _/ {( G
微信图片_20240615160605.png
% U" C8 u$ z7 U  v" X
( v& z  z- ?* v( l: X( p% _1 Uc.点击右下角继续,跳转到工作区) i: `7 `! K2 @1 N
$ T+ m( j* J, a; h: E+ S9 U  ^
微信图片_20240615160608.png 9 }7 g5 ^+ p$ R2 b1 t) `( O3 u, t5 I
+ l* {, t) U1 l6 S4 a) S4 v
d.添加工程文件到工作区路径下。——标准库
% W$ x- g! i2 A8 O; S8 o
& N' h" ?0 m( I' E5 q. N1 X9 ?: A) p' B4 }! D' }) W
微信图片_20240615160612.png
' J7 b2 {  ^) n) z% P4 ~. b  V8 ~% y
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。0 Z. u# x9 c( J# R# Y

: y8 P/ g# d5 x% ~/ v/ t) _
  • 新建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文件。
    , p9 {7 r: E" @7 _

5 [2 @$ @% R0 d2 y$ k
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件, o% S/ c; Z' N6 f

8 ]* l" F! Z0 K& b* X( o: b2 k6 W" z6 G/ w1 ^! e7 m

6 e1 h+ k  h  A' T( a
微信图片_20240615160615.png
  g* R" ]0 U; m: Y: I
' y, ^  }. o" M+ [/ g
stm32_flash.ld
4 Y) u: W2 y7 a8 ^  w$ y" n& q
  1. /*
    % c* g. O$ B  z: d
  2. *****************************************************************************! R; U  d. Y7 W+ Y  @$ ?2 N
  3. **
    $ K* h. V7 \  y
  4. **  File        : stm32_flash.ld
    : y6 V6 M2 N/ ]2 R  ~
  5. **
    $ n  h1 |, f# p* _
  6. **  Abstract    : Linker script for STM32F107VC Device with( D# @1 k( S5 ]; G9 x5 @* ^
  7. **                256KByte FLASH, 64KByte RAM* s6 K- a. m$ a: j3 \+ d+ a/ M
  8. **
    0 V$ n: |8 L7 q
  9. **                Set heap size, stack size and stack location according
    % _1 x9 Y0 K, {6 [
  10. **                to application requirements.
    4 ], Y. W% A2 s2 W
  11. **
    ; E& x. G* f$ a% m% Q
  12. **                Set memory bank area and size if external memory is used.
    - q& o: e9 ?. i
  13. **
    0 v6 e; p: L9 z" ]
  14. **  Target      : STMicroelectronics STM32" t: i9 N0 B1 E3 I. T% r! j
  15. **% ~5 T; Y- i, c
  16. **  Environment : Atollic TrueSTUDIO(R), j0 Z/ o' I. ]( g) M- `1 g* A
  17. **
    . L2 P- _5 q! W) [( |
  18. **  Distribution: The file is distributed �as is,� without any warranty
    0 v; z3 ]( @! j; {7 {, ~! l
  19. **                of any kind.( x2 y5 ^+ j4 c' B
  20. **
    1 i! c/ r3 m. ~/ l! P0 K! z
  21. **  (c)Copyright Atollic AB.
    : j( j4 ~, }: @! m
  22. **  You may use this file as-is or modify it according to the needs of your
    ) `( x, s5 C& F4 {; {
  23. **  project. Distribution of this file (unmodified or modified) is not# V9 M% \0 x' f1 M
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the) z* a/ |& Z1 u& p) {; E6 \$ e, X+ E' Q
  25. **  rights to distribute the assembled, compiled & linked contents of this
    4 Z) t) I, v* p4 G
  26. **  file as part of an application binary file, provided that it is built' A2 ]' _/ p' D2 C8 {: `* y- Q* i
  27. **  using the Atollic TrueSTUDIO(R) toolchain.
    & X9 A0 W! G; {( K
  28. **
    * }6 X4 J/ x- f8 h5 `2 }
  29. *****************************************************************************9 y! P( Y" z6 G' m( w0 p! X
  30. */9 H* Z- R+ {, A0 C
  31. # s/ Y% m' D# D& x8 m; V

  32. # L3 E3 a. w. U2 g
  33. /* Entry Point */3 e5 |# J% V8 Y. |4 F0 o3 O: s: p3 D
  34. ENTRY(Reset_Handler)4 }, [; O( y7 D' K

  35. . s8 y4 ^* B) X4 y" G

  36. / J- r; G5 O: h9 J5 Y
  37. /* Highest address of the user mode stack */& j: P! {6 M: i% @+ P1 ~
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */. D1 T; N0 C: @8 L

  39. 4 j6 |4 H" Z: T8 O

  40. 2 J3 P; @. v+ g' ~* R
  41. /* Generate a link error if heap and stack don't fit into RAM */3 ?" q5 p+ E8 n
  42. _Min_Heap_Size = 0;      /* required amount of heap  */1 s, Y$ n4 D7 F7 o# O
  43. _Min_Stack_Size = 0x200; /* required amount of stack */% h* Z4 r) {* A& q" V
  44. 4 X- _: `: v3 b) B

  45. 5 v( H# e% R( H. K+ y" J! _  \2 y
  46. /* Specify the memory areas */
    0 c. ^- G+ L$ [4 p- S& Q
  47. MEMORY8 |0 L% q7 Y2 w/ ?* ~6 W! U7 x) o  O
  48. {
    , m; O* u7 d- j' G6 L' U
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K" x4 B* D) T. ~$ @3 K
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    5 M1 J7 @+ r7 L- ]. O$ p$ \; I2 i
  51. }
    6 t8 a1 D& c4 a0 b1 L: J7 O
  52. 5 \$ {# P. U. p$ q2 @

  53. ! e; ^! _. p) G# p" L/ M
  54. /* Define output sections */! C, \  \" l% B* Z, D( m* u
  55. SECTIONS1 Q1 N' [8 l3 V8 y
  56. {- ]6 X! y" V/ ^( \. V
  57.   /* The startup code goes first into FLASH */1 q6 y, }% j0 t, `2 {: k
  58.   .isr_vector :5 c" }2 `4 j( r0 W
  59.   {' A4 x9 J, C1 c# \0 b0 J- C( x
  60.     . = ALIGN(4);
    8 h4 i! K0 k5 ~/ J& t
  61.     KEEP(*(.isr_vector)) /* Startup code */* p( U2 T$ [+ v% [/ w& x& t
  62.     . = ALIGN(4);
    1 A: A1 t9 }  t( K6 X6 W+ t
  63.   } >FLASH4 k* N5 w7 |$ ?

  64. ; n+ p) `6 p- T/ E+ `( D/ e* ]
  65. * ^: ]1 N6 f: w' r9 ^+ v, \
  66.   /* The program code and other data goes into FLASH */
    7 p9 J( l* _: C, C
  67.   .text :
    ' a  {# P- D% E, ^' R
  68.   {% Q* `( T1 t* D+ h" `" a
  69.     . = ALIGN(4);
    : E* r  e7 ?4 F. Q
  70.     *(.text)           /* .text sections (code) */. A& d  O9 s6 K" }4 x
  71.     *(.text*)          /* .text* sections (code) */
    9 U. w- ~7 X! u8 p+ Z; J
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */3 [' `2 T9 C- w* l. Y, |- d- }
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */" o7 d8 g1 S. j; D1 ~
  74.     *(.glue_7)         /* glue arm to thumb code */: G$ p) `) E3 }4 E( l- B: p
  75.     *(.glue_7t)        /* glue thumb to arm code *// n' @1 b* B) d3 Y( G( }  O

  76. * H) Y9 l4 c# h+ a
  77. 3 ]: R9 Z1 U# L! F3 a5 c1 P
  78.     KEEP (*(.init))
    6 r* s5 H6 y6 _; ^- O
  79.     KEEP (*(.fini))
    % y) G) k+ {7 ^
  80. 0 V5 ~# v. ]. z- A8 \) D5 I
  81. ' m' P$ M) R$ y9 }4 o' }( x  k
  82.     . = ALIGN(4);' j5 u5 z7 e; w. g7 U9 \8 K/ i5 v
  83.     _etext = .;        /* define a global symbols at end of code */
    ( e0 y5 y/ I2 i8 ]) S; I6 ^* O
  84.   } >FLASH9 U3 \5 n0 \; k+ D1 D
  85. 0 u" Q0 ^* @/ I3 `' m+ |: n& p
  86. 3 x1 A8 n& Q$ i3 `5 A( l6 x0 @

  87. ; T6 ?! V! m% t3 {& K# ]0 \. o, T
  88. ( G% j) d2 [; M/ Z; n! f0 \8 a) j
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH( w$ g5 T# u; d# o/ Z
  90.     .ARM : {
    1 m# L/ \1 ]+ {6 j- j7 R3 L0 s
  91.     __exidx_start = .;! s/ C' p/ p: V
  92.       *(.ARM.exidx*)
    ! I9 U! L4 y' e( J8 t, |5 s) K$ @$ A1 H
  93.       __exidx_end = .;
    + J& d* p2 R; i' I5 H# @0 h
  94.     } >FLASH1 q$ e  F5 Z+ ^. @  q

  95. ) v5 E; e6 W0 J5 I% h

  96. ' N9 r) m, \7 L$ }
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH
    0 O/ P6 Y5 G3 M7 K
  98. 6 b4 k  e6 `  F3 @

  99. & |: m0 W/ U8 `( D0 }* T0 M, v
  100.   .preinit_array     :* v* c$ f# u% p
  101.   {
    3 c. S+ R4 {  K( @& u  ~8 w: l) A7 ~
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);: R4 W" O) Q8 c
  103.     KEEP (*(.preinit_array*))
    0 ^, N/ H, z, h$ N
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);
    : M: ^4 v6 A$ U6 w( ^& C& v7 E
  105.   } >FLASH
    % n* r! e% ^; q* K4 S7 i, l
  106.   .init_array :2 j' G; g+ w5 i  |- l( q0 _# E
  107.   {
    * }( b5 i2 L( p7 H2 d
  108.     PROVIDE_HIDDEN (__init_array_start = .);- u) F$ p9 F% Q9 ^, J2 U4 g3 J+ l9 ?
  109.     KEEP (*(SORT(.init_array.*)))
    / W9 P, H, L# H$ ^0 M
  110.     KEEP (*(.init_array*))$ @; M/ `& o# T- n0 S
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    7 F( L. B2 H# Z$ d9 p
  112.   } >FLASH
    & _( a6 O# t7 N! D  ]
  113.   .fini_array :, y8 c+ S, [2 f' _( b
  114.   {
    / G1 y4 Q# G* A" F8 t
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
    - J. B) M$ O' U0 N* j% d
  116.     KEEP (*(.fini_array*))
    $ G" r& }6 P$ q. ^9 \/ G* d
  117.     KEEP (*(SORT(.fini_array.*)))
    4 A  p" ^& ^) l
  118.     PROVIDE_HIDDEN (__fini_array_end = .);# C5 k$ r5 N' k7 I
  119.   } >FLASH& Q+ g( T2 S2 k  r
  120. ; I% O  Y; q1 q9 K4 t
  121. ( P* R6 D" k' ?7 U
  122.   /* used by the startup to initialize data */9 O% b% n/ r  k% B
  123.   _sidata = .;
    / A6 H. Z% i7 D0 B- {

  124. 7 Q9 X. v* i; p- c; F& A

  125. 0 K( M" M. H' m- x* T
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */1 H- {- y! p: P' H& W, q2 Q
  127.   .data : AT ( _sidata )! }8 o9 ]/ Q9 U( ~0 i- x
  128.   {% y; m: b! ]0 l9 y1 c
  129.     . = ALIGN(4);! m. \% I  j: ~; T
  130.     _sdata = .;        /* create a global symbol at data start */
    3 b6 j# F& T$ y) H0 Q4 [' q
  131.     *(.data)           /* .data sections */& x# Q! f( Y* S' C% @/ D/ R1 [
  132.     *(.data*)          /* .data* sections */+ {+ g+ U5 x) e* v3 F* [0 k

  133. 9 S. ^, \1 y/ q8 V

  134. ' t- @+ `, l" x. @9 R0 u
  135.     . = ALIGN(4);) X- x# ]4 {. f5 \2 x
  136.     _edata = .;        /* define a global symbol at data end */
    ! Q0 v2 w& H1 @8 u
  137.   } >RAM2 \. H6 ^1 k! i' p  d# X# p) Z
  138. ) _! S  \0 |; }0 `
  139. $ z- \: h; f0 u
  140.   /* Uninitialized data section *// H! q, r& R$ R% ^1 B
  141.   . = ALIGN(4);
    7 ~+ t0 g3 g' R5 ?/ r  W% a
  142.   .bss :
    5 X) j7 ]5 ^6 A1 X( ^
  143.   {# ^8 o' u1 P$ B/ I: _2 O
  144.     /* This is used by the startup in order to initialize the .bss secion */
    . _' M/ [6 k1 V1 _% m8 P
  145.     _sbss = .;         /* define a global symbol at bss start */
    0 O3 Q  _# F% i5 N. c) d
  146.     __bss_start__ = _sbss;: U8 x, y. |. {: k9 \! A3 ^
  147.     *(.bss)
    ( w7 e' b/ K4 ?0 b2 B/ I
  148.     *(.bss*)
    # O+ l( ?" D  N
  149.     *(COMMON)
    ( z8 }. u- O, M6 t3 G! N
  150. 3 s2 r( Q+ K% S3 Y
  151. . z" r$ \1 o6 r6 v; R( J8 W: M
  152.     . = ALIGN(4);: O# w; V: u( P! x  |
  153.     _ebss = .;         /* define a global symbol at bss end */% f" v9 K8 ], t" _
  154.     __bss_end__ = _ebss;
    - ^3 Y) x3 c- }8 K4 u. I4 i% ~
  155.   } >RAM3 `0 V1 }: m6 V; {) F
  156. 4 K. |( e8 s! H  }  c0 {

  157. 4 r9 X/ v$ y5 g% X  V: p
  158.   PROVIDE ( end = _ebss );  x/ U  M$ m9 t3 B1 G- H1 D# K% |* p
  159.   PROVIDE ( _end = _ebss );
    " `" \1 ~. [* x5 a, P

  160. 0 |/ {+ e9 I/ v) S) q

  161. + ^& I- G  b# _, V
  162.   /* User_heap_stack section, used to check that there is enough RAM left */
    7 f* S" w6 e5 z# e+ W8 V$ q' o
  163.   ._user_heap_stack :
    ' f% o: I3 {2 j  g
  164.   {4 y& y  }2 r6 E1 _% ~6 L
  165.     . = ALIGN(4);
    , A: z  ?) w- T# f" [5 U1 x
  166.     . = . + _Min_Heap_Size;- P. L% p7 e5 l0 p0 g3 w
  167.     . = . + _Min_Stack_Size;
    " I: G5 U; `% T5 \
  168.     . = ALIGN(4);/ O+ M0 a6 U3 W
  169.   } >RAM0 I, s5 q0 d6 B) p9 ^
  170. 9 H1 U: Z1 P4 t- P
  171. ) K; a" M: w$ v- i) D0 z$ F
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */- @. f. j6 g/ s% C( j
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */  ]) p- S* _: [& l' ^# _! K
  174.   .memory_b1_text :
    3 I$ A' ]+ p4 Q9 I5 E8 V# w3 M4 g
  175.   {* R3 ~! D  B4 x5 e; {
  176.     *(.mb1text)        /* .mb1text sections (code) */
    - y& Q4 F- {# j
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */+ E& v) B  ]+ p
  178.     *(.mb1rodata)      /* read-only data (constants) */3 |% ]4 k' X; @9 B$ Y2 ~  z( T
  179.     *(.mb1rodata*)! T* I: R) P6 k0 I% D: `/ \
  180.   } >MEMORY_B1
    + C5 `% c* e8 k
  181. 1 ?8 D8 |' R7 U9 V2 y! X. [: r7 y

  182. $ Y0 ^* E! j3 P/ r
  183.   /* Remove information from the standard libraries */  f; s5 t3 |) f( S
  184.   /DISCARD/ :
    ; m3 I, I! P4 n6 c1 ]# H
  185.   {- H+ X5 T, [' s, K
  186.     libc.a ( * )0 ]  ~/ _: g; a- H2 ~" [: Q
  187.     libm.a ( * )- J" Z& W! ~, W# \; Q
  188.     libgcc.a ( * )/ Y# i/ v3 m+ ^+ e
  189.   }
    , s( Y# q: k" h! f% d. f
  190. }
复制代码

& o3 ?. N  Y# Z* o4 N* A6 H
  • 最终目录文件如下4 w2 G: R5 h, u. R

! J2 V' G9 h  ?9 A! ?! E
微信图片_20240615160620.png
- h% B( ^6 `5 f4 }) O6 j, I
6 `9 U" H5 k0 q( A
2.在EIDE中使用标准库时的设置(无Makefile)
/ {* {" W) Z$ G" a8 e; ma.切换到EIDE环境下% w2 Y! w6 B! ~% }
2 m% V" N! S6 z" Z( y7 y$ O7 A( @0 ?
微信图片_20240615160623.png * u) N% K: J6 b% ]

# r" @2 l- V; ^1 e/ i: D 微信图片_20240615160627.png
6 o$ c+ I, `) A" E% u7 J* s

$ w" [$ s; C) u) P4 _b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
% ~/ V1 O& A" R) z* |  C% A9 b) `1 {9 K+ n
微信图片_20240615160629.png 6 U+ {2 Y. Q  U8 }/ R4 l: I. r
: Y1 a' U2 h/ Q% o( @( k
微信图片_20240615160632.png - V9 Q9 P9 `' d( q9 M' q% b4 A0 y* P

/ \+ y+ v# C0 j& `# c: i" e; w3 N 微信图片_20240615160635.png 8 x0 ?" i1 S" [- @/ ], y" a( {

" K( I1 z5 L9 Y3 W  O  ~7 B文件目录如下:6 x6 n2 [5 \: b& I; @  g

% [* t0 J! c' {$ s6 I
微信图片_20240615160638.png : _5 a+ Z: D6 Q* _6 I/ p5 `

. f' |3 r$ _. X& N* o$ V/ Ic.点击+号安装CMSIS芯片支持包
& i8 @$ x- E3 C4 [! ^/ A
+ n( L) m2 Y# e8 L
微信图片_20240615160641.png 2 Y- E4 L5 F% p( D+ p! L+ |
. @# N  l0 g; P2 p
微信图片_20240615160652.png
4 y  v2 W8 j6 h  k  r
2 ^: A4 J' L8 ?: B, X: h: A 微信图片_20240615160656.png
  ?; w; ^& u8 c! J8 l

. g$ u. ?% I& `d.修改构建配置为gcc# W" @$ m: }. I0 j6 T, V

; z2 E& w$ e3 S
微信图片_20240615160659.png & p8 i! N+ d4 d
$ ^; T5 n  K, F) V
e.烧录配置为STLink/OpenOCD. d  n& h" D' I4 P

+ S+ S* h: ]* n/ v
微信图片_20240615160704.png
* z# X  b* Z& B  l( L2 M% N- X8 V: s5 x2 L  h9 ]
f.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。
* p$ @% J) E- }# D1 D# I; L+ L7 \  v4 N) A" X
微信图片_20240615160707.png
0 T8 y- L1 }) z& T6 y5 m5 {5 ^6 `: R. q
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义$ E" \$ S2 h5 T
" b9 r$ z' d( a) A& F7 R* g
微信图片_20240615160710.png
5 U0 l4 q7 h, @- \
3 N+ T7 P* k9 O  Gh.此时编译可能会有下述报错/ f$ x! @3 h% e9 o' M$ o( t
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    9 B* ^% n- l. E
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码
: T+ U- }/ j7 M5 `7 Q2 z8 d1 ]
* e* o. r) g/ c: i+ g

0 r6 R% P& C4 a9 f& x. Q打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr). |, c. k7 ^6 x- |1 X9 S
  2. {
    : B; L) ~- p) \- Q
  3.    uint32_t result=0;2 d9 x. g8 v+ I7 y/ ~2 m* }

  4. 0 {& J7 k5 m: q5 p8 l) e
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    2 R& \: m' i8 P; ?' M0 }- ~% l
  6.    return(result);- ~6 Q: G3 T& C4 @% y0 w9 }: `7 E5 p
  7. }
    1 U& a! R7 i7 e8 |
  8. * P1 `7 }% N5 W# U* d9 b
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)' M* Z- x$ Y2 k  y" _! d. |
  10. {
    7 W9 i! x9 V8 m0 W0 W- i" K
  11.    uint32_t result=0;/ A! V# A% |3 F: @. I% \
  12. + S; X9 S4 X7 v9 n: L
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );  w8 a( W( p& X
  14.    return(result);  B7 y& G' [( @' g  [
  15. }
复制代码

. M7 t) m7 J" X  v$ i
  • ctrl+shift+p,配置c_cpp_properties.json文件图片
    $ R; q( e# ]  _' k7 }/ e5 a
4 A  F* p2 o( e7 K: R
微信图片_20240615160713.png 8 @2 j$ B- `4 n7 E) j
  1. {2 L% M8 C" O9 k3 V; f5 ?" c$ A- n
  2.     "configurations": [* F1 c; b; ^! p9 y
  3.         {/ B1 u- v/ a5 |- v/ w3 P: f3 X
  4.             "name": "Win32",
    / ]' B/ U1 v- Q2 z5 D
  5.             "includePath": [( I* W0 A' F* Z; z
  6.                 "${workspaceFolder}/**",3 I; |- ~. b/ q; {+ g. y5 f8 `6 s
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",
    & n  P  P$ Q5 E9 O; }- J" e. M
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",! l- H; l' m3 o; H2 K
  9.                 "${workspaceFolder}/CORE"' P( S( ]8 b) @& t2 N
  10.             ],
    # a* Q2 d" k, _1 ~
  11.             "defines": [: s2 G# U( ^8 |+ ?
  12.                 "_DEBUG",
    , z6 {* O/ f+ B& r) S! T0 Z% o
  13.                 "UNICODE",: e" I* G( Y3 s
  14.                 "_UNICODE",
    $ P2 t) \; D# E  e8 @
  15.                 "STM32F10X_MD",
    1 y6 k5 K' u; z" J" [
  16.                 "USE_STDPERIPH_DRIVER",. {3 H: ~. E% ]: d
  17.                 "__CC_ARM"3 q& e1 r9 G' K' Y& E+ i
  18.             ],
    ' k  Z, a1 E3 r$ t/ u
  19.             "cStandard": "c99"
    . n1 T! P6 |/ c# b" y+ J2 k
  20.         }
    ! o! E4 ~4 f2 i+ y' ^- P3 G8 C
  21.     ],
    " \0 U: b7 n! _) }1 j/ Z# B: d
  22.     "version": 45 v0 ^, R% W' Z' i& x
  23. 5 ?, o8 |" y2 a
复制代码
! x: j6 H( \( T0 |) D
3.编译工程
3 A" D+ q. {* q( ~3 G
/ |# t0 F' E1 ^( y7 h4 M$ H4.一些问题的处理:5 G: j( k# e, W9 r( A- P7 L7 r
a.编译成功,但下载后没有任何反应。
  I  Z% j& e" ], V2 W7 z* i注意检查stm32_flash.ld文件内容
0 b/ {, V" C! `! Z! a9 _
  1. /* Highest address of the user mode stack */
    ( E: o5 L, ^6 }2 K' N
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码

  r  r0 F2 h( \, N9 o6 f注意对应芯片型号) L3 \+ O( W2 V
  1. /* Specify the memory areas */
    $ U% K+ q  p) x& p% f
  2. MEMORY
    9 E3 w+ x6 c1 {2 y3 g
  3. {0 l3 m- H" u* D! \  N6 s
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K9 K$ L% T1 j! J7 b- ^
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K. u2 c2 x$ k+ [/ \
  6. }
复制代码
% @  Z4 R8 N1 g% |9 k8 _0 ?5 Q
b.vscode提交(commit)代码时卡住% n# I5 O0 y5 A- R+ q2 W5 M0 G
: k! Y" A) a$ A% W& ]
微信图片_20240615160715.png
: C0 a1 u: v. a1 J6 b* [
. b9 ^! D# r, N, L: h: T, Q( ~- ` 微信图片_20240615160718.png " \1 J7 p' |9 d

7 l3 j# x! P5 W% K9 t, b( `/ y$ l# Z 微信图片_20240615160722.png
! z8 ]1 O0 \0 x5 C+ N
+ r" [: n( k/ a- Q9 v7 U* X: o7 l) L设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。) s. m' Z2 ^2 ?+ M5 q$ j

% \! G* c- Q% y+ k9 f* u3 S% a0 [c.结束
/ Q# R" t- J  d# h. u" `/ a- m
$ a4 P: T5 j, @6 |2 t
5.调试工程
* V# h% k2 p- x; g) v  C; Ha.添加launch.json
; O4 v2 f& U! L6 o+ ]5 i- v5 K进入一个C文件,点击右上角按钮生成launch.json$ v1 m- T; V/ G) d6 H7 h7 V2 H

& c2 E! R7 q* b
微信图片_20240615160726.png 2 ~0 G. B. W0 L# B) z, r
5 f4 w: s& _' J# W1 q0 y9 f1 u3 l
b.修改launch.json为下述内容" S% T* @+ O+ ]2 o0 B- j$ U9 t; i
  1. {2 B' R( m5 E. N4 R
  2.     // 使用 IntelliSense 了解相关属性。
    ) |; o- E6 N; {; g
  3.     // 悬停以查看现有属性的描述。
    . R  F0 X) Y( I$ F6 m
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=8303873 c6 |4 p* M: T% ]! Y
  5.     "version": "0.2.0",( Y5 c5 V) K% {" i% e, C" O( J
  6.     "configurations": [# y5 }1 v# {) @
  7.         {
    # o- g7 w; l1 U4 p
  8.             "name": "Cortex Debug",( B% B1 E) |) I- @; O# f. r4 c' d) G
  9.             "cwd": "${workspaceRoot}",  // 输出路径
    7 Z( Q3 v5 W+ E! k
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序# s1 C# l3 @. p6 I
  11.             "request": "launch",
    - o9 [, }- w2 d
  12.             "type": "cortex-debug",; d1 c3 U7 {2 x0 h4 q. J  y
  13.             "servertype": "openocd",    // 调试器选择/ }* s& y' r# ]4 e
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php4 q: I% \7 I4 p6 @/ J# x
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    8 ]6 m0 \. _! B
  16.             "interface": "swd",& T! L' b1 P6 G) D6 }
  17.             "configFiles": [
    4 w, b% Q7 Z/ ?1 f3 y
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    ; q) ^1 |+ Q! a$ e
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",
    5 e! I% s6 t4 d8 Y
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"
    ( j; ?2 V: _- u0 B
  21.             ],
    3 Y; K% K5 Z+ D* _
  22.             "runToEntryPoint": "false",* u4 g' W' ]: W( U
  23.             //"runToMain": false,, y( C" \+ M9 C- P2 l) ]! C
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的
    - F0 q: @5 ?; j8 r* ]; s# M
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径
    3 ^4 v  H" a- {9 S% f$ i
  26.         }& N2 @1 J) ^* g: E2 H1 \+ @

  27. " J1 v3 r- V" S3 Z, ]* G8 U
  28. }
复制代码

2 K' f! c: C8 v+ X  d上述最重要的是引入openocd的路径。1 g. G$ S. N, L) \

& w: F8 R- E9 c$ T5 o/ e

) k$ V( ~0 z" h( A+ f  ~/ D  oc.点击播放按钮进行调试5 o( Z! I: u) V

! y$ P3 z7 {8 K; C
微信图片_20240615160729.png
5 v9 G. J' o5 ]8 o0 Q& F
# g% ]5 p' R3 @! O  K$ H+ E% o
6.结束  N. ?1 @4 |4 v* @- P& a
0 E7 J, }) a) E7 c4 }2 e; u# h

) o; L4 Y/ P% x* Z( y6 M  `
7 `' t% E, K: G& e转载自: kevin- `" ?( k, W5 t7 {7 h
如有侵权请联系删除. }! w. o3 F. {: x$ }- P% I% r
: H; ?0 b3 \; _/ g3 C. x0 f; P

# L9 c1 j9 ~+ J9 R7 n8 g" I) U  W
微信图片_20240615160549.png
赞 收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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