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

【经验分享】STM32开发项目:STM32CubeIDE中如何手动修改MCU的型号

[复制链接]
STMCU小助手 发布时间:2022-4-14 10:31
背景介绍
* @* }/ s# P# e" v笔者在开发的时候,习惯应用自己的一套函数扩展库与工程模板,因此每次开始新的项目开发时,就会将上一个项目工程直接复制一份,在其基础上进行开发。当新项目与原项目的单片机型号不一样的时候,就涉及到如何将工程中的单片机型号的修改过来的问题。
4 v% ^7 D: p* X" x% _5 b, n' |% x  m  g3 ?3 @
本文将以工程中MCU型号从STM32F103C8Tx改为STM32F103VCTx为例,说明一下具体的操作步骤。+ E2 `; U5 N( S- w% C7 x3 m; u

* Z: E( p; u0 G. S. [; D, h操作步骤1 A" \" y' [" V+ t; j8 z4 F: b# H
修改工程文件.cproject
9 ^4 G) g9 t' \& E( i
用文本编辑器(NotePad++)打开.cproject工程文件,采用查找替换的方式,将工程文件中的原单片机型号“STM32F103C8”替换成“STM32F103VC”并保存。.project工程文件中没有需要修改的内容。
+ U5 B$ L9 B6 L+ P1 ?- K
& v* M9 r; b; f% J% s" r删除部分工程文件
8 A& C0 ^$ H) ~% N删除XXX.elf.launch文件与XXX.map文件,这两个文件默认在工程目录文件夹中,在设置Run/Debug Configurations的时候会自动重新生成。
% ^/ M; |8 k& R' b0 H! l
8 ?. a1 ?$ ^. w" ~: z$ H替换启动文件0 L- K; C1 i$ W6 E0 ~0 m$ @% Y
将原来型号的启动文件(XXX.s文件)替换为startup_stm32f103vctx.s,这个启动文件可以通过在STM32CubeIDE中新建一个MCU型号为STM32F103VCTx的工程并自动生成代码而获得。也可以在源码中同时保留这些文件,而在Makefile中指定调用的文件名。
& F: V8 I- D1 T0 X( X. g& U! A0 P- h0 }6 {
替换LinkerScript文件# a9 L, G1 S) L1 N2 {2 i, e' `) G% Y
将原来型号的链接文件(XXX.ld文件)替换为STM32F103VCTX_FLASH.ld,这个链接文件可以通过在STM32CubeIDE中新建一个MCU型号为STM32F103VCTx的工程并自动生成代码而获得。也可以在源码中同时保留这些文件,而在Makefile中指定调用的文件名。8 y' O# `  Z) b
" i3 ?* p/ A1 W  z2 \8 u% I2 m5 q
当然也可以直接修改原来的链接文件:
8 k) A/ h/ E* s8 L* ]" d
6 X$ c2 S( b; D
  1. /* Highest address of the user mode stack */! }* I  q' m3 h: B
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);        /* end of "RAM" Ram type memory */
    9 }; |3 f/ u* P9 Y- g% y
  3. * e, L7 d( h% K3 p
  4. _Min_Heap_Size = 0x200 ;        /* required amount of heap  */. w% |" V0 M/ n- N, v7 e
  5. _Min_Stack_Size = 0x400 ;        /* required amount of stack */
    - J/ [; s2 a5 X

  6. 8 A  L. N9 F0 {$ ~8 O2 O- x
  7. /* Memories definition */
    ( u7 h+ T7 O5 p, V- k5 O
  8. MEMORY2 P7 t1 h! D: m+ x
  9. {
    5 {. w% g/ v  M5 B, C5 v2 Z
  10.   RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 48K
    ! t& ?+ ~. A' F6 O. I$ M2 j$ g
  11.   FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 256K
    : a; Y; [$ W1 P3 i( ?
  12. }
复制代码
5 T* m6 F) i3 \6 i
主要修改的地方就在堆栈空间分配与RAM, Flash空间的定义。
! h. _0 L  A' k( }( e" K+ A" N3 V. ^# h  f( \
修改Makefile文件
1 r) e8 [. L( |' L& z( l主要修改涉及到单片机型号、启动文件、链接文件等的内容:
4 b- U9 ]8 C. d3 j: c
/ L# O' K4 ?! t* y  L. A; y6 C& Q
  1. LINK_SCRIPT = "STM32F103VCTX_FLASH.ld") \6 Q: B3 c2 A- A7 E$ K+ Y

  2.   {+ H" x; q. w$ x$ C
  3. ASSEMBLER_FLAGS =-c -g -O0 -mcpu=cortex-m3  -mthumb  \* G, w; x" ~4 w
  4.         -D"STM32F10X_HD" -D"USE_STDPERIPH_DRIVER"  -x assembler-with-cpp $(INCLUDE_DIR)
    7 n% K4 l; f. F" l+ m' Q$ @
  5.         
    8 i2 o" n" L( p- T; i$ E6 P
  6. COMPILER_FLAGS =-c -g -MMD -mcpu=cortex-m3  -O0 -Wall \) U. I: j6 c) A' p: w/ d. o
  7.         -ffunction-sections -fdata-sections -mthumb  \
    $ K3 J  X' T7 {! L. U7 L; u) S- Y" n
  8.         -D"STM32F10X_HD" -D"USE_STDPERIPH_DRIVER" $(INCLUDE_DIR)
复制代码

6 @# r4 m- ^. x# d/ w; J7 `启动文件由于属于汇编文件,因此只要替换即可:
6 r* D( F* _% s4 z! N
8 i" d( Q2 a, b' j) A. z0 b  O
  1. SRCSASM :=         $(wildcard */*/*/*/*/*/*/*/*.s) \
    6 t3 C# R: c- H/ N
  2.         $(wildcard */*/*/*/*/*/*/*.s) \* L" g# @- _! J  v
  3.         $(wildcard */*/*/*/*/*/*.s) \
    - ^8 {1 b/ q, N3 v& U9 x: b
  4.         $(wildcard */*/*/*/*/*.s) \
    ( u1 v0 x5 r1 D' s; l
  5.         $(wildcard */*/*/*/*.s) \
    2 N0 \4 M7 p% n3 n+ R, N
  6.         $(wildcard */*/*/*.s) \% y  E$ t# ]- x" ~
  7.         $(wildcard */*/*.s) \2 z3 K  v/ v5 u2 N& y5 u
  8.         $(wildcard */*.s)
    " S1 k3 K. _5 z0 y( ^
复制代码

2 Y. B; m5 }7 R4 H# [0 c+ }当然,如果存在多个启动文件,可以排除不匹配的型号对应的文件:
  K- f6 D/ A6 n) B4 }, y0 }. e" s* S( E
2 R9 ~- Z% g7 I5 w4 ?' ]
  1. #SRCSASM := $(filter-out Source/StdPeriLib/Startup/startup_stm32f103vctx.s, $(SRCSASM))
    : X; `+ T0 N+ ]( R. }2 t
  2. SRCSASM := $(filter-out Source/StdPeriLib/Startup/startup_stm32f10x_md.s, $(SRCSASM))
复制代码
' [! h0 C5 J9 l9 k
Alwhales库的修改
. a' H! ^9 Q% N9 m0 Q0 ^需要修改eeprom.h中关于flash划分作为eeprom的地址范围。4 Q1 c  y) f, ~

7 u- l( ~7 b1 T* a1 Q2 b对于C8T6型号,flash的结束地址为“0x08010000”;
9 h! Y7 X/ M$ @& D对于VCT6型号,flash的结束地址为“0x08040000”;
4 r0 A& m# {$ h! L' Z9 |# v/ ]: V- q
  1. #if defined (STM32F10X_LD) || defined (STM32F10X_MD)6 M, G* M& p$ e% g* M0 f: b
  2.   #define PAGE_SIZE  (uint16_t)0x400  /* Page size = 1KByte */
    4 d+ G" ]& m) S
  3.   #define FLASH_END_ADDRESS 0x08010000
    / M% N5 @, E6 }1 O0 c* l* B9 R% \  N9 M

  4. & Y1 t6 @2 r8 x0 f
  5. #elif defined (STM32F10X_HD) || defined (STM32F10X_CL)# l. f& V- O" o
  6.   #define PAGE_SIZE  (uint16_t)0x800  /* Page size = 2KByte *// I7 S$ v0 m& r# g+ X. y8 V
  7.   #define FLASH_END_ADDRESS 0x08040000
    : o8 p7 q  H+ }. T0 t1 E+ |0 C
  8. #endif. n# Q4 X+ b; o

  9. ' r1 {$ p3 `9 n9 Y
  10. /* EEPROM start address in Flash */
    7 I3 R8 r" z2 c1 R
  11. #define EEPROM_START_ADDRESS    ((uint32_t)(FLASH_END_ADDRESS - 2 * PAGE_SIZE))
复制代码

, V) n, w9 X/ }8 U$ h由于已经设置好了条件编译,只需要在合适的位置(默认在stm32f10x.h中):
, m, o5 e- w2 x8 f' g
8 |( P) R1 h; K+ d
  1. #define STM32F10X_HD
复制代码

- d' t+ s/ B' |标准库的修改
! f) w8 z4 G. \1 Q. P! p在stm32f10x.h文件中,需要根据所使用的MCU型号,选择对应的宏定义:7 g! _4 z9 d* U" y0 Y4 I9 W

6 {4 A. ^/ \$ r9 c
  1. /* Uncomment the line below according to the target STM32 device used in your$ Q4 Z3 o+ I, Q8 k- M# t* q( m: R
  2.    application 7 F" T0 G$ O$ n  n) S, Y( s
  3.   */
    , j8 e- h" A0 `$ g+ Y2 ^

  4. ) C5 j# q* \" T* ?2 V, ^
  5. #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL)
    : r6 z5 V% X, R
  6.   /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */
    ) `9 S  N  v+ E. `/ T. W
  7.   /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  & a" [/ j+ G+ w8 c+ E' N& I
  8.   /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */
    7 f1 D* i/ N8 g( [7 C) ], d+ k5 ?
  9.   /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  
    $ O9 w7 ~& G/ j$ ]: @
  10.   #define STM32F10X_HD     /*!< STM32F10X_HD: STM32 High density devices */" L4 U8 \6 l5 N# d6 U2 a/ ^$ h& r3 z  F
  11.   /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  3 J# r8 G& l7 {4 Q
  12.   /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */7 G- K% H# I/ f5 p' }/ J: Q9 k7 k
  13.   /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */. v9 U* H+ }' `$ U0 b5 g
  14. #endif
    5 V/ Z8 |- j; ~
  15. /*  Tip: To avoid modifying this file each time you need to switch between these
    " q0 O6 h- u2 t
  16.         devices, you can define the device in your toolchain compiler preprocessor.+ K2 H* s' @) k: B8 x
  17. / J8 c7 M& E# y: p& |5 f
  18. - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers# K! c2 M5 q; c; V- C
  19.    where the Flash memory density ranges between 16 and 32 Kbytes.  o6 v" H' T! S
  20. - Low-density value line devices are STM32F100xx microcontrollers where the Flash
    1 I7 l" U" `( t- @7 f9 e7 e
  21.    memory density ranges between 16 and 32 Kbytes.- {- E0 H' s% l9 c
  22. - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers" t4 O& v' B& ~+ T  {' a  C
  23.    where the Flash memory density ranges between 64 and 128 Kbytes.9 q/ R/ }- S. G5 f" J' d6 W6 Z- l
  24. - Medium-density value line devices are STM32F100xx microcontrollers where the 6 i# [- }9 c, a2 O
  25.    Flash memory density ranges between 64 and 128 Kbytes.   - g2 ]0 ]6 p7 Q/ |& U! d) s
  26. - High-density devices are STM32F101xx and STM32F103xx microcontrollers where
    % s" }4 X6 s/ r2 \
  27.    the Flash memory density ranges between 256 and 512 Kbytes.. t5 a  T6 u- g+ M
  28. - High-density value line devices are STM32F100xx microcontrollers where the + h  z; G* V) E7 h$ f+ p; n
  29.    Flash memory density ranges between 256 and 512 Kbytes.   / N' o) X6 }6 [1 h
  30. - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where8 G+ o& U/ {1 T7 L6 A
  31.    the Flash memory density ranges between 512 and 1024 Kbytes.
    0 m. j( M+ L( R) ?6 K" f1 w$ H
  32. - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.
    + M& g6 D; ]+ k! \' v3 W
  33.   */  |' ^- _% a# C) [& y
  34. " A; R4 }7 C: v6 ~6 C5 O$ O
  35. 4 T. [7 x' S6 F3 h) C; A# k
复制代码
2 P0 k1 R9 v% i. g- L  j
收藏 评论0 发布时间:2022-4-14 10:31

举报

0个回答

所属标签

相似分享

官网相关资源

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