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

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

[复制链接]
STMCU小助手 发布时间:2022-4-14 10:31
背景介绍
. |& }5 f8 h  y8 k1 f笔者在开发的时候,习惯应用自己的一套函数扩展库与工程模板,因此每次开始新的项目开发时,就会将上一个项目工程直接复制一份,在其基础上进行开发。当新项目与原项目的单片机型号不一样的时候,就涉及到如何将工程中的单片机型号的修改过来的问题。
3 t, j3 J# H* b1 ]
5 i. L2 |6 Q5 o; i" {0 u本文将以工程中MCU型号从STM32F103C8Tx改为STM32F103VCTx为例,说明一下具体的操作步骤。" W4 o7 x( x+ D& c$ J

! h4 b( U! g, v8 B  e2 k; F5 t' p操作步骤
7 d. e" p5 P3 ]; j修改工程文件.cproject

! E5 Y. G/ s6 ?0 a6 p$ @4 T: P用文本编辑器(NotePad++)打开.cproject工程文件,采用查找替换的方式,将工程文件中的原单片机型号“STM32F103C8”替换成“STM32F103VC”并保存。.project工程文件中没有需要修改的内容。
+ i% D- ^1 o# i& H- G% B8 ?
, Z$ N7 `( _* t7 ^' q; c! V删除部分工程文件
- D5 _" c" I! u$ _# V7 Z& G删除XXX.elf.launch文件与XXX.map文件,这两个文件默认在工程目录文件夹中,在设置Run/Debug Configurations的时候会自动重新生成。
. N4 M6 e9 K3 x; z1 j6 p9 h
% H  h5 S1 ^+ X, o替换启动文件- p# V) U" X5 U  Z+ L& _
将原来型号的启动文件(XXX.s文件)替换为startup_stm32f103vctx.s,这个启动文件可以通过在STM32CubeIDE中新建一个MCU型号为STM32F103VCTx的工程并自动生成代码而获得。也可以在源码中同时保留这些文件,而在Makefile中指定调用的文件名。
6 J1 y3 [. r6 S6 M5 P, k6 D0 U# L/ \$ e3 [
替换LinkerScript文件
! x6 O" t7 H; h2 g& x将原来型号的链接文件(XXX.ld文件)替换为STM32F103VCTX_FLASH.ld,这个链接文件可以通过在STM32CubeIDE中新建一个MCU型号为STM32F103VCTx的工程并自动生成代码而获得。也可以在源码中同时保留这些文件,而在Makefile中指定调用的文件名。- k7 l% A- l3 q& ]+ f
* Z! o+ j( L5 H4 K0 z" c8 A' y
当然也可以直接修改原来的链接文件:; K+ d( v9 [3 O7 w/ Y# `! c

* R5 K& Q$ C( ^# U: _
  1. /* Highest address of the user mode stack */
    , ?* w+ K' v1 D- T( T1 ]* O
  2. _estack = ORIGIN(RAM) + LENGTH(RAM);        /* end of "RAM" Ram type memory */
    . d6 c5 L2 g( h/ w

  3.   m* ~- B- T* ?
  4. _Min_Heap_Size = 0x200 ;        /* required amount of heap  */: B  ^1 C3 w' W) o6 J; T5 o
  5. _Min_Stack_Size = 0x400 ;        /* required amount of stack */
    6 r" l1 u2 T& b4 N
  6. ; w# I; V! W) z2 c0 \+ d; B# Y/ u
  7. /* Memories definition */
    , S; u  D# z3 V5 d6 I& j5 R2 ?* s
  8. MEMORY5 t. y$ {3 a7 }- H2 |" p! c. o* L
  9. {
    - Y5 G+ y2 Q" V1 c4 H
  10.   RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 48K
    # _2 w" @, W" W; }8 b& u1 W
  11.   FLASH    (rx)    : ORIGIN = 0x8000000,   LENGTH = 256K7 \; ^% ?0 z) |* s5 N2 w
  12. }
复制代码
8 X( q+ R8 E% ]( l* w0 i& {
主要修改的地方就在堆栈空间分配与RAM, Flash空间的定义。3 x1 `! m- ~8 L1 g, Y9 L9 K; g

, b3 g5 a6 w! w8 k) H3 o0 V修改Makefile文件
3 v& ?/ }( Y8 q' r, p) Y1 t6 N主要修改涉及到单片机型号、启动文件、链接文件等的内容:
" w6 O1 _- \6 M8 E7 d4 _
5 J( u% Q0 h2 f% q( P1 i
  1. LINK_SCRIPT = "STM32F103VCTX_FLASH.ld"8 D- h. p  ]4 \) P3 e
  2. ! K& V7 {! N1 r4 ?% G" Q) D
  3. ASSEMBLER_FLAGS =-c -g -O0 -mcpu=cortex-m3  -mthumb  \* D5 b! o0 ~+ t+ Y
  4.         -D"STM32F10X_HD" -D"USE_STDPERIPH_DRIVER"  -x assembler-with-cpp $(INCLUDE_DIR)9 O' X- o2 w4 |* }$ `& O, Y
  5.         3 ?% ~8 e" s' P- {6 R. n3 C- v
  6. COMPILER_FLAGS =-c -g -MMD -mcpu=cortex-m3  -O0 -Wall \0 p3 E4 v% Y8 Y; z1 U0 i# N' X
  7.         -ffunction-sections -fdata-sections -mthumb  \, ^$ V$ e7 c. F2 a0 F1 m+ j5 X
  8.         -D"STM32F10X_HD" -D"USE_STDPERIPH_DRIVER" $(INCLUDE_DIR)
复制代码
# f: T% c  i) q7 X0 P
启动文件由于属于汇编文件,因此只要替换即可:
9 t3 C; C! ], U3 R% x& Q% r; S7 j% c) n2 r& W% Z, {) ]; m
  1. SRCSASM :=         $(wildcard */*/*/*/*/*/*/*/*.s) \
    5 V# i4 L0 M) S0 o8 @
  2.         $(wildcard */*/*/*/*/*/*/*.s) \
    7 i0 O( ~5 z0 W0 z7 F6 j# _
  3.         $(wildcard */*/*/*/*/*/*.s) \0 R5 B6 q. z  Y0 u2 ]- g
  4.         $(wildcard */*/*/*/*/*.s) \
      I- n0 \# n) N
  5.         $(wildcard */*/*/*/*.s) \! |/ N/ V5 X" t2 [6 C
  6.         $(wildcard */*/*/*.s) \
    , N3 ?: @+ G- W
  7.         $(wildcard */*/*.s) \
    0 }4 v4 z, x, s" O6 v1 y: \2 s
  8.         $(wildcard */*.s)
      x5 o9 H$ L3 ]9 D9 i
复制代码
" |& C7 q! r/ |9 `6 N
当然,如果存在多个启动文件,可以排除不匹配的型号对应的文件:
; O' O" z$ ?; A+ W9 \% j% O7 |" s/ G& I' T& S0 l" D5 W; p
  1. #SRCSASM := $(filter-out Source/StdPeriLib/Startup/startup_stm32f103vctx.s, $(SRCSASM))
    1 K7 @" v% \/ k# x: b
  2. SRCSASM := $(filter-out Source/StdPeriLib/Startup/startup_stm32f10x_md.s, $(SRCSASM))
复制代码
/ `. P* O* G! `$ f+ y1 D
Alwhales库的修改
( A& A# q, z  E7 Q) i6 H' i需要修改eeprom.h中关于flash划分作为eeprom的地址范围。7 P4 i/ O  n. g# a2 L9 D! g

) K* i& M, B# \/ N. l8 L对于C8T6型号,flash的结束地址为“0x08010000”;
/ K( M; ?# r4 x' o) j; h对于VCT6型号,flash的结束地址为“0x08040000”;
/ [: e9 L: [$ b1 h! p9 t1 p' P* {0 P: ~/ l
  1. #if defined (STM32F10X_LD) || defined (STM32F10X_MD)
    # j: M7 w  O* S; B8 P3 s, b
  2.   #define PAGE_SIZE  (uint16_t)0x400  /* Page size = 1KByte */" _, a* d& L+ _7 z! \2 `' Q2 u8 ~! X
  3.   #define FLASH_END_ADDRESS 0x080100008 w4 f' m  B9 o- g% p, V

  4. 9 ]4 M2 H( f! z. k8 e( W
  5. #elif defined (STM32F10X_HD) || defined (STM32F10X_CL)9 |, Z, N$ j0 I+ K, E% p
  6.   #define PAGE_SIZE  (uint16_t)0x800  /* Page size = 2KByte */, a( h5 v! \) S; r$ Q* Z  |6 x
  7.   #define FLASH_END_ADDRESS 0x08040000
    5 h/ E- \' H8 z" o
  8. #endif
    6 S- v# r! B& u' e% w5 W

  9. $ Z3 s! Y' V) W* s. k
  10. /* EEPROM start address in Flash */
    ; B. `1 @5 [! G5 h, x$ h  \% `: V9 m
  11. #define EEPROM_START_ADDRESS    ((uint32_t)(FLASH_END_ADDRESS - 2 * PAGE_SIZE))
复制代码
3 L) K. z( T& ^0 ~% U: M
由于已经设置好了条件编译,只需要在合适的位置(默认在stm32f10x.h中):2 ^) v' \/ H  Z! U/ o( m. I' \/ O
& Y( A+ L* @4 Q" X7 F
  1. #define STM32F10X_HD
复制代码
, N& {5 E- N% i
标准库的修改
3 U3 H. d' r) z9 ~) J4 G5 {在stm32f10x.h文件中,需要根据所使用的MCU型号,选择对应的宏定义:9 K  L0 t: e6 b* i: s
; f* F( |$ L5 ]4 k
  1. /* Uncomment the line below according to the target STM32 device used in your8 i9 k( A/ O- |: H. S  q
  2.    application
    9 g/ a8 }! ]- u& S5 _+ w/ N
  3.   */. a# Q2 \6 y4 t3 B" ]: `$ @
  4. $ p  i8 b% p2 G$ R  d2 P
  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) 6 ^- ]3 D, U: ?3 |; B( E
  6.   /* #define STM32F10X_LD */     /*!< STM32F10X_LD: STM32 Low density devices */' l6 i9 i% C  b, f4 c7 J
  7.   /* #define STM32F10X_LD_VL */  /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */  3 `8 j4 x/ S; b/ W  z/ F* ^" G) R
  8.   /* #define STM32F10X_MD */     /*!< STM32F10X_MD: STM32 Medium density devices */8 O  `/ v1 V( H! H7 U
  9.   /* #define STM32F10X_MD_VL */  /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */  - {4 T& H/ I; S5 i6 Q$ F5 L1 W
  10.   #define STM32F10X_HD     /*!< STM32F10X_HD: STM32 High density devices */3 M  g0 L/ N3 T3 Q
  11.   /* #define STM32F10X_HD_VL */  /*!< STM32F10X_HD_VL: STM32 High density value line devices */  
    5 B& i' _- p; V
  12.   /* #define STM32F10X_XL */     /*!< STM32F10X_XL: STM32 XL-density devices */" y" s% i  L  ]* Z
  13.   /* #define STM32F10X_CL */     /*!< STM32F10X_CL: STM32 Connectivity line devices */
    $ @+ \7 ~; D+ W) {+ d
  14. #endif9 Z+ S. H+ R7 l  M
  15. /*  Tip: To avoid modifying this file each time you need to switch between these
    % O: l3 A' [: e& ]% F
  16.         devices, you can define the device in your toolchain compiler preprocessor.
    : J* b  Q4 R9 q( J4 M3 c

  17. * y# F$ G% V, P8 T* T, G/ H! E9 d' p
  18. - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers! x' Z4 t/ b2 n
  19.    where the Flash memory density ranges between 16 and 32 Kbytes.
    8 Y+ [5 \, ?+ i; i
  20. - Low-density value line devices are STM32F100xx microcontrollers where the Flash# r/ |+ [% [$ S1 A* O+ [
  21.    memory density ranges between 16 and 32 Kbytes.
    6 n. a( o# \2 ~1 k. |4 Q
  22. - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers
    ; P) s% E0 A+ Q  A6 V& i5 m6 g4 k  C$ t$ x+ p
  23.    where the Flash memory density ranges between 64 and 128 Kbytes.
    % {- }6 j) b7 v7 ]% t) T. `: F7 Y% h4 M
  24. - Medium-density value line devices are STM32F100xx microcontrollers where the
    2 S4 A8 {( C# g# [/ l4 X: _1 p8 ~
  25.    Flash memory density ranges between 64 and 128 Kbytes.   
    ) Y: ^  E% _- `" a1 w2 q4 n; U
  26. - High-density devices are STM32F101xx and STM32F103xx microcontrollers where2 k, d8 X; q, q* {
  27.    the Flash memory density ranges between 256 and 512 Kbytes./ v: [, k& t! u- J) M8 {
  28. - High-density value line devices are STM32F100xx microcontrollers where the 5 v% Q0 ]" {' Y: Z6 X. y+ a
  29.    Flash memory density ranges between 256 and 512 Kbytes.   4 K. M: F0 m6 \+ o! C) Q# y& X
  30. - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where
    ; k* |6 k  p6 a
  31.    the Flash memory density ranges between 512 and 1024 Kbytes., p( p4 U$ y9 `/ a7 I! J1 L
  32. - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.0 A  U' P* T7 w
  33.   */; _  m4 X6 P: p& B$ y* ^, w5 C

  34. # g# s4 [' `+ j& i. P- t
  35. 0 k3 p1 F& S' S9 v7 i
复制代码
( Q" K1 j4 A8 S# P" w& ^/ z
赞 收藏 评论0 发布时间:2022-4-14 10:31

举报

0个回答

所属标签

相似技术帖

官网相关资源

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