1、
STM 32 GCC 安装
stm32 属于arm cortex-m系列thumb指令集,所以给arm用的arm-none-eabi就可以了,首先是下载,下载其中的gcc-arm-none-eabi-[版本号]-linux.tar.bz2,解压到你知道的目录会产生 gcc-arm-none-eabi的文件夹。
把该编译器添加到你的环境中:
在最后一行添加:
1 | export PATH= $PATH :/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin |
因为我之前有添加过树莓派的编译器了,所以实际上是这样的:
1 | export PATH= $PATH :/your_pi_gcc_dir/tools-master/arm-bcm2708/arm-bcm2708hardfp-linux-gnueabi/bin/:/your_stm_gcc_dir/gcc-arm-none-eabi-4_8-2013q4/bin |
两个编译器环境中间用冒号隔开;
注销后测试:
可以查看到该编译器的版本,就表示可以了。
2、工程环境的建立
(1)新建个工程文件夹,及其目录
(2)可以下载官方固件库,也可以下载第三方固件库。
下载好固件库之后,解压在libs目录下。然后就是编译固件库。
需要在工程根目录下新建一个Make.common文件,此文件不管是在编译固件库、还是在编译源文件的时候都会用到。需要根据你的自己的情况修改其中两个变量的值:STMLIB和TypeOfMCU。
3 | #This file is included in the general Makefile, the libs Makefile and the src Makefile |
4 | #Different optimize settings for library and source files can be realized by using arguments |
5 | #Compiler optimize settings: |
6 | # -O 0 no optimize, reduce compilation time and make debugging produce the expected results ( default ). |
7 | # -O 1 optimize, reduce code size and execution time, without much increase of compilation time. |
8 | # -O 2 optimize, reduce code execution time compared to ‘O 1 ’, increase of compilation time. |
9 | # -O 3 optimize, turns on all optimizations, further increase of compilation time. |
10 | # -Os optimize for size, enables all ‘-O 2 ’ optimizations that do not typically increase code size and other code size optimizations. |
11 | #Recommended optimize settings for release version: -O 3 |
12 | #Recommended optimize settings for debug version: -O 0 |
14 | # OptLIB= 0 --> optimize library files using the -O 0 setting |
15 | # OptLIB= 1 --> optimize library files using the -O 1 setting |
16 | # OptLIB= 2 --> optimize library files using the -O 2 setting |
17 | # OptLIB= 3 --> optimize library files using the -O 3 setting |
18 | # OptLIB=s --> optimize library files using the -Os setting |
19 | # OptSRC= 0 --> optimize source files using the -O 0 setting |
20 | # OptSRC= 1 --> optimize source files using the -O 1 setting |
21 | # OptSRC= 2 --> optimize source files using the -O 2 setting |
22 | # OptSRC= 3 --> optimize source files using the -O 3 setting |
23 | # OptSRC=s --> optimize source files using the -Os setting |
25 | # libs --> build libs only |
26 | # src --> build src only |
27 | # clean --> clean project |
28 | # tshow --> show optimize settings |
30 | # make OptLIB= 3 OptSRC= 0 all tshow |
32 | TOP=$(shell readlink -f "$(dir $(lastword $(MAKEFILE_LIST)))" ) |
36 | #Adust the following line to the library in use |
37 | #=========add by embbnux 根据你的库不同,调整这个地方的库目录地址====================# |
38 | STMLIB=$(LIBDIR)/STM 32 _USB-FS-Device_Lib_V 4.0 . 0 /Libraries |
39 | #=========add by embbnux 根据你的stm 32 芯片型号容量不同,修改这个地方的TypeOfMCU=======# |
40 | #Adjust TypeOfMCU in use, see CMSIS file "stm32f10x.h" #STM 32 F 103 RBT ( 128 KB FLASH, 20 KB RAM) --> STM 32 F 10 X_MD#TypeOfMCU=STM 32 F 10 X_MD#STM 32 F 103 RET ( 512 KB FLASH, 64 KB RAM) --> STM 32 F 10 X_HD#STM 32 F 103 ZET ( 512 KB FLASH, 64 KB RAM) --> STM 32 F 10 X_HD |
41 | #============================================================================# |
42 | TypeOfMCU=STM 32 F 10 X_HD |
43 | #============================================================================# |
51 | INCLUDE+=-I$(STMLIB)/CMSIS/Include |
52 | INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM 32 F 10 x/Include |
53 | INCLUDE+=-I$(STMLIB)/CMSIS/Device/ST/STM 32 F 10 x/Source/Templates |
54 | INCLUDE+=-I$(STMLIB)/STM 32 F 10 x_StdPeriph_Driver/inc |
55 | INCLUDE+=-I$(STMLIB)/STM 32 _USB-FS-Device_Driver/inc |
56 | COMMONFLAGS=-g -mcpu=cortex-m 3 -mthumb |
57 | COMMONFLAGSlib=$(COMMONFLAGS) |
58 | #Commands for general Makefile and src Makefile |
60 | COMMONFLAGS+=-O 0 |
61 | InfoTextSrc=src (no optimize, -O 0 ) |
62 | else ifeq ($(OptSRC), 1 ) |
63 | COMMONFLAGS+=-O 1 |
64 | InfoTextSrc=src (optimize time+ size+, -O 1 ) |
65 | else ifeq ($(OptSRC), 2 ) |
66 | COMMONFLAGS+=-O 2 |
67 | InfoTextSrc=src (optimize time++ size+, -O 2 ) |
68 | else ifeq ($(OptSRC),s) |
69 | COMMONFLAGS+=-Os |
70 | InfoTextSrc=src (optimize size++, -Os) |
72 | COMMONFLAGS+=-O 3 |
73 | InfoTextSrc=src (full optimize, -O 3 ) |
75 | CFLAGS+=$(COMMONFLAGS) -Wall -Werror $(INCLUDE) |
76 | CFLAGS+=-D $(TypeOfMCU) |
77 | CFLAGS+=-D VECT_TAB_FLASH |
79 | #Commands for libs Makefile |
81 | COMMONFLAGSlib+=-O 0 |
82 | InfoTextLib=libs (no optimize, -O 0 ) |
83 | else ifeq ($(OptLIB), 1 ) |
84 | COMMONFLAGSlib+=-O 1 |
85 | InfoTextLib=libs (optimize time+ size+, -O 1 ) |
86 | else ifeq ($(OptLIB), 2 ) |
87 | COMMONFLAGSlib+=-O 2 |
88 | InfoTextLib=libs (optimize time++ size+, -O 2 ) |
89 | else ifeq ($(OptLIB),s) |
90 | COMMONFLAGSlib+=-Os |
91 | InfoTextLib=libs (optimize size++, -Os) |
93 | COMMONFLAGSlib+=-O 3 |
94 | InfoTextLib=libs (full optimize, -O 3 ) |
96 | CFLAGSlib+=$(COMMONFLAGSlib) -Wall -Werror $(INCLUDE) |
97 | CFLAGSlib+=-D $(TypeOfMCU) |
98 | CFLAGSlib+=-D VECT_TAB_FLASH |
然后在libs目录下新建Makefile文件,用于编译固件库。其中牵涉到路径的问题要根据个人的情况进行修改。
2 | include ../Makefile.common |
11 | @echo -n "Building $@ ..." |
12 | @cd $(STMLIB)/CMSIS/Device/ST/STM 32 F 10 x/Source/Templates && \ |
15 | @cd $(STMLIB)/STM 32 F 10 x_StdPeriph_Driver/src && \ |
17 | -D "assert_param(expr)=((void)0)" \ |
18 | -I../../CMSIS/Include \ |
19 | -I../../CMSIS/Device/ST/STM 32 F 10 x/Include \ |
22 | # @cd $(STMLIB)/STM 32 _USB-FS-Device_Driver/src && \ |
23 | # $(CC) $(CFLAGSlib) \ |
24 | # -D "assert_param(expr)=((void)0)" \ |
25 | # -I../../CMSIS/Include \ |
26 | # -I../../CMSIS/Device/ST/STM 32 F 10 x/Include \ |
29 | @$(AR) cr $(LIBDIR)/$@ \ |
30 | $(STMLIB)/CMSIS/Device/ST/STM 32 F 10 x/Source/Templates/system_stm 32 f 10 x.o \ |
31 | $(STMLIB)/STM 32 F 10 x_StdPeriph_Driver/src/*.o \ |
32 | # $(STMLIB)/STM 32 _USB-FS-Device_Driver/src/*.o |
34 | .PHONY: libs clean tshow |
37 | rm -f $(STMLIB)/CMSIS/Device/ST/STM 32 F 10 x/Source/Templates/system_stm 32 f 10 x.o |
38 | rm -f $(STMLIB)/STM 32 F 10 x_StdPeriph_Driver/src/*.o |
39 | rm -f $(STMLIB)/STM 32 _USB-FS-Device_Driver/src/*.o |
42 | @echo "######################################################################################################" |
43 | @echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)" |
44 | @echo "######################################################################################################" |
编译该库:
就会在lib目录下生成libstm32.a,这个就是编译好的静态库了。
(3)建立工程编译ld文件
这个ld文件,在编译时告诉编译器把代码放到什么地址,根据芯片的内存以及flash容量不同有所调整。
在工程根目录下新建linker.ld文件
代码较长,请到我的资源里面下载,或者查看参考pdf里面的:http://download.csdn.net/detail/canyue102/6778837
这里说明需要修改的地方,根据芯片型号不同,选择相应的RAM FLASH大小。
7 | RAM (RWX) : ORIGIN = 0x20000000 , LENGTH = 64K |
8 | EXTSRAM (RWX) : ORIGIN = 0x68000000 , LENGTH = 0 |
11 | FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 126K |
15 | FLASH (RX) : ORIGIN = 0x08000000 , LENGTH = 508K |
19 | EEMUL (RWX) : ORIGIN = 0x08000000+126K, LENGTH = 2K |
在工程根目录下新建Makefile文件:
3 | include Makefile.common |
4 | LDFLAGS=$(COMMONFLAGS) -fno-exceptions -ffunction-sections -fdata-sections -L$(LIBDIR) -nostartfiles -Wl,--gc-sections,-Tlinker.ld |
12 | $(CC) -o $(PROGRAM).elf $(LDFLAGS) \ |
15 | -Wl,--no-whole-archive \ |
17 | $(OBJCOPY) -O ihex $(PROGRAM).elf $(PROGRAM).hex |
18 | $(OBJCOPY) -O binary $(PROGRAM).elf $(PROGRAM).bin |
19 | #Extract info contained in ELF to readable text-files: |
20 | arm-none-eabi-readelf -a $(PROGRAM).elf > $(PROGRAM).info_elf |
21 | arm-none-eabi-size -d -B -t $(PROGRAM).elf > $(PROGRAM).info_size |
22 | arm-none-eabi-objdump -S $(PROGRAM).elf > $(PROGRAM).info_code |
23 | arm-none-eabi-nm -t d -S --size-sort -s $(PROGRAM).elf > $(PROGRAM).info_symbol |
25 | .PHONY: libs src clean tshow |
34 | rm -f $(PROGRAM).elf $(PROGRAM).hex $(PROGRAM).bin $(PROGRAM).info_elf $(PROGRAM).info_size |
35 | rm -f $(PROGRAM).info_code |
36 | rm -f $(PROGRAM).info_symbol |
38 | @echo "######################################################################################################" |
39 | @echo "################# optimize settings: $(InfoTextLib), $(InfoTextSrc)" |
40 | @echo "######################################################################################################" |
差不多就好了,在src里面添加测试源码
主要是startup.c 以及main.c,这里就不在说明了,可以查看该pdf或者到我的资源下载
http://download.csdn.net/detail/canyue102/6778885
然后进入工程主目录,下make就好了.
2 | make OptLIB=0 OptSRC=0 all tshow |
然后,就完成了。