背景介绍
* @* }/ 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
修改工程文件.cproject9 ^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- /* Highest address of the user mode stack */! }* I q' m3 h: B
- _estack = ORIGIN(RAM) + LENGTH(RAM); /* end of "RAM" Ram type memory */
9 }; |3 f/ u* P9 Y- g% y - * e, L7 d( h% K3 p
- _Min_Heap_Size = 0x200 ; /* required amount of heap */. w% |" V0 M/ n- N, v7 e
- _Min_Stack_Size = 0x400 ; /* required amount of stack */
- J/ [; s2 a5 X
8 A L. N9 F0 {$ ~8 O2 O- x- /* Memories definition */
( u7 h+ T7 O5 p, V- k5 O - MEMORY2 P7 t1 h! D: m+ x
- {
5 {. w% g/ v M5 B, C5 v2 Z - RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 48K
! t& ?+ ~. A' F6 O. I$ M2 j$ g - FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 256K
: a; Y; [$ W1 P3 i( ? - }
复制代码 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- LINK_SCRIPT = "STM32F103VCTX_FLASH.ld") \6 Q: B3 c2 A- A7 E$ K+ Y
{+ H" x; q. w$ x$ C- ASSEMBLER_FLAGS =-c -g -O0 -mcpu=cortex-m3 -mthumb \* G, w; x" ~4 w
- -D"STM32F10X_HD" -D"USE_STDPERIPH_DRIVER" -x assembler-with-cpp $(INCLUDE_DIR)
7 n% K4 l; f. F" l+ m' Q$ @ -
8 i2 o" n" L( p- T; i$ E6 P - COMPILER_FLAGS =-c -g -MMD -mcpu=cortex-m3 -O0 -Wall \) U. I: j6 c) A' p: w/ d. o
- -ffunction-sections -fdata-sections -mthumb \
$ K3 J X' T7 {! L. U7 L; u) S- Y" n - -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- SRCSASM := $(wildcard */*/*/*/*/*/*/*/*.s) \
6 t3 C# R: c- H/ N - $(wildcard */*/*/*/*/*/*/*.s) \* L" g# @- _! J v
- $(wildcard */*/*/*/*/*/*.s) \
- ^8 {1 b/ q, N3 v& U9 x: b - $(wildcard */*/*/*/*/*.s) \
( u1 v0 x5 r1 D' s; l - $(wildcard */*/*/*/*.s) \
2 N0 \4 M7 p% n3 n+ R, N - $(wildcard */*/*/*.s) \% y E$ t# ]- x" ~
- $(wildcard */*/*.s) \2 z3 K v/ v5 u2 N& y5 u
- $(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 ?' ]- #SRCSASM := $(filter-out Source/StdPeriLib/Startup/startup_stm32f103vctx.s, $(SRCSASM))
: X; `+ T0 N+ ]( R. }2 t - 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
- #if defined (STM32F10X_LD) || defined (STM32F10X_MD)6 M, G* M& p$ e% g* M0 f: b
- #define PAGE_SIZE (uint16_t)0x400 /* Page size = 1KByte */
4 d+ G" ]& m) S - #define FLASH_END_ADDRESS 0x08010000
/ M% N5 @, E6 }1 O0 c* l* B9 R% \ N9 M
& Y1 t6 @2 r8 x0 f- #elif defined (STM32F10X_HD) || defined (STM32F10X_CL)# l. f& V- O" o
- #define PAGE_SIZE (uint16_t)0x800 /* Page size = 2KByte *// I7 S$ v0 m& r# g+ X. y8 V
- #define FLASH_END_ADDRESS 0x08040000
: o8 p7 q H+ }. T0 t1 E+ |0 C - #endif. n# Q4 X+ b; o
' r1 {$ p3 `9 n9 Y- /* EEPROM start address in Flash */
7 I3 R8 r" z2 c1 R - #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
- 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- /* Uncomment the line below according to the target STM32 device used in your$ Q4 Z3 o+ I, Q8 k- M# t* q( m: R
- application 7 F" T0 G$ O$ n n) S, Y( s
- */
, j8 e- h" A0 `$ g+ Y2 ^
) C5 j# q* \" T* ?2 V, ^- #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 - /* #define STM32F10X_LD */ /*!< STM32F10X_LD: STM32 Low density devices */
) `9 S N v+ E. `/ T. W - /* #define STM32F10X_LD_VL */ /*!< STM32F10X_LD_VL: STM32 Low density Value Line devices */ & a" [/ j+ G+ w8 c+ E' N& I
- /* #define STM32F10X_MD */ /*!< STM32F10X_MD: STM32 Medium density devices */
7 f1 D* i/ N8 g( [7 C) ], d+ k5 ? - /* #define STM32F10X_MD_VL */ /*!< STM32F10X_MD_VL: STM32 Medium density Value Line devices */
$ O9 w7 ~& G/ j$ ]: @ - #define STM32F10X_HD /*!< STM32F10X_HD: STM32 High density devices */" L4 U8 \6 l5 N# d6 U2 a/ ^$ h& r3 z F
- /* #define STM32F10X_HD_VL */ /*!< STM32F10X_HD_VL: STM32 High density value line devices */ 3 J# r8 G& l7 {4 Q
- /* #define STM32F10X_XL */ /*!< STM32F10X_XL: STM32 XL-density devices */7 G- K% H# I/ f5 p' }/ J: Q9 k7 k
- /* #define STM32F10X_CL */ /*!< STM32F10X_CL: STM32 Connectivity line devices */. v9 U* H+ }' `$ U0 b5 g
- #endif
5 V/ Z8 |- j; ~ - /* Tip: To avoid modifying this file each time you need to switch between these
" q0 O6 h- u2 t - devices, you can define the device in your toolchain compiler preprocessor.+ K2 H* s' @) k: B8 x
- / J8 c7 M& E# y: p& |5 f
- - Low-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers# K! c2 M5 q; c; V- C
- where the Flash memory density ranges between 16 and 32 Kbytes. o6 v" H' T! S
- - Low-density value line devices are STM32F100xx microcontrollers where the Flash
1 I7 l" U" `( t- @7 f9 e7 e - memory density ranges between 16 and 32 Kbytes.- {- E0 H' s% l9 c
- - Medium-density devices are STM32F101xx, STM32F102xx and STM32F103xx microcontrollers" t4 O& v' B& ~+ T {' a C
- where the Flash memory density ranges between 64 and 128 Kbytes.9 q/ R/ }- S. G5 f" J' d6 W6 Z- l
- - Medium-density value line devices are STM32F100xx microcontrollers where the 6 i# [- }9 c, a2 O
- Flash memory density ranges between 64 and 128 Kbytes. - g2 ]0 ]6 p7 Q/ |& U! d) s
- - High-density devices are STM32F101xx and STM32F103xx microcontrollers where
% s" }4 X6 s/ r2 \ - the Flash memory density ranges between 256 and 512 Kbytes.. t5 a T6 u- g+ M
- - High-density value line devices are STM32F100xx microcontrollers where the + h z; G* V) E7 h$ f+ p; n
- Flash memory density ranges between 256 and 512 Kbytes. / N' o) X6 }6 [1 h
- - XL-density devices are STM32F101xx and STM32F103xx microcontrollers where8 G+ o& U/ {1 T7 L6 A
- the Flash memory density ranges between 512 and 1024 Kbytes.
0 m. j( M+ L( R) ?6 K" f1 w$ H - - Connectivity line devices are STM32F105xx and STM32F107xx microcontrollers.
+ M& g6 D; ]+ k! \' v3 W - */ |' ^- _% a# C) [& y
- " A; R4 }7 C: v6 ~6 C5 O$ O
- 4 T. [7 x' S6 F3 h) C; A# k
复制代码 2 P0 k1 R9 v% i. g- L j
|