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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 15:37
“ win+vscode+eide+gcc下的STM32编程环境搭建。”8 d" A8 P! N9 b: H7 T6 E: Y

7 T2 }" Y. l6 \4 |) f; B6 \
微信图片_20240615160241.png
0 ~3 X& @, V5 ]* C& g3 U, g2 I8 p; S3 o: Z- h3 Q8 i7 M& r& ^, c
1.VSCode安装与配置
: C0 ^: a. s  r. \9 k# ka.卸载
& ?* L) E* R  a' _+ Ab.安装
5 Z( \/ u2 ^/ nc.git安装与配置
* I! e0 W# \2 C- w+ o% U7 wd.安装插件
/ |; u4 _: F7 S. T6 A0 Q8 B1 T+ P8 S, D1 l' A3 G6 }

  {# k6 Q/ `# F2.Embedded IDE配置8 l# L8 N6 [( \0 O8 B3 w' R
a.安装EIDE插件
$ p) t; a; }6 A1 ]5 E
b.安装实用工具到EIDE5 Z' U) [- B  a. i$ {; q
  • 安装arm-none-embed-gcc
  • 添加其bin文件夹到环境变量
  • 安装OpenOCD
  • 在vscode中安装Makefile Tools. q. i* g: s, a4 V: W
3.Embedded IDE项目建立-stm32标准库
# o- q7 H& a! G, n4 @+ u9 c- {6 F% }a.工程项目建立
0 K3 t* V% _+ sb.在EIDE中使用标准库时的设置(无Makefile)5 c' w) ?2 F4 _
c.编译工程
5 C4 I) k) w2 }# J2 `6 A
# t+ p8 \! i6 u/ q
4.一些问题的处理:
/ V, I% o4 t; h, i. O2 v5.调试工程
! X8 B! X9 o8 ?3 i) b+ O
4 O! ^  d: Z+ s4 M& V$ }+ J01VSCode安装与配置' d5 p1 x) K( f" O2 u
1.完全卸载之前安装过的VSCode
* e- ]# W9 \) U7 c: fa.卸载软件
0 Z9 H  X* ^' e! Y9 w; Xb.删除插件:找到C:\Users\用户名\.vscode`文件夹并删除它,以彻底清除已安装的插件。4 ~! v) ^8 A+ F4 e- n) K7 I
c.删除用户信息和缓存信息:访问C:\Users\用户名\AppData\Roaming路径下,删除Code和Visual Studio Code文件夹,以彻底删除用户信息和缓存信息。; B5 [) F1 W; W6 b4 v3 K* e

. S" P5 W+ e* n2 _0 h
2.下载安装vscode/ u. Y9 k. ~( W  ^' U" ]
5 R! s5 n* A# f$ p4 y) Y
3.git安装与配置
5 z9 z; s$ e' `! j& t安装git
; v( d) a7 U4 b7 @+ U, h0 g* |5 [
. b( X% ^4 H! i6 J
微信图片_20240615160248.png
2 }6 J/ J% o9 W, Y9 l! Y- z
0 |/ i% i8 M1 W7 z1 D4 |# [+ |1 j* W安装完成后,在开始菜单中找到并打开Git Bash
" s' V' v: B+ R; {' P6 M) ?/ r; J4 ~" k) `3 b
微信图片_20240615160250.png 3 ^- J  o7 Q1 f7 g1 ~
- |8 Y0 S& j7 L2 n
在代码托管平台网站新建仓库,按照gitee等克隆下载的要求设置git" F# _! s! ?7 [# L8 g, P$ ?
7 f  ?- r) S5 L
微信图片_20240615160253.png
  N% _5 _/ F! ?( K: U

/ V7 ?* b% F2 x. J4 a+ d在git bash中输入配置
  1. git config --global user.name 'kevin.kerry'
    9 q" v7 {, g* G2 c7 }# _
  2. git config --global user.email 'ct15762287606@outlook.com'
    / }: m& Z$ e8 H% V* b0 b
  3. //检查当前仓库状态. f+ i; B0 ^0 {4 Z! o  J6 }
  4. git status+ V& g& N1 P: S* `7 n7 h3 K$ r, I
  5. //确认git配置
    , V5 f6 u: e' {3 A
  6. git config user.name# X' U8 l, r/ K4 @1 T* d( e
  7. git config user.email
    % |* N& y! [1 l7 J7 d) S& Z+ |. W
  8. //查看错误信息
    9 \1 ]. G- y/ r" v
  9. git commit -v
    : h( O) p( A" j; q
  10. //清理缓存
    & S+ C/ M( i# Y( R6 T% {
  11. git rm -r --cached .
    5 i4 N9 B# w' ^& w: \9 G
  12. git add .
    & U+ z" i6 [8 x" L
  13. git commit -m "Your commit message"
复制代码

9 T( v. A5 y; c% U: A6 n/ B
微信图片_20240615160255.png ! P" t6 X# ?6 f' W- e

' P$ _: ^( s: i9 V4.安装插件,如下图:1 t3 r6 [: i* @% F( e
4 _# N5 D$ o! q) _% R+ o' n  l, C- c
微信图片_20240615160258.jpg
/ e& [& J' x/ P0 o! _% o2 h
# ?6 j9 H# D3 x+ b8 k
微信图片_20240615160301.png 9 P3 v  z1 H3 ~8 ^! m+ {

0 @; X: v; `; q0 M
微信图片_20240615160303.png 3 }3 M7 R% g, \( O9 V3 z/ ^

7 j9 {- u% F! A$ X. x 微信图片_20240615160306.png * s2 n( t( I+ D
# c6 r! l6 M9 {' l
微信图片_20240615160309.png
- p- t9 t1 Y* s2 K5 Z6 P
) c7 a0 A% w2 \* }4 j 微信图片_20240615160312.png
; x0 ~0 d, n0 x7 i+ N% h; a3 L
. _4 ^4 _" w( B9 K) ^$ T* u2 ]: [/ W 微信图片_20240615160317.png
7 J4 L! \4 h7 L2 D; C9 q+ ?+ {1 m5 U4 T# x; e# D3 _: n3 e
微信图片_20240615160320.png
* ?6 o; v4 j; ^' s* X7 f# R; z: A+ \8 M; S
微信图片_20240615160322.png
. s5 H( ]4 K. Q
1 f  J# v% q0 Q' I( I 微信图片_20240615160325.png
% {. J% c; c3 y' B4 q, A: U) R/ G" m8 n6 y
微信图片_20240615160328.png
1 o2 L/ A' j. h3 A# p$ m- E  V2 u% m( z& R
微信图片_20240615160331.png ! T- v8 e" S! {1 {' n
& ]) p/ e! Z# J/ D1 |$ y( B
微信图片_20240615160334.png . d# L: P- Y5 P4 S! `* \" r
4 ~: M/ h2 i' J- k3 @8 f
微信图片_20240615160337.png & ^, n7 F, y& E2 R& y

6 d+ E( P9 @% f7 A% h$ c 微信图片_20240615160341.png
0 |$ [6 d0 _9 f% z  w' E
$ e; E- ^5 k; f/ ?$ \$ T: O5 ? 微信图片_20240615160344.png
; X& E8 T- F8 ^5 ?# W4 {/ O7 C
9 D- z0 s  G& \9 _. N 微信图片_20240615160347.png ) c( \" t" v9 I( l3 y2 l
0 _8 g0 o% B- y5 o0 b3 F
微信图片_20240615160349.png
6 M/ f* A7 |( @) X
% R# j5 H6 `, r. ~ 微信图片_20240615160404.png 4 b" z) `  G4 W2 p4 o3 H+ E8 \9 g! f

2 o& m3 d0 o8 y7 ?& M0 K02Embedded IDE配置
! P; t& q( C" _+ D1.安装EIDE插件到VS Code! S: p3 e: k+ s% o
2.安装实用工具到EIDE环境+ W7 l9 I+ p0 \% m! f/ t, c
a.安装arm-none-embed-gcc工具链- u; {8 m' m; ?* E& g3 o- _
) d$ O) f6 H2 j! t2 [) @
微信图片_20240615160533.png 0 R6 ^# {& l- u& d) x
/ @3 \& X0 P2 x/ a! l& P
b.添加其bin文件夹到环境变量
# D# `& P$ W! t2 u, Z: o  S, U) i2 @
  • 在EIDE中安装的gcc插件安装目录通常为:C:\Users\${用户名}\.eide\tools\gcc_arm\bin
  • "windows"键唤出搜索,输入编辑系统环境变量。找到Path进行编辑。添加上述gcc命令地址
    ) K: x% `3 m8 b& l( b# e  g

; q# O+ Y9 j4 E  k) I* _$ c" _
微信图片_20240615160536.png 9 J0 W$ A! ]) g5 L+ f8 K

( G( I" u9 h* m" ~: x 微信图片_20240615160540.png
3 p' H7 S: L0 x+ `  ]( ]8 F

3 P' ?* V2 ?$ A; d, X# f! j在cmd/VSCode的集成终端输入 arm-none-eabi-gcc -v测试
# m: x* C& C1 E0 f- x+ ?+ e6 s2 ]- q3 h- \- z
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> arm-none-eabi-gcc -v
复制代码

) G+ s, _% N! O. h8 `% C4 s. mc.安装OpenOCD3 v' C9 n/ |( A& V( Y

# a7 b6 A/ [1 N
/ K5 Y. T) ]! {) S

8 B6 y4 K9 D- K) kd.在vscode中安装Makefile Tools3 k  j2 v( C% H' E( i% J* {( w' P

9 F4 v1 @) J/ U, j
微信图片_20240615160554.png
3 C/ g3 s! [) o  d' H0 A+ v

5 |# V  n2 Z# A
  • 找到该工具的安装目录
    3 O5 H- n( s! ?1 \' d+ w! v/ i
, t* W% U/ Q8 |* m' d
微信图片_20240615160557.png
: Y6 e( [" v+ Q' k+ Y" E' O  e+ ?( I) R2 {2 a5 v) R
  • 将该Make工具的bin路径添加到环境变量,如前
  • 重启vscode,测试make -v命令是否正常! h5 @1 W4 C/ r; S7 j2 r
  1. PS C:\Users\ct\Desktop\win-stm32-gcc> make -v' x/ k8 ]; r; q8 x+ F8 ?# J. }; e& G  O
  2. GNU Make 3.819 \3 `0 n7 s8 e& ~0 T
  3. Copyright (C) 2006  Free Software Foundation, Inc.& J5 q- P( i; }; p6 j# p
  4. This is free software; see the source for copying conditions.9 {( e7 X$ T; C6 p, m3 r: Z
  5. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A3 K6 m2 [( R& @3 p
  6. PARTICULAR PURPOSE.( o, G, \" G4 N1 }* x2 m" M
  7. 9 X# n! ?8 D! e7 ^

  8. + g( W6 z( D' x
  9. This program built for i686-pc-msys
复制代码
  d$ Q  A0 G6 r$ W
03Embedded IDE项目建立-stm32标准库8 a% X" D* G6 p! h* J) K9 q3 m
1.工程项目建立
, W3 J; b3 q2 z: x/ E& L5 y9 ua.切换到EIDE环境,点击操作-新建项目-空项目图片
' F( ]( [& ^% z& t+ G  m5 O8 ^. {9 D0 l; G8 H
微信图片_20240615160602.png 3 S9 _- T: r  V& L7 D. }( A
5 A; i& s- V) ~
b.选择一个合适的MCU项目类型,如Cortex-M项目: V( A3 c( H- t' I& c

9 U, x1 W9 f" a( `: k" ^
微信图片_20240615160605.png ) |( q, s9 l; M1 W& W; S$ ~* v
# E7 H! k. B, {$ `0 P. q
c.点击右下角继续,跳转到工作区/ d& _/ M/ U8 K

  s& G7 P- O# @, w2 d 微信图片_20240615160608.png
# }7 \4 O2 _7 H6 W3 b" q( M

+ Q8 c/ N. l  r6 bd.添加工程文件到工作区路径下。——标准库
/ r6 c8 |& Y! V1 B$ }) q
' G# h- F9 ]4 C; |: `) Z' H" A; n1 q$ t4 R6 p6 v) s- P
微信图片_20240615160612.png
. O& [' |$ X( b$ {! f+ Y
  {$ A% H  L- T) v# i% B* W
  • 将Libraries文件夹复制到根目录,删除Libraries文件夹中的无用文件,保留core_cm3.c,core_cm3.h,stm32f10x.h文件,startup文件选择固件库里的Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\TrueSTUDIO 里对应芯片的s文件,一定要TrueSTUDIO 目录里的启动文件。! c! T+ Y. U. Z) ]

0 p; i* b1 ^& j, o
  • 新建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文件。
    3 c9 r3 Y; E3 U

/ a! m% g3 S3 p# c$ K3 D! k% k
  • 将固件库对应芯片下的(例如)Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld拷贝到根目录并在EIDE中指定gcc所需的链接文件
    : w5 p( C# D0 @" I4 P" v
( Z! ^1 {1 G3 t$ j2 _  r  R# M
3 U4 Q( t6 q: B0 ?; k3 F
, \! ?7 m6 G* v" Q# o) _' v) J
微信图片_20240615160615.png 4 s# O, F' p+ y, U7 W+ g

7 v9 s& y5 e  T# xstm32_flash.ld3 B5 ]* V2 O6 S7 p6 n2 i) V
  1. /*
    ( o4 @  n1 M: W
  2. *****************************************************************************! X0 G5 m$ D# Y, l+ T
  3. **
    ( {4 P! x$ @5 h0 t' h
  4. **  File        : stm32_flash.ld: B; x' ?/ l7 s" [( C% D) O
  5. **
    . A. t" g$ d9 ]; f
  6. **  Abstract    : Linker script for STM32F107VC Device with: z3 H9 W0 E9 S& F
  7. **                256KByte FLASH, 64KByte RAM) e5 j; @, [# N
  8. **
    0 N: J. r& E3 }- X$ t
  9. **                Set heap size, stack size and stack location according
    ; t. k6 M& n0 Z" l7 t. M& @
  10. **                to application requirements.
    ' f0 y; e6 Y, {# W
  11. **
    0 z! J/ A: H( |% ]) i; v
  12. **                Set memory bank area and size if external memory is used.9 ^7 z4 S1 t& u; Y* _8 U4 K% W" ?
  13. **, R" P1 p, H/ A; Z( N) E
  14. **  Target      : STMicroelectronics STM32
    # h1 {* S% t# k4 @
  15. **
      u3 y6 b6 ]0 X' _( v1 U& H
  16. **  Environment : Atollic TrueSTUDIO(R), U0 {1 T! Z, x3 ~6 r
  17. **  d8 f+ n$ a; i
  18. **  Distribution: The file is distributed �as is,� without any warranty0 r5 A7 e1 l4 F) |" B
  19. **                of any kind.
    ) L9 c) A- \! U0 |7 M: g
  20. **
    1 B1 f/ l8 }! Y+ ^6 U+ X
  21. **  (c)Copyright Atollic AB.
    + ?# x' s4 p  z! w+ o" P2 T+ q
  22. **  You may use this file as-is or modify it according to the needs of your$ d( w4 m8 H1 b+ m1 L$ b; s! I
  23. **  project. Distribution of this file (unmodified or modified) is not
    * N  F8 |  z8 C- O) N* u0 T
  24. **  permitted. Atollic AB permit registered Atollic TrueSTUDIO(R) users the
    * g6 z' x+ D) D- L! e
  25. **  rights to distribute the assembled, compiled & linked contents of this
    % R% |: d1 U/ x9 ?
  26. **  file as part of an application binary file, provided that it is built: C0 q1 W' l" h/ p
  27. **  using the Atollic TrueSTUDIO(R) toolchain.1 I  |; \0 s8 n( t2 Y4 Z" Y' M; t& A- y+ S
  28. **, }0 [( ]  P. |2 Z/ W) a
  29. *****************************************************************************
    & X7 L/ e+ i1 F/ M- w  E% m
  30. */
    + v& A" Y# G$ u# M: i% t1 K- v
  31. 2 n2 F- `! b2 f$ z  G

  32. . G# x; \, j- X" M7 T/ Q& S
  33. /* Entry Point */, f5 o# ^, ]1 U; }* {8 d% b
  34. ENTRY(Reset_Handler)  H- f4 t! j. c" U' C: {8 v
  35. $ `: |3 m* _8 Y, f
  36. + y, b# T/ b% d" w8 x' e
  37. /* Highest address of the user mode stack */
      R( F2 O2 n% P+ B0 I% G
  38. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
    3 f' c! _5 X. f- m& E# j

  39. - K& k7 q( b# b% h5 i) u3 `

  40. & f% f7 `3 A) b  D( O  w' [
  41. /* Generate a link error if heap and stack don't fit into RAM */
    6 w2 j' T; n2 m2 f5 a, ^. D
  42. _Min_Heap_Size = 0;      /* required amount of heap  */, I1 \4 t) i! k3 T
  43. _Min_Stack_Size = 0x200; /* required amount of stack */; F1 S3 e# F$ y' v

  44. 3 B5 N) N6 x8 u' ~
  45. & y; c( s3 ?' B, G( v5 W& o
  46. /* Specify the memory areas */
    * t+ A# U; `% C9 u3 Z6 n. f
  47. MEMORY! ~5 G1 F# g& D' w! S; y
  48. {
    9 _; a7 l( B9 {; s: t
  49. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    5 D& ~- I0 d& \& r; U) _
  50. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K
    0 @& W+ d( `/ n
  51. }
    7 h! \( g& H3 |% y  \: ~, ^4 |

  52. # K& p+ e  X, g# X$ x
  53. / s# }- F5 u- |2 p3 W
  54. /* Define output sections */: a- j# T) K! u1 _# d8 T
  55. SECTIONS
    6 f! G& ?8 |+ U- V1 m. x2 W# }) \' L
  56. {
    # C5 k0 j' |" q' ]( ~# d! }
  57.   /* The startup code goes first into FLASH */8 _% p" E6 z- x1 x/ h$ I# J
  58.   .isr_vector :" c# D# i+ R; \3 e3 B7 n
  59.   {* z2 A, G* v& Z' v% j$ x( D( X
  60.     . = ALIGN(4);
    2 n0 K5 e) e; X
  61.     KEEP(*(.isr_vector)) /* Startup code */% }8 g& U% b% v4 ~
  62.     . = ALIGN(4);$ Z) e$ k4 e* b. T9 u" a; @
  63.   } >FLASH4 ]8 _3 f5 h- o

  64. % W& s7 d: ]" r5 G( ?
  65. " [& C  Q4 h! f3 U# ~) I/ u) G) ^
  66.   /* The program code and other data goes into FLASH */- e6 i& J9 c6 ^4 L
  67.   .text :$ }6 f( M, A9 x# ]8 U" M
  68.   {* f  Z9 y* @( H7 q, c
  69.     . = ALIGN(4);6 f$ a1 x- x8 ~+ V! r6 d: }
  70.     *(.text)           /* .text sections (code) */
    4 F) C- Y) U' d3 T* z, U2 R
  71.     *(.text*)          /* .text* sections (code) */
    - T7 O) _# d; F7 K; Z% J
  72.     *(.rodata)         /* .rodata sections (constants, strings, etc.) */8 |0 o  n4 f* ?* g
  73.     *(.rodata*)        /* .rodata* sections (constants, strings, etc.) */
    ! m9 ^8 ^7 Y( H! M7 d  D' r
  74.     *(.glue_7)         /* glue arm to thumb code */
    4 I. Z# n* g5 r" L
  75.     *(.glue_7t)        /* glue thumb to arm code */
    & H6 V/ ^2 w  q1 \# b* U
  76. # I- V( T/ x+ ^) Z8 _1 R( ]

  77. , f7 ~" M$ N& J- N5 B* V; W( g4 R
  78.     KEEP (*(.init))
    % w3 L0 b4 s* Y* T) t* s
  79.     KEEP (*(.fini))& N6 L8 I3 P$ A( w2 a

  80. ( W# S  \+ V+ U2 }$ {
  81. : @7 L/ y/ w  t: T& ~' C% b$ K
  82.     . = ALIGN(4);
    ) d. `+ {1 E3 a2 r1 W
  83.     _etext = .;        /* define a global symbols at end of code */
    + ~: O. j4 E0 r* l1 f3 \$ P
  84.   } >FLASH2 j9 R5 j+ q( J+ C2 i
  85. - \" i: N! J+ s2 A; L. s
  86. 6 w9 `% s/ H+ o; \# S4 |( J

  87. . F8 y8 E( d0 A

  88. 1 q1 i% ?) G' I+ u1 l; n
  89.    .ARM.extab   : { *(.ARM.extab* .gnu.linkonce.armextab.*) } >FLASH$ N9 p7 J7 Y( o6 `: ^" o/ R
  90.     .ARM : {" I: J/ h6 L3 `6 {& m, l0 K
  91.     __exidx_start = .;
    - O# n. p! O2 W- J: i" l* Y# N6 V
  92.       *(.ARM.exidx*)5 c+ f+ @1 t6 Q/ _. e
  93.       __exidx_end = .;
    2 R* T( t( I! v2 G7 ^7 m. V
  94.     } >FLASH
    9 \3 c3 z) L3 x& E9 H

  95. - x* @4 w, f; i7 ^" j: ]0 _
  96. : J; t: ]7 F( h/ ^
  97.   .ARM.attributes : { *(.ARM.attributes) } > FLASH
    ) K$ Z( X- u+ O
  98. $ V' ?' w; y- x& V9 B4 T
  99. 7 r% L' T1 P* y2 E4 k
  100.   .preinit_array     :) a  H7 x+ s1 c" C3 u
  101.   {. U; @& O  `- H8 S3 g$ b
  102.     PROVIDE_HIDDEN (__preinit_array_start = .);
    ; l: {" C7 h6 m. N. U4 X5 d
  103.     KEEP (*(.preinit_array*))+ [6 x; g) }" J$ {5 M3 m0 L
  104.     PROVIDE_HIDDEN (__preinit_array_end = .);
    * J+ R+ W( ^$ X: Y% j
  105.   } >FLASH
    # Y  L* L" m, H! O5 o, O! ]
  106.   .init_array :
    0 \' ?5 N8 R+ I  l
  107.   {# h4 r6 q) E% P/ V, k6 o' Y. ~1 z
  108.     PROVIDE_HIDDEN (__init_array_start = .);
    * x% h% {" B* s" ]1 f2 M9 v$ x) J
  109.     KEEP (*(SORT(.init_array.*)))! }$ Y6 P* t$ [
  110.     KEEP (*(.init_array*))+ ^6 o6 _9 Z; f: g# h
  111.     PROVIDE_HIDDEN (__init_array_end = .);
    ! m% I5 t) b: g$ n% K# d
  112.   } >FLASH
    0 q3 g9 f: {" \2 u3 q2 l# r  @
  113.   .fini_array :8 b  J4 K6 {1 F$ [# Y  u0 d
  114.   {
    # R  K1 |) j1 }3 K
  115.     PROVIDE_HIDDEN (__fini_array_start = .);
    , b8 U' O3 V0 b; l/ ?& {' G
  116.     KEEP (*(.fini_array*))
    & J% z) U% ^% p. x4 ~6 H4 B! j
  117.     KEEP (*(SORT(.fini_array.*)))/ w8 P6 u, i8 [9 q4 L5 G
  118.     PROVIDE_HIDDEN (__fini_array_end = .);
    * r; h2 M: S0 W  j6 w+ X% c
  119.   } >FLASH4 D9 z  H$ o8 V4 ?

  120. . w9 F& c6 k) O8 L- L! R/ m" ]

  121. ! Q1 a2 k" S# C7 w+ N9 F
  122.   /* used by the startup to initialize data */
    6 p+ C$ K1 d6 P: U& F
  123.   _sidata = .;/ R8 O* R+ s/ y1 h
  124. 1 c( l1 b) ]+ _/ Y0 ~
  125. ! g, Q* q% q- {' m* k: z: f
  126.   /* Initialized data sections goes into RAM, load LMA copy after code */& I2 m/ g1 P1 f- ^- i  T9 C3 k
  127.   .data : AT ( _sidata )9 c0 j' ]8 ^: _+ U
  128.   {) w) A) Y9 z' C. U7 i2 K
  129.     . = ALIGN(4);
    8 J# ?2 p0 Q, w; Q
  130.     _sdata = .;        /* create a global symbol at data start */
    1 X1 c3 E, b/ I+ |" H+ D
  131.     *(.data)           /* .data sections */
    % ]9 l4 ?+ l: C4 F
  132.     *(.data*)          /* .data* sections */$ A( w* u( D( J% U6 g

  133. 5 T8 N& [; K& Q. e/ d: G2 b. H
  134. & J1 ^. c! _. b' r8 S, T0 V$ ]
  135.     . = ALIGN(4);
    ! h. j1 @! r' b$ |$ o: f
  136.     _edata = .;        /* define a global symbol at data end */
    . z' Z7 M1 G( p& J
  137.   } >RAM7 Q; j/ J8 h' x: d
  138. 5 N6 \5 |, y, U3 d, b- R  A" y

  139. " M- T9 v# D, {
  140.   /* Uninitialized data section *// |0 `0 _5 ^: Q. n' B. T3 X1 m: o
  141.   . = ALIGN(4);
    7 X: a. Q  ]  X1 d; b* t
  142.   .bss :
    ) H( j; I& x  D2 I$ {7 j* j/ P; o7 z) t
  143.   {) t/ E* d0 K1 [6 U8 X/ t
  144.     /* This is used by the startup in order to initialize the .bss secion */
    * n8 B7 Z3 l3 c# @3 {
  145.     _sbss = .;         /* define a global symbol at bss start */
    ! ]/ m2 w) A7 w* U
  146.     __bss_start__ = _sbss;
    0 N; Z( T0 l% m' i  s; s- U) D
  147.     *(.bss)
    3 j( ?! w+ C# `& e7 f1 g
  148.     *(.bss*)
    # |2 q4 K$ k4 @4 M! O
  149.     *(COMMON); J& b/ T! h# i5 h# K
  150. 6 }4 g  `4 ]: x) N
  151. + m$ B% q/ U+ o: X
  152.     . = ALIGN(4);
    1 g. ?$ J( q/ N; ~* A
  153.     _ebss = .;         /* define a global symbol at bss end */# m. _& q1 D! B/ b7 c
  154.     __bss_end__ = _ebss;& D( D" t8 k4 O( B2 o% {( k8 V
  155.   } >RAM1 [2 ]/ z7 F9 ~
  156. % \8 m8 d* ~. h* S( Z9 o4 \, R

  157. ! v( T* I7 a4 \+ n; C5 Z, F
  158.   PROVIDE ( end = _ebss );
      w8 \, x9 c; n" B
  159.   PROVIDE ( _end = _ebss );
    3 S) ^6 s5 m! P6 a* V. K
  160.   B, a# R; I1 X! l! e

  161. 6 A0 ?# O, ~" w
  162.   /* User_heap_stack section, used to check that there is enough RAM left */
    - G" m1 X& x% G2 C; r# G
  163.   ._user_heap_stack :1 i0 z% o' a1 ^9 o
  164.   {
    ) B. P4 I  d' R( l, y! `
  165.     . = ALIGN(4);+ y* V/ W' T, }6 Q- D0 V: T
  166.     . = . + _Min_Heap_Size;6 R8 y0 _' _; j3 u: Z4 O) j
  167.     . = . + _Min_Stack_Size;
    ) R5 h) j8 }' X
  168.     . = ALIGN(4);" @6 E, g: T3 F1 D* K5 S, n
  169.   } >RAM! u6 `6 t0 p& A7 L. ^, c! l

  170. / J  P) g. m% u. A

  171. " \+ {# G' N2 q( ?" p- \# f# e
  172.   /* MEMORY_bank1 section, code must be located here explicitly            */
    + k' q/ I. Q8 r. @" |3 w$ U7 O
  173.   /* Example: extern int foo(void) __attribute__ ((section (".mb1text"))); */8 f* X9 V' L6 [; I
  174.   .memory_b1_text :
      {  E+ f9 C7 D. @' E1 x
  175.   {6 Q0 F! p4 P! o5 M8 F
  176.     *(.mb1text)        /* .mb1text sections (code) */& t( u  Y* d3 m
  177.     *(.mb1text*)       /* .mb1text* sections (code)  */
    6 ?$ y4 F* F  _' `: F) V5 }
  178.     *(.mb1rodata)      /* read-only data (constants) */2 \( J% ?7 K; \) |& T9 F
  179.     *(.mb1rodata*)
    % s0 ~8 L- j1 M# |- r0 E
  180.   } >MEMORY_B1
    6 ?4 _% p) S* b' i6 {& [

  181. " n; f" ~9 U# j5 Y5 _

  182. . l2 v* r6 b9 s5 F  D
  183.   /* Remove information from the standard libraries */4 r/ f) T* W- j& d; G1 `" P: u/ e
  184.   /DISCARD/ :
    8 j/ s6 O9 n$ g- n
  185.   {/ A: a7 H+ H5 g! J& d2 I3 O, }# ]6 B. J
  186.     libc.a ( * )" q, x7 X7 c, }  k
  187.     libm.a ( * )
    0 `& E, B" y. v9 V$ u2 l
  188.     libgcc.a ( * )
    ( [" D4 M- O) {  }, o& p, V' a
  189.   }
    ( d2 V. y2 J. r. Z5 Z
  190. }
复制代码

3 m8 Q0 `) T+ d4 s/ S: \" i
  • 最终目录文件如下9 u( U( e- }9 C$ K* {) L2 E4 L
# {0 m/ j' L3 D: ^8 q8 b7 j5 k  w/ s1 A
微信图片_20240615160620.png
2 k9 X, c+ H; A2 Y+ b! O2 x8 o  B

. C& q! i3 q- W2.在EIDE中使用标准库时的设置(无Makefile)
) M( V4 i7 e5 Q% e& ma.切换到EIDE环境下
& m9 a0 I- l( S$ ?6 F  `
! O1 G. `+ ~1 g7 I
微信图片_20240615160623.png 7 O  J. U0 }: n( W/ d

) R. \( S) ]  [ 微信图片_20240615160627.png
7 A( I6 i$ ^1 \& L6 y! I3 a. ?$ k
0 K4 R. }- G5 ?" G7 b% [( c
b.右键项目资源-点击添加源文件夹-选择普通文件夹,导入Keil工程文件及文件夹; x+ g4 H' a. Z3 d, D+ A3 k  [

6 T4 C" m# F7 }% I
微信图片_20240615160629.png / H: B( Q8 Y7 Q# Y  d4 @( D
' _; R3 i2 y% c8 i3 R; ]
微信图片_20240615160632.png 5 P$ Z! o2 H- Q9 k, o
2 p3 i  r2 s# z
微信图片_20240615160635.png ( k% k2 ?5 p3 m, i, T
! R1 y9 Q1 J& F) l7 U# A! {' z
文件目录如下:. U: ]& p) N# H/ R" |

' a& O& Q" J# [7 c# q! \
微信图片_20240615160638.png
+ l0 s* e1 b7 U6 [; H1 K; u
% H2 ^9 m0 o6 b7 U( B3 r3 vc.点击+号安装CMSIS芯片支持包# ]! _8 ?( ^3 {

; N+ F3 ^& f+ G5 {& s7 {& f
微信图片_20240615160641.png / n) j0 n" z) C/ s8 e( G+ y4 O& k: G

0 q( ]3 [+ l5 k6 m6 K 微信图片_20240615160652.png " h- B* w! X" x# e- _1 O0 a3 S! V

' y/ F$ K' T/ s% w 微信图片_20240615160656.png 8 R* `  Y& `; M# N  g) N- T

- r2 l# v9 y9 L4 P' J; pd.修改构建配置为gcc
1 z+ F8 H7 p% o% w, B
5 G) h1 r% H3 W9 ?
微信图片_20240615160659.png
$ n% r+ `( I) L% r' w
- z+ d5 X/ r5 V8 ]! K/ [+ De.烧录配置为STLink/OpenOCD
/ X# g6 Y  N! j$ Y8 g- I* \2 `6 A$ k$ V- Y
微信图片_20240615160704.png   x8 [$ A0 D! n0 h
4 w0 t. ~5 t* q1 i) @  ^* }7 U
f.添加arm-none-embed-gcc安装目录下的/ARM/ARMCC/include和/ARM/ARMCC/include到包含目录。
$ m) D& R: V0 y1 t2 X. u( V( @* e# d& E  m: R1 Q
微信图片_20240615160707.png   K" B' l; T* B; p$ p! L

- f3 C8 ]1 `$ V/ B- `" Cg.添加__C_ARM、STM32F10x_MD、USE_STDPERIPH_DRIVER到预处理宏定义+ G: W3 C0 Z: y
. N- I- @9 P, T3 [9 a7 ]  {
微信图片_20240615160710.png ' B2 _& R7 K" v+ V$ Q

' e* D' }2 {# N( `9 b+ V" Jh.此时编译可能会有下述报错$ }7 D' S# m# j+ K' s5 n, S
  1. C:\416: Error: registers may not be the same -- `strexb r0,r0,[r1]'* B  o7 D$ D* }8 I2 O1 w
  2. C:\436: Error: registers may not be the same -- `strexh r0,r0,[r1]'
复制代码

# `9 X: K* b' o: T& K4 f9 y! j
# Y" g! i3 Y- x( V# X
( V1 G( k7 t- C0 v% W( d! @
打开src\Libraries\CMSIS\CoreSupport\core_cm3.c文件,将 736行,753行 中的 “=r"修改为”=&r",如下
  1. uint32_t __STREXB(uint8_t value, uint8_t *addr)
    % ^- w- C9 M  {# J- [: c0 b
  2. {0 [, L) r8 B: i8 R" j# M
  3.    uint32_t result=0;
    ; F- q1 x  X) \) T/ n2 X8 h

  4. 2 @' L. L6 p, f- L0 Z% J. e, P
  5.    __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );1 P# l. u% `/ N7 B, a4 y
  6.    return(result);: m$ a1 }. @) G. c
  7. }. T6 y# u1 }! u* n' {: N5 c6 z1 P

  8. : T% u# p0 I6 K: ^) Z
  9. uint32_t __STREXH(uint16_t value, uint16_t *addr)6 }8 U4 h) w1 |$ U( c$ x6 `
  10. {
    , V" k8 s" \' g7 b7 d9 o  a: U1 p; w+ G
  11.    uint32_t result=0;
    7 [$ q) H7 Q$ F* v; h1 n" X$ T9 u- d4 r
  12. 8 P/ ?. N% {* _( {, G" E/ @
  13.    __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );5 _, L. F3 |8 f
  14.    return(result);
    9 J5 A/ q" W( Q4 k4 q8 x
  15. }
复制代码
8 `+ o3 U9 g+ ^/ {0 A! R
  • ctrl+shift+p,配置c_cpp_properties.json文件图片6 b& ?' C) c2 c# r
8 ?+ q9 u& J5 z5 n- F
微信图片_20240615160713.png . r$ e7 j) A; e; n! W. I) }9 L
  1. {! ^$ M+ y0 x# w1 J1 I
  2.     "configurations": [
    4 o7 U* B( I% U. z% w1 V
  3.         {
    3 `# o! V  g) C1 J3 c
  4.             "name": "Win32",8 `  O- ^9 O/ g' v
  5.             "includePath": [
    0 F2 c& Y9 A3 t' W6 n" l! P
  6.                 "${workspaceFolder}/**",
    3 }4 L# [  |, x% F
  7.                 "C:/Keil_v5/ARM/ARMCC/include/**",* I* ?- B; K' T. h1 z5 |. h
  8.                 "C:/Keil_v5/ARM/ARMCC/include/rw/**",
    7 l# H8 t* v. t7 K/ A
  9.                 "${workspaceFolder}/CORE"
    ' P5 E% h/ Q0 E0 z* `
  10.             ],. z& a2 ]  Z4 c
  11.             "defines": [
    ' C5 b9 I2 c+ a/ I
  12.                 "_DEBUG",+ _4 }2 X( x7 y# I
  13.                 "UNICODE",/ T5 U" @1 J/ b
  14.                 "_UNICODE",4 ]! m, D, C! X0 u' j0 b, ~1 p/ @% y
  15.                 "STM32F10X_MD",( S$ o8 N* V% B% E% ]
  16.                 "USE_STDPERIPH_DRIVER",
    ( e* P& ^3 M8 j: C8 B  [1 r
  17.                 "__CC_ARM"6 p2 |* h$ p- N. \+ c0 B
  18.             ],
    ! m, T/ u; U4 A/ z! p, i7 R
  19.             "cStandard": "c99"
    9 {* z: Y! L. o0 h" Z$ U0 B  e7 C
  20.         }4 u  m+ N6 B. Y" K, G% f
  21.     ],
      n4 v: N0 q0 ~3 Y, t$ h; Q* c
  22.     "version": 4
    8 i7 B! E& c) H) P7 }2 p

  23. 8 |: u. W, Z( W4 T6 s
复制代码
0 U! n2 E- `1 _/ \
3.编译工程
" O; @5 h9 v* n6 {$ `& |9 Q/ V6 c7 @2 ~& N, o4 _) C; S- k
4.一些问题的处理:
) k- R9 y0 c% y; R- ]1 @  qa.编译成功,但下载后没有任何反应。
& h% X( p/ Z* ?. x( X6 F注意检查stm32_flash.ld文件内容* w8 @( I# b$ J9 R: V
  1. /* Highest address of the user mode stack */& e9 h1 ^$ T+ B
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);    /* end of 64K RAM */
复制代码
" s! F  ?9 h0 a
注意对应芯片型号
5 b2 G3 E! b6 a7 B+ [( v
  1. /* Specify the memory areas */) P: [) Q0 _  j1 C! P
  2. MEMORY+ P# t/ L* c$ t; c* b, S
  3. {
    $ w! F( ^7 m! U+ K4 o
  4. RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 20K
    * ~8 A* T: x: Z# U7 U
  5. FLASH (rx)      : ORIGIN = 0x8000000, LENGTH = 64K5 E" S9 ~$ y; n2 b, W
  6. }
复制代码

# E; U3 h8 a1 |& T; Mb.vscode提交(commit)代码时卡住
) `* J: u$ D( V  j4 S$ }- Y3 T% p6 j; A' B& Y& z" H% w( L
微信图片_20240615160715.png
1 h; j, o( d! A- ~! C7 N1 j4 A+ L" M' U+ H& m% L
微信图片_20240615160718.png
4 `9 `9 F9 g& D9 a- |
) C- |/ H# Y, l' [# U5 M3 q1 g 微信图片_20240615160722.png   U$ T+ U2 A+ v2 H
1 {1 w( m# o4 f
设置的这里选择的默认选项影响了commit,当commit却不添加任何消息时,会默认生成一个文件来替代消息并提交,而服务器无法接受这样的消息。
3 a# N9 V; T! }) H/ q8 \& w: j: x- I; g9 ?" d( ~0 ?) ^  r5 i7 W8 s1 g  C
c.结束. [8 w2 O% Y% `9 }
; g, K, l" t/ i' Q3 t; E
5.调试工程% ~3 @1 k5 Q7 \( y
a.添加launch.json
0 L. S2 b  I% N" v$ L进入一个C文件,点击右上角按钮生成launch.json* h! E' ^, p5 _* E( C0 G

) Z- m. _* m* g* B9 H" Z7 L
微信图片_20240615160726.png 7 M% t$ K5 ^. i. n
. n' E% F5 O) S  }! w
b.修改launch.json为下述内容8 e+ K& k" Y# q* P' [
  1. {6 q$ a* ]7 i3 ~8 ]8 m
  2.     // 使用 IntelliSense 了解相关属性。
    9 y) x3 \, O; e/ P1 ]3 {" w/ [4 y
  3.     // 悬停以查看现有属性的描述。. l* Q7 X! [& w8 Q& r* x1 C
  4.     // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=8303878 ]; V: Q+ |  Q" L  [" z) T
  5.     "version": "0.2.0",# ^, Q: @1 _2 h' s$ P
  6.     "configurations": [2 p) m) {, |# _1 u
  7.         {
    7 \' t. z, {7 e; v
  8.             "name": "Cortex Debug",
    7 e5 q& S# [8 X( @' R
  9.             "cwd": "${workspaceRoot}",  // 输出路径- Q6 ]8 E2 j7 }, G0 G3 a& ~4 G
  10.             "executable": "./build/Debug/${workspaceRootFolderName}.elf",    // 要调试的程序, V9 h/ |8 {. h% K0 C% i" H
  11.             "request": "launch",% S/ w* C! B0 D  R3 H/ Z2 d
  12.             "type": "cortex-debug",
    1 V+ |( }$ m+ H- `. N
  13.             "servertype": "openocd",    // 调试器选择
    3 [. A  e6 M" t$ }$ e. P2 _6 K# A
  14.             "device": "STM32F103C8",    // 使用J-link GDB Server时必须;其他GBD Server时可选(有可能帮助自动选择 SVD文件)。支持的设备见 https://www.segger.com/downloads/supported-devices.php
      ~3 W! u$ A3 h! X5 O8 c1 `
  15.             //"svdFile": "./STM32L15xC.svd",  // svd文件,有这个文件才能查看寄存器的值,每个单片机都不同。可以在以下地址找到 https://github.com/posborne/cmsis-svd下载$ y0 |/ C- h3 `+ K* C$ M
  16.             "interface": "swd",
    1 D1 U# G. P# i7 K
  17.             "configFiles": [
    4 N, o& E4 o1 m
  18.                 //"${workspaceRoot}/openocd.cfg",  // *可以通过加载该文件来配置& ?2 {: p  i$ S
  19.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/interface/stlink-v2.cfg",* C1 H7 K3 D2 T# G2 I6 X- P9 K
  20.                 "C:/Users/ct/.eide/tools/openocd_7a1adfbec_mingw32/share/openocd/scripts/target/stm32f1x.cfg"( N$ Z  _: s0 L& H- G. w
  21.             ],4 Y; _( K3 Q# Z5 a
  22.             "runToEntryPoint": "false",
    # v4 \, |+ \0 {4 n7 _8 K
  23.             //"runToMain": false,1 V4 j9 T4 g) L. K8 ~  S, G4 g% w
  24.             //"preLaunchTask": "Build",   // 在调试前预先执行的任务,此处是tasks.json中的  W' N+ r  k" Z
  25.             //"armToolchainPath": "C:\\Program Files (x86)\\GNU Tools ARM Embedded\\5.4 2016q3\\bin"    // 如果没有把 arm工具链路径添加到系统环境变量,则需要这条指令添加你的路径' R0 N1 S9 s9 F, _4 P" h1 S% Z/ ]
  26.         }
    9 `! g9 e5 [. F# b4 j
  27. ; Q; ?" V" Z+ _! ^! ]
  28. }
复制代码

* w, n, P! t7 N( Q3 A5 j上述最重要的是引入openocd的路径。
4 z1 y! Q: H( l' a6 W" b( t
* x& v0 X, N3 r; A
1 W6 z5 T/ F. `  N( A
c.点击播放按钮进行调试+ W/ ]! g, s, u+ X

9 V. M3 z+ P; E( s' ^: Z
微信图片_20240615160729.png
! ]& ?- |9 s8 f5 I' R3 D+ H$ L& w
* Z, A8 R' B% Y( q6 M$ `
6.结束" S; Y, p1 }& Y1 X, n+ z

3 Y, d4 d( S% a  |
7 @+ s% c! E8 R9 h( r5 Q0 L' W+ P5 }' u  V% |# A
转载自: kevin
4 |* A% v8 p4 Y$ L2 n! [- B如有侵权请联系删除: d2 Q5 k1 ~* j, d$ u' e
- R* H7 z/ g& G5 Y

0 T# y8 c' n5 f9 W' L
微信图片_20240615160549.png
收藏 评论0 发布时间:2024-6-15 15:37

举报

0个回答

所属标签

相似分享

官网相关资源

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