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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”% C4 z- D8 K+ P% G( ]  @' W

+ O9 h8 @1 D, D% J$ }/ {: x2 D7 z
微信图片_20240615160241.png ' O0 n3 C3 t: a& q1 @

) ^6 c  z& g! a; O8 m# C: e2 ^1.VSCode安装与配置, }! ^+ ^6 R) c+ l6 R$ ?
a.卸载$ f& [  Z( V3 @0 z/ M6 U4 u
b.安装( z$ H1 [3 J6 J# ~& {+ {7 ^
c.git安装与配置1 V( F5 K$ U5 {! a. y, K
d.安装插件
! g1 K/ q9 A5 h0 c! T) m: }' }

* I  E! C! u- P! ~/ u9 O2.Embedded IDE配置
; _6 y. b& j+ |, g  n3 F+ p5 ja.安装EIDE插件4 ]$ G8 `2 ~) u; ~7 o7 ]3 h
b.安装实用工具到EIDE
: ^( O  D0 Y$ G# G+ H! H
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools8 ^8 x, q7 k  j
3.Embedded IDE项目建立-stm32标准库
" @% r2 v! l. d7 l% t0 na.工程项目建立
9 ^$ u9 c; F' ~2 ?" I( F2 S+ Kb.在EIDE中使用标准库时的设置(无Makefile)  q, \0 h" T0 M
c.编译工程; N2 S- B3 m5 `/ w9 _
: [& {: b1 b( a+ m, h  Q
4.一些问题的处理:, o1 j5 v& u3 X% A
5.调试工程
+ ~( v) b3 I2 X/ M( q, I3 p# m8 D7 o6 t, R
01VSCode安装与配置- f5 ?: ?% R! R+ X( s% S+ K& e, `: A7 N
1.完全卸载之前安装过的VSCode
! L. _) d' O! a2 h( Ia.卸载软件
: P/ n# R+ d) }b.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。
; M( e; O/ o3 ^) e2 [c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。
. c' y. e% H" ]( D! {8 T9 ^
$ {* |$ ?' W, u+ f! `" X+ t3 k
2.下载安装vscode1 ^+ ]2 f( J5 E/ o' W. W
9 `9 R. o' Y! r- |6 C' k
3.git安装与配置
; U! [  b# t! B安装git8 |: q2 n- X7 B! W  ^

4 f( c7 Y$ T" @5 i& }; Z: u
微信图片_20240615160248.png
" H2 }, v2 s6 A. h/ L3 Q* i% p: @+ p9 l' ?
安装完成后,在开始菜单中找到并打开Git Bash
1 s% j! U3 d# G; I" N
& D0 Q# f6 [0 _6 ^5 U5 F: }/ t
微信图片_20240615160250.png 8 o2 Q( j1 J* _2 j+ L
7 b+ [, d( o0 f4 e2 c
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git+ {; {& P3 g6 z/ @* C4 H- V# X

& h% `' K) a) v+ _- |- v& [, y
微信图片_20240615160253.png
& Z4 t8 b% i' m0 U- l( n

1 X6 R5 s" B* x/ _2 ]在git bash中输入配置
  1. git config --global user.name 'kevin.kerry'
    " `; Y1 X! L* d* n
  2. git config --global user.email 'ct15762287606@outlook.com'
    6 {7 L  x' |. Z3 e' Y, M
  3. //检查当前仓库状态4 m( l% t% o& Q0 Y
  4. git status1 m; ]' J7 Q5 l- a
  5. //确认git配置0 x$ O) x, a( x: R0 A
  6. git config user.name6 F: F7 Y' L3 E9 t9 E
  7. git config user.email* D* H! y: Z' G3 [# U- g" }( }
  8. //查看错误信息
    : E! G1 I5 d* Z+ B  D5 z9 d" m8 w
  9. git commit -v
    # Q5 t9 M, V" o
  10. //清理缓存
      s2 T" Y8 w9 Y; e2 D4 }% a
  11. git rm -r --cached .8 g) A4 V4 Q, C; Q$ M
  12. git add .8 X1 v  p* X+ E7 L6 w7 e
  13. git commit -m "Your commit message"
复制代码

8 S4 u5 C6 o0 ~) l# W+ ?
微信图片_20240615160255.png
' J" |) @' c, R2 }2 |4 {0 @* ^6 Y  [& Z( u0 i8 j
4.安装插件,如下图:( `+ b0 ?9 B, X# H' G
0 H; R! g% b( B* ]
微信图片_20240615160258.jpg
& V9 a# B; }2 b2 C% E1 N9 G  e- \8 _
微信图片_20240615160301.png " Z  y* B  j; {' t# g4 `6 n
' s# V, U# X1 ]- _' g' z
微信图片_20240615160303.png
$ B2 Z8 Y, [( w6 {8 R5 Q( L/ d; C* k4 b5 O4 r7 n# w, f
微信图片_20240615160306.png
! d' u' R9 n& g. X: K2 }9 ?
  v& l: _( M5 B" }+ y 微信图片_20240615160309.png
$ A( b4 v8 S' K* F5 F+ s7 \% Z
. s( g& I3 F- r( p" F! [ 微信图片_20240615160312.png 2 I) }8 e3 T  ]% J, S  Q

7 H- T9 ]. R! r 微信图片_20240615160317.png
' m: v2 t; g& a6 a* x9 i+ V( L5 r7 Y5 w
微信图片_20240615160320.png
3 _0 c# T9 b. P$ F' }
; \+ H7 @4 B4 Y) F1 W, N" M 微信图片_20240615160322.png
- A/ q% N/ u/ {/ O' j  B
! U# k+ F0 r4 ]/ \' w7 { 微信图片_20240615160325.png , |# u7 L% K% M( u
* L6 v" [6 J2 V; W; ^) l
微信图片_20240615160328.png ! z1 S3 u) O+ x5 ]; n

# R, v  v% o6 l5 t- }! j% p) r3 H 微信图片_20240615160331.png 7 l( {6 H. _3 G
6 F/ t* g- ~! {& ?) C, |
微信图片_20240615160334.png
0 K2 l2 E: q- W3 A- g0 [! J' v, h) Y. H, r  J
微信图片_20240615160337.png
) A* Q2 L0 _- X  p. F4 X9 }1 e) v& V$ B1 ]3 k
微信图片_20240615160341.png
% Y- F1 P* }2 U) q" B) y5 S7 g2 _
! Q. T  _! E" d  s8 ? 微信图片_20240615160344.png
+ G" \# G0 ^0 l; K- l$ h9 q- n: M3 e. v1 y
微信图片_20240615160347.png " X! A) o" {6 A  i& ~, n

: Z; n' `( M9 w8 _9 |9 W( C 微信图片_20240615160349.png ! f, T4 X1 x0 c8 F
' C2 c" e2 F4 j( r2 B/ X
微信图片_20240615160404.png
4 ~- U4 o8 H4 l! _3 @" r. {: z
- u& Q0 z0 H* j: i& b8 Q02Embedded IDE配置* _( ~; B* G) i
1.安装EIDE插件到VS Code! W/ P6 Y- I& G& ?  z3 v9 o
2.安装实用工具到EIDE环境
+ `4 R; U% n# [# [% I* Ra.安装arm-none-embed-gcc工具链) k3 A, b5 q: N/ n8 c+ V
& N6 }0 A$ l. R, _0 @9 D- J
微信图片_20240615160533.png
/ q' S$ H. Y  A( p3 P# S
* X! [  f& y! Z" Z. e3 Rb.添加其bin文件夹到环境变量
$ X, A( q' [% y9 {
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址
    8 u7 s$ R$ z" v% `# D

7 U: i2 K5 }5 P$ P, s
微信图片_20240615160536.png
0 R# s% F9 k8 B( \; N/ M4 Z
; v, m- Y3 A( {7 h# C  Z 微信图片_20240615160540.png
5 d2 O) S; r- a
4 o, h9 C3 ^+ w
在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试
9 F& V$ V6 f- x* C0 N6 t7 i! n8 W9 L
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

7 [  T' F8 l. _2 Mc.安装OpenOCD1 t0 P# ]- N( ~( g3 [) ]1 |

4 j) D! P$ N7 i
9 k  s0 n3 W1 `3 `

( z6 o; }4 a0 O3 u! U( md.在vscode中安装Makefile Tools% p! n* c5 M4 E7 K. {' ~

7 r1 u( A" |4 G2 ?, b$ c  L
微信图片_20240615160554.png ; d1 n+ w9 y9 W

3 [+ p1 q, d# L+ v' P; ]! u
  • 找到该工具的安装目录
    / S' [# c* `- B7 q) B
" f4 y; r* g2 S. m' k5 v
微信图片_20240615160557.png
  R" G/ {. Z$ r# u, v: w9 y% M8 P; e% ?& |2 |. x
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常: O$ j! _1 ?+ a6 ^) w( D
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v1 `$ |+ x% A$ u/ R) j
  2. GNU Make 3.81; Y' o9 {4 t+ r$ I, i- l( s
  3. Copyright (C) 2006  Free Software Foundation, Inc.+ ]0 t5 i* T# @/ Y" b1 ]1 L* Y
  4. This is free software; see the source for copying conditions.
    9 a% n, T9 V# u! J* o2 N
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
    / L/ ^" n6 f7 P: b
  6. PARTICULAR PURPOSE.
    4 j8 G: g  ?& K9 f
  7. 4 d8 P# G/ x3 N4 z( \/ R, x
  8. 5 V; G$ x+ V! G. o0 c! _) b
  9. This program built for i686-pc-msys
复制代码

) R( `. l8 v. w- j8 j  o03Embedded IDE项目建立-stm32标准库
9 Q" G" Q  A0 a  q0 d+ ~1.工程项目建立; f% g  |  n- n
a.切换到EIDE环境,点击操作-新建项目-空项目图片3 z7 Z# [0 e! ]& U! k
4 m# N, o" \4 @
微信图片_20240615160602.png
( S: S! l$ T. y0 ^7 l, @: d* U5 h- |. s) \6 k) Y
b.选择一个合适的MCU项目类型,如Cortex-M项目6 J! I- L' a! g, Q

; n0 a* B- D+ o3 M: m! f
微信图片_20240615160605.png
9 ~) @7 ^/ ~8 Z- N( r/ g* Q! b' X4 j- l' h1 H' U# G
c.点击右下角继续,跳转到工作区( t+ E; F: S( U
2 A& b; |/ k5 [
微信图片_20240615160608.png
* H6 K) m2 q0 Y  _; i9 A' z. O9 O8 W
6 P: _4 A6 _% |5 w
d.添加工程文件到工作区路径下。——标准库
: F) R# T* ]( @4 ?0 Y! Y
  X. S0 J5 F7 f7 l$ Y0 [
+ V4 ]3 {, ~0 }, X* r) ]( R' `
微信图片_20240615160612.png $ \, A, q5 `+ F# |9 @& [. z) L% v- f

1 j$ q, h3 z9 @0 O0 l6 t' Z* `/ S0 e
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。
    / w- F% n/ \- \+ U; u% n

5 H2 d# U, J$ e: q+ s' w4 ]8 z5 m
  • 新建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文件。, R$ B, o% p% W( l

: u. @0 M+ o1 ?, P; @1 C& @( t
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    % u8 F* L2 s7 I7 c# `8 ^
0 p9 a" t( p9 \! i  {! @
) l5 ^2 _; u: {- _$ \
2 N& N4 j& c" U# Y& L0 F) |
微信图片_20240615160615.png % x: D; }( h  o' ?$ `( R5 N) ^

7 _5 m4 P) t5 D/ X8 Istm32_flash.ld( J% N* W+ s0 B& q
  1. /*
    , J4 x, I# A- f$ C9 [" p3 _& M
  2. *****************************************************************************
    3 {# h( a! q7 z+ j
  3. **
    0 V; W5 `* K( j# m; b7 F( v# ~5 `
  4. **  File        : stm32_flash.ld
    ! u- @: s( i$ F- o/ v
  5. **& w6 F# p7 a2 d/ l0 s
  6. **  Abstract    : Linker script for STM32F107VC Device with
    8 J) O3 X) F1 F, j
  7. **                256KByte FLASH, 64KByte RAM
    8 r% }' _( W: z2 k  n4 D7 K0 K+ U
  8. **
    / I% D- e( l: B4 F
  9. **                Set heap size, stack size and stack location according: n$ ?9 \. c; a0 l. D5 X4 I4 R
  10. **                to application requirements.. h/ y5 P9 |- t& E3 {# f
  11. **
    # U, ^) W  `+ P- v) T6 g
  12. **                Set memory bank area and size if external memory is used.
    - G2 N! E. a4 S9 t8 d4 `- v% X/ T
  13. **
    7 M( b7 n1 m' q4 F9 i9 f
  14. **  Target      : STMicroelectronics STM32
    2 x8 Y4 j- L" S- z
  15. **9 q& U4 p" \# A
  16. **  Environment : Atollic TrueSTUDIO(R)" A1 ]$ Y' i% c# Q/ O
  17. **
    % i8 c6 G$ w4 M* P
  18. **  Distribution: The file is distributed �as is,� without any warranty1 A' a5 ?, |- S5 ^/ {5 {2 L  k
  19. **                of any kind.
    ' l# i  M# m! L& d
  20. **
    ! K& f$ v$ B3 I, s% s8 T
  21. **  (c)Copyright Atollic AB.; q; `7 c# E: c
  22. **  You may use this file as-is or modify it according to the needs of your
    , S7 O3 C5 l4 Q8 q& l1 O3 F8 t
  23. **  project. Distribution of this file (unmodified or modified) is not
    2 e, J  p) r& o  p4 P0 t
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
    7 R& W) B* P8 h- o% {! c) \$ N
  25. **  rights to distribute the assembled, compiled & linked contents of this5 Q( q" l) L" Z3 a  u! _. W5 R# \
  26. **  file as part of an application binary file, provided that it is built  m# }+ I+ G2 {  c' }# Y( N; L- ?& s( K
  27. **  using the Atollic TrueSTUDIO(R) toolchain.' T! w. \! d- v$ q& M3 H& {3 T
  28. **
    / C" }, ?) ?$ A" u
  29. *****************************************************************************, h3 {! V; O. S5 g1 d2 S6 `
  30. */) O' g2 b$ E1 i" m6 I, G. `
  31. , r+ H. K7 P& N6 P8 `. M# y

  32. 6 J: d. ]- A( j/ K
  33. /* Entry Point */5 n) }( C  L# i- z4 v" h! n
  34. ENTRY(Reset_Handler)+ x1 {# T) ?4 |0 k) j6 S
  35. + {4 ^9 W1 v* |: s4 Z
  36. : v$ a& u: e5 I, o! j/ U
  37. /* Highest address of the user mode stack */
    ' L5 w+ P0 E/ E5 B: l' U8 T5 K
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    1 n, t% ~" b5 E0 Q- q% O$ s

  39.   }1 W7 S/ E7 W: j# ?
  40. , B3 |" x5 q0 e/ R0 I' [' L
  41. /* Generate a link error if heap and stack don't fit into RAM */* m9 v! H) K% {: n+ v
  42. _Min_Heap_Size = 0;      /* required amount of heap  */& z3 F0 r; Z6 L- f: v9 q1 ]) ^
  43. _Min_Stack_Size = 0x200; /* required amount of stack */3 S9 u& a% e( ?5 n

  44. 1 x1 |! w+ S$ H% M- y

  45. , L8 `5 `$ U8 c0 A
  46. /* Specify the memory areas */2 o0 P4 m8 m3 v; h# t) G4 k$ [7 E9 X
  47. MEMORY
    7 ^* }1 j* a8 s3 l& s+ B$ K3 I9 Z
  48. {% b9 h6 m8 j4 u7 f
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    1 L; j! |0 s6 E; S- K
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K! o" ^# s% }2 }- @8 j) y6 ^$ f
  51. }( d7 ], n2 V) N9 f

  52. ( }: `" {! w4 @! k0 }
  53. : {- C) t1 e  a$ l
  54. /* Define output sections */% B' X$ z/ P6 L9 @+ Q" d
  55. SECTIONS
    6 A7 ~& S; J% l8 R3 c3 L
  56. {# n6 A4 t* U/ }: s' l1 K+ Y' t
  57.   /* The startup code goes first into FLASH */
    ! L5 `5 C) J3 o5 j# Y6 ]
  58.   .isr_vector :
    . t; w% z  Z5 F) F
  59.   {
      A+ H6 H* n' u; p
  60.     . = ALIGN(4);& R  X  J7 E( k
  61.     KEEP(*(.isr_vector)) /* Startup code */
    : v1 c. I/ c0 }# D  @1 a
  62.     . = ALIGN(4);# d2 j  J/ p# ^' f  b
  63.   } >FLASH, P. U8 ^/ k. H/ r1 v; @
  64. + C' F. d0 z' s
  65. ( ^' C$ o8 S/ X$ x: y) Z
  66.   /* The program code and other data goes into FLASH */
    ! u" l" f/ B. V# Q  k
  67.   .text :
    & x& i8 ]8 o- i8 o: X" i
  68.   {7 [3 x3 Z' ]! T# {, t
  69.     . = ALIGN(4);
    - b" o; b  K0 p; ]. r
  70.     *(.text)           /* .text sections (code) */
    , R- I  l' z8 I$ P$ K3 X% _  }
  71.     *(.text*)          /* .text* sections (code) */
    . n! ^* {1 o6 k4 v, J0 K& k
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */
    0 {7 P# R, m/ Z( m; _" E6 W7 ]  g
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */' ~0 ?! P& z& s0 J; S+ @& C1 L
  74.     *(.glue_7)         /* glue arm to thumb code */% ]' e) {1 I; O! N' d; d8 A
  75.     *(.glue_7t)        /* glue thumb to arm code */( z- a6 X8 x2 a, ]( F* t6 \5 H

  76. % P# R% p5 o7 ~+ h5 s  t7 O( \: t

  77. * M" E2 J$ E: T. H: m
  78.     KEEP (*(.init))
    " d( [. q3 h2 C9 p
  79.     KEEP (*(.fini)); x' a$ p6 k8 a% s9 M7 H

  80. ! e) O+ G; B. N' Q
  81. 3 w6 k9 e. M' j2 l& E! Q
  82.     . = ALIGN(4);7 y8 @1 [3 d* e
  83.     _etext = .;        /* define a global symbols at end of code */0 x; a8 P3 N- R0 F9 b! h; A
  84.   } >FLASH
      I' v$ c0 E# {9 W4 j2 i! E3 k) m

  85. ! e  [1 j( k# O

  86. ) N) `# t! r' ~/ S) }. s
  87. ; S, q. g; _0 W" Q
  88. : j) {9 `. J1 Z4 X# h# C' d- W
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH
    9 ?0 s! n% {6 p( t
  90.     .ARM : {1 U( j* a* [, ]8 U0 D( |" }
  91.     __exidx_start = .;
    : m; ^6 S& s; _8 o* j
  92.       *(.ARM.exidx*)
    # r' H; O! c: ~+ v, ?/ j  q7 r
  93.       __exidx_end = .;7 D. A3 F! P0 r5 X6 r8 d$ a" l
  94.     } >FLASH: A9 y2 J8 d/ J7 h
  95. " w, b. M- c: f$ A

  96. & X' ^; O# l9 L9 K' l$ ]9 Q# N
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH
    . S0 `" k* v( W5 ~6 k; ~

  98. . t8 h9 c  ^* I- G4 @) w+ s% F
  99. ' V5 O3 I* A4 N3 n1 S% @4 R
  100.   .preinit_array     :
    # R1 M. t4 j# e' I0 ?8 h, h7 c
  101.   {% `0 Q; N# I$ K% k
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);3 G8 s" I/ y9 H7 `4 D7 s
  103.     KEEP (*(.preinit_array*))
    - ?% n. ]) ^8 U
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);8 r( d  i5 _) P  W0 N5 d. U' k7 z
  105.   } >FLASH
    3 x- I: g7 j& _6 Q" r6 B
  106.   .init_array :
    % x4 T' q6 f+ a$ [! s
  107.   {$ z, ^; H0 q8 g0 K# i
  108.     PROVIDE_HIDDEN (__init_array_start = .);2 d8 o' ]' J% |3 J8 p# X6 h5 n
  109.     KEEP (*(SORT(.init_array.*)))
    6 D/ ], V: \; [0 [8 `
  110.     KEEP (*(.init_array*))
      e- _) o. ^3 q$ R! M+ W
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    , ^( N( i- D+ O/ }0 a
  112.   } >FLASH
    ( O) K1 U. G1 N
  113.   .fini_array :8 e1 }* D! ~  M5 }% S9 Z/ [
  114.   {
    / |+ e) I& j8 T2 b
  115.     PROVIDE_HIDDEN (__fini_array_start = .);+ g/ N; ?: j" q1 w4 z
  116.     KEEP (*(.fini_array*))8 ]) b7 R9 u- {# E# ]3 {
  117.     KEEP (*(SORT(.fini_array.*))): ~, K) U1 Q- P& _9 T0 |. T" X
  118.     PROVIDE_HIDDEN (__fini_array_end = .);
    # @4 T7 k5 f8 m: }% g. V, f
  119.   } >FLASH2 q4 ]$ q* O, J; C8 j" O

  120. 3 ]& K4 ^5 g/ E+ R: G- h
  121. % {) S" T8 l( k1 B7 Q
  122.   /* used by the startup to initialize data */
    , @1 k$ S6 B9 |7 A9 x4 Q8 w
  123.   _sidata = .;
      `8 b9 P9 M6 l  E3 R% F% Q! v/ T
  124. 5 h* X: M- b- C8 l

  125. 3 L9 C$ z" p* j# B+ W- t
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */
    , `" k& e" @1 N+ d) @. {# C6 x
  127.   .data : AT ( _sidata )
    4 K% R2 Y5 ^" U# M, U) k
  128.   {
    : I0 @% _' S9 G2 T$ J
  129.     . = ALIGN(4);
    , k% s" S6 q* i- P7 ^3 D, R0 `
  130.     _sdata = .;        /* create a global symbol at data start */8 M0 D/ T  p' m, o6 e
  131.     *(.data)           /* .data sections */' l/ p1 A3 l1 t1 c1 A! [, ^
  132.     *(.data*)          /* .data* sections */
    0 a) j- W  O8 @$ L3 o2 A
  133. 9 ^% D" `+ s; C. M; r

  134. 6 P$ k% ~* L! L: o4 R) A8 a; S. I
  135.     . = ALIGN(4);
    + r$ r4 o: z+ N6 J+ f; _/ f
  136.     _edata = .;        /* define a global symbol at data end */0 V2 r3 h) H3 h
  137.   } >RAM* z  {; u% g+ M' C8 Q0 a- ^. o

  138. ( y2 E+ N5 v1 m5 Y' e; |: T& K7 W- f" E8 ]
  139. ) u" {: b, o& D1 S
  140.   /* Uninitialized data section */
    ; ~! L- F6 n. \* h2 N
  141.   . = ALIGN(4);
    4 d$ G9 Z4 u4 X
  142.   .bss :% S/ @, B; U* Y8 F  ^6 d2 L
  143.   {
    5 V$ L% o2 [7 f
  144.     /* This is used by the startup in order to initialize the .bss secion */0 q5 X' D5 Y7 e. ^# M
  145.     _sbss = .;         /* define a global symbol at bss start */
    ! U# D* d& B$ @0 I7 _5 V
  146.     __bss_start__ = _sbss;/ h4 o; _0 [8 A) ]6 |
  147.     *(.bss), R! Y2 Y9 k' K2 G2 B; i9 Z0 [7 j9 ~/ c
  148.     *(.bss*)( z3 v% }9 \3 V6 N* N, ?1 a" e
  149.     *(COMMON)
    $ U- A: S% Q! Q+ V+ Q6 ^1 z
  150. $ s3 y2 Z" c; E" z6 d
  151. / q% T4 ~0 t6 N4 [( ?
  152.     . = ALIGN(4);
    * t( l6 W* x6 k5 `$ E
  153.     _ebss = .;         /* define a global symbol at bss end */1 D" E4 |5 Z5 b8 n( k
  154.     __bss_end__ = _ebss;
    $ ^+ p! H) n/ `3 m
  155.   } >RAM; [4 }5 _4 r$ R7 K! H

  156.   S% k2 K# y; T
  157. 4 f: U  V9 c: Q6 U3 y) y' E1 s
  158.   PROVIDE ( end = _ebss );; |4 L0 {% B& X! Z+ i0 y9 {
  159.   PROVIDE ( _end = _ebss );
    # u. N- a/ J; S1 U3 s, S$ @

  160. % A& k7 p: {3 J. m5 O
  161. : h( m+ d- D) O2 e
  162.   /* User_heap_stack section, used to check that there is enough RAM left *// q* d& c5 u4 K% W1 d9 c- u% z
  163.   ._user_heap_stack :
    2 }' s* j2 j4 B
  164.   {2 L% r+ N- Y5 U3 x7 a
  165.     . = ALIGN(4);
    ! e4 d! c" X% e: A0 d: Q
  166.     . = . + _Min_Heap_Size;' f! r/ A( X; P7 M8 {; n8 V
  167.     . = . + _Min_Stack_Size;
    , n5 o! s) M2 }) H2 {! A/ e
  168.     . = ALIGN(4);
    - y7 C3 j, E/ _+ j4 _+ M5 W
  169.   } >RAM
    " L. U& n; y- X: b- C4 r

  170. / U& P: G+ o4 _0 @8 q

  171. 2 I6 G2 m- ~+ j" Z$ M
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */
    : Q4 t" R; ^: m8 H9 L. t# J
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */
    * `/ V/ m% ?* S' I0 m- ]9 d
  174.   .memory_b1_text :
    1 R8 _3 p) `# F! d  }
  175.   {
    6 o, i! E9 J; Y+ j. j* J
  176.     *(.mb1text)        /* .mb1text sections (code) */& M. j- y2 R( R& u: }/ b8 H
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */% e5 ~& U/ ?7 k4 t( h# a+ M
  178.     *(.mb1rodata)      /* read-only data (constants) */
    5 F4 i  p4 n& h# M9 w; ?, V
  179.     *(.mb1rodata*)0 J) @; T/ ~1 [: M, P7 t
  180.   } >MEMORY_B17 `3 C  {1 D5 d; o& Z

  181. 0 W9 J% v! L! }& N; B7 J

  182. 8 a8 L2 W" K1 F) W
  183.   /* Remove information from the standard libraries */3 x# n- h3 k8 G: n" c
  184.   /DISCARD/ :
    - z; B) k0 F; y. G5 K1 \1 ~. }
  185.   {2 }+ }( r8 K3 d( T+ ]
  186.     libc.a ( * )# p: m, w3 V# e" o+ m+ {
  187.     libm.a ( * )$ v+ o# d* v3 A8 Z5 q  }+ r! }
  188.     libgcc.a ( * )
    , j$ [7 v& {7 w# ~" k+ Y* ]% S$ W
  189.   }' J0 {! X8 G" x9 }5 Y2 O
  190. }
复制代码
- b8 o* _( k+ q+ t
  • 最终目录文件如下
    - Z* I% ^/ G' U- e+ @  r

, I( x1 o- X2 W  F! X# c" e) ?, y
微信图片_20240615160620.png
! ]9 E9 X$ p; n& \/ h5 c" b
; U" V3 f3 U, }8 v- n: W, }" R
2.在EIDE中使用标准库时的设置(无Makefile)
0 k4 q* ?$ x; ~$ f- a: ?) i6 Ca.切换到EIDE环境下
5 ^# a* m# g. W9 P8 t" N4 }( Y6 |5 [, ?
微信图片_20240615160623.png
6 u1 n+ k6 n. f
* \8 G2 M7 P" |* { 微信图片_20240615160627.png $ B) U: H/ K; Q$ o8 U# ?5 S- Q
2 T4 l1 D% m/ e, d' _( A) H9 Y
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹
% K& g' R' U' k. b7 _. C' e
! L: [* L3 O; H; d9 C
微信图片_20240615160629.png
, B; O0 t; k5 X( n" j; Z1 _2 B+ Q# T! B
微信图片_20240615160632.png * y2 \% }0 L1 L1 y- x

' G" D( i+ ]$ u2 A' g, C6 G$ m 微信图片_20240615160635.png - F: f5 }0 n, G/ e' e) m% V  I
9 j! G4 L$ N0 i5 K- ]
文件目录如下:+ E7 m% Y( d6 K# |+ n, i  E
4 c& Y1 O/ T4 i: W7 U
微信图片_20240615160638.png ' W; V! D7 Z( t' `$ `

8 l3 l3 O, b% v) e+ B* @; Gc.点击+号安装CMSIS芯片支持包+ S  e  S' i7 o9 u3 @" N9 i4 Q: P

# b: o  f' ]3 o% i$ }1 s
微信图片_20240615160641.png ! L% K5 B8 H# m3 d" f, n
1 k" l* X& T) B# L$ t6 A# Y! }. m
微信图片_20240615160652.png
7 `5 Z: y* F$ j5 ?$ S
8 ^( D. B4 V) e: h! J6 \ 微信图片_20240615160656.png
, j  }3 x- R$ a! N/ _8 ^

  Q: M, d* o- S  jd.修改构建配置为gcc
- j# X" ^% t& w5 J0 q% j- E9 @* ]6 r# Y( l
微信图片_20240615160659.png
: O$ p% t. n( [8 f+ z$ d/ t7 `. T
e.烧录配置为STLink/OpenOCD- T" X; o0 i  U, Y
# N1 \' k6 S$ z/ q' ]- v
微信图片_20240615160704.png ' y, Q: p! _+ ?- c# Z
$ E: K- x; O+ a$ p' P- P; h4 |' R4 o
f.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。' s4 J" z; E2 D; ?, [$ H+ r2 e

# _4 C4 b0 P1 k. P2 u% s
微信图片_20240615160707.png
$ k& p  t- w* T, k# K( E  o9 |- z" A0 p, @  z4 S
g.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义
6 \5 W7 ]  [$ Y: j# C+ Z
3 a' p) i( }9 v. a6 Y
微信图片_20240615160710.png ) F8 d1 B3 ]. n- e3 l* T$ U
3 S9 P  r; w* U0 e2 r3 m
h.此时编译可能会有下述报错
/ c$ K$ Q& \1 k( j) Z
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'
    . m5 H0 Q# y- k4 t5 Y+ E
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

; u8 @, W( x; z- k; L0 [8 j+ {7 T+ @: E! q, x1 ~+ x

; @  e4 `9 R' G# W8 R打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)" U2 V/ i, O1 y, c0 o" f/ z5 ]
  2. {
    ; B, }6 c* s4 W- v0 Q
  3.    uint32_t result=0;1 O4 i3 T! x( q
  4. 8 O, @  H! ?3 f8 ~. B
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );; c  @3 N8 f( W2 |1 ]* M+ p
  6.    return(result);
    $ p- P8 i) ~8 F. P& Q; l# r  y/ u" @0 c: N
  7. }
    # w$ T) T  b& d

  8. ' K  @/ m6 S' G' ^9 q
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)  ^- Y) e# b( W  w$ ?2 ?0 Q
  10. {. ?7 u+ x9 b( n8 W- _
  11.    uint32_t result=0;: @, P' s: A4 Z, `6 }7 I

  12. 0 Q7 `# [7 \2 C  H. W- [
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
    - x5 e, }9 r/ ?# M. F/ e+ o
  14.    return(result);
      V5 A% i2 g+ d4 q1 J- c* W
  15. }
复制代码
9 k: p1 H8 Z% t
  • ctrl+shift+p,配置c_cpp_properties.json文件图片, H3 r4 h' s1 L: K2 r

: b  K; ~* K* F& D; j
微信图片_20240615160713.png & o2 w& Y  w* A& B1 D
  1. {
    + h) X3 K* _$ W; r
  2.     "configurations": [
    " F5 o: d" O/ c; _: v6 H* T
  3.         {
    $ F9 S( ~1 B8 V9 V# H' x
  4.             "name": "Win32",7 Z' o1 ^7 K8 Y6 a* x
  5.             "includePath": [  Z, T7 i4 r, Q
  6.                 "${workspaceFolder}/**",
    : [" {4 j  |" I1 u, t& n
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",' f/ o  k% A: W  i
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",
    % M8 v7 |3 h$ ?) k
  9.                 "${workspaceFolder}/CORE") i0 k+ e' ^7 s
  10.             ],0 ~; Y2 {) _( R& Y! }. @
  11.             "defines": [
    ; x9 v1 Y0 m9 T, _0 [% T
  12.                 "_DEBUG",9 d* ^( {. ?8 y# Q( ]/ L, d& Z
  13.                 "UNICODE",
    ! x8 ~+ a  V# }# I& G- T
  14.                 "_UNICODE",
    . t3 k! f; @. o$ D" m1 ^# ~3 h- X2 J
  15.                 "STM32F10X_MD",! u4 h( a" h" ^
  16.                 "USE_STDPERIPH_DRIVER",
    ) o' |% _! v, x% N6 Z7 E
  17.                 "__CC_ARM"
    8 @9 E* v3 i- P
  18.             ],
    + C; K6 x" {: g; V' @, b
  19.             "cStandard": "c99"
    & E9 E% S6 i( ?" b- u, n2 L* D5 f
  20.         }8 [1 J( z9 |. F0 _2 a, j% H
  21.     ],! T# |5 E& y9 s/ v
  22.     "version": 4' v0 H& {# W3 H  @

  23. # G% H, r7 ^1 j$ |
复制代码

: S: M+ J8 B8 D9 F" \; V$ [3.编译工程# ]; g, J8 Z( F+ g0 F7 [+ s
8 V! f. g3 v: U8 p2 H
4.一些问题的处理:
7 A, f! X( m: h) d2 D0 J+ k3 Ka.编译成功,但下载后没有任何反应。. [0 q* P% O$ r) c/ F: A$ w- u
注意检查stm32_flash.ld文件内容! G( f! p2 p( q3 `1 t# `& j
  1. /* Highest address of the user mode stack */
    : ~2 P- [1 D: i3 I8 O- G' a7 O
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码
8 u- x; n/ M9 D/ }- K2 ~6 b
注意对应芯片型号( d$ O7 W" k' O$ _5 E) J
  1. /* Specify the memory areas */
    - {8 f! p3 P+ Q& C$ H$ l! Y. H
  2. MEMORY* x, b% h7 D5 J8 w9 u/ A* u
  3. {( h3 [! {6 X( x* D+ Y3 m
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K: y" h6 A" T' M/ x7 b* w
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K4 Z4 H3 w- U( P* @
  6. }
复制代码
" p- b2 K) q0 e9 m) r. i& A
b.vscode提交(commit)代码时卡住8 N4 {5 P, j. J. b
3 _4 o: \+ J# U" e8 E3 b& h
微信图片_20240615160715.png 5 y6 m, o5 ^  P( C; y0 X1 h

$ S" Z0 y& `, {) t 微信图片_20240615160718.png
' t' V" E4 o" \+ ~  [# H& n. ~- S, o: d
微信图片_20240615160722.png
0 @$ d9 w  n: Y- |
+ m% q8 t* X! {) e2 s设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。
$ _9 x1 ^( x- r! _. I
0 M  n* y! o- r- O+ F( Wc.结束' i+ c; {1 W1 O& y; V6 N3 b( b

6 m( H7 c9 @4 D: O2 ]' y' Z5.调试工程5 I5 ~. E' K( m
a.添加launch.json
0 l( n* ?; M- \1 X6 k进入一个C文件,点击右上角按钮生成launch.json
/ V. }. C( x. J- P' b* |, L. M! b/ }$ `. r# ~% i9 ~! P. i
微信图片_20240615160726.png 0 u2 I# `& K, E7 V8 m6 a

+ u  t% }; b$ M% M: _b.修改launch.json为下述内容
3 W, r; D; Z- z, I6 b
  1. {
    8 d/ h4 ^# z2 O! W
  2.     // 使用 IntelliSense 了解相关属性。# d+ \, D& p1 |7 s; e$ W( e
  3.     // 悬停以查看现有属性的描述。- T' e3 a2 Y/ m
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    8 _: I& l0 Y! v
  5.     "version": "0.2.0",  p# N3 Q6 a- {  T! k% F1 B8 }6 Q4 m
  6.     "configurations": [9 _. J" ?6 p) Q: v9 k" J; O: c. i
  7.         {
    5 x0 D( a! k) o
  8.             "name": "Cortex Debug",
    / S: [: @5 _3 t2 r1 b! Z4 n
  9.             "cwd": "${workspaceRoot}",  // 输出路径3 h/ ]$ h/ O- n7 C0 R5 O
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序4 t) b$ |% D% i: e8 M5 q- e
  11.             "request": "launch",
    . D8 w3 M. K3 f
  12.             "type": "cortex-debug",& \: w- N1 o7 }* ~, q% C6 U; n
  13.             "servertype": "openocd",    // 调试器选择
    . H2 K6 Y, l7 F- ]
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php. s# x7 \' b1 j' `
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载
    9 |' C5 `+ y# i3 s
  16.             "interface": "swd",/ w6 V  A  z- o0 t6 T. t9 V
  17.             "configFiles": [+ [$ ^8 B& H/ z+ X* x2 P. p
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置
    ! p+ |( k8 G4 M& o, s2 s; a: q
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",
    : I! B$ A4 t' n
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"
    2 o$ A( c) H  z* b4 ^
  21.             ],
    & t' U0 m( _% F& @; Q! u7 K* ?1 l3 N
  22.             "runToEntryPoint": "false",3 h0 F" i/ T( _& r! p
  23.             //"runToMain": false,* R% f! K/ Y( Z4 {" G
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的1 b  a$ f" z' X5 L8 d; Z- C, y
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径
    $ t- v' ~9 Q0 n$ k. y
  26.         }3 T4 R4 e' |! @( K

  27. 6 i( ~1 ^9 r! q) u; `) _3 G
  28. }
复制代码

2 ?/ Y; T. S- \0 {+ p4 i, }上述最重要的是引入openocd的路径。
& j4 M$ d1 n: E9 \5 T+ m0 [; q4 X6 |3 A1 v" E' B1 R( ]$ g

6 e2 s  v" |* w  Y# sc.点击播放按钮进行调试0 Z( R* Q6 `1 {  {3 y/ P5 x
, f" H% U$ M+ m* E  U
微信图片_20240615160729.png   H7 Y" K5 x5 e1 l; l
! F' f" c/ w* L; \* ~1 C  U8 A3 ?
6.结束1 I: l% p4 T1 v' r: j
( Q8 m) \. ?0 V  i+ `
! L& }* f, h  F2 z5 K5 y' [8 O; i
$ `/ c& p: v. j1 B3 w5 A8 h# {
转载自: kevin$ ^; p# s+ E; _( ]" f
如有侵权请联系删除
- m- H4 m& g0 f( H3 R. g
1 [5 V9 ~9 R- V7 d+ b5 ^+ w" O, ^6 D6 L
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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