完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
0.前言
初学单片机的时候通常使用IDE(通常是keil),IDE的好处是上手快捷;但是IDE将很多东西屏蔽了,例如什么是编译、链接、加载文件等。编译、链接功能均是由一个个命令实现的,如果把这些命令比作工地上干活的工人,那么makefile就是指导工人干活的图纸,make命令这是负责解读makefile这张图纸的工程师。出于好奇心驱使决定尝试使用makefile方式编译stm32的程序。 先介绍总体思路,makefile只是一个工具,makefile也需要调用IDE背后的命令工具,所以要想实现用makefile编译STM32 程序需要分两步走:
1.1 IDE的bat文件 在keil下新建一个工程, 图1 设置工程属性 图2 选择生成batch file 如图2 所示 SETPATH=F:keilARMBIN40;C:Python27LibsitepackagesPyQt4;C:PROGRAMDATAORACLEJAVAJAVAPATH;C:WindowsSYSTEM32;C:Windows;C:WindowsSYSTEM32WBEM;C:WindowsSYSTEM32WINDOWSPOWERSHELLV1.0;D:FLASH MAGIC;D:PROGRAM FILES (X86)MATLABRUNTIMEWIN64;D:PROGRAM FILES (X86)MATLABBIN;D:PROGRAM FILES (X86)MATLABPOLYSPACEBIN;D:PROGRAM FILES (X86)FLASH MAGIC;D:softwareBluetooth Software;D:softwareBluetooth Softwaresyswow64;D:Program Filescommon;C:Program Files (x86)Microsoft SQL Server90Toolsbinn;C:Program FilesCMakebin;C:Python27;F:Program Files (x86);F:keilARMBIN40 SET ARMCC41INC=F:keilARMRV31INC SET ARMCC41LIB=F:keilARMRV31LIB SET CPU_TYPE=STM32F103C8 SET CPU_VENDOR=STMicroelectronics SET UV2_TARGET=led SET CPU_CLOCK=0x00000000 "F:keilARMBIN40ArmCC" --Via "main.__i" "F:keilARMBIN40ArmCC" --Via "stm32f10x_it.__i" "F:keilARMBIN40ArmAsm" --Via ".startup_stm32f10x_md._ia" "F:keilARMBIN40ArmCC" --Via "stm32f10x_gpio.__i" "F:keilARMBIN40ArmCC" --Via "stm32f10x_rcc.__i" "F:keilARMBIN40ArmCC" --Via "core_cm3.__i" "F:keilARMBIN40ArmCC" --Via "system_stm32f10x.__i" "F:keilARMBIN40ArmLink" --Via "led.lnp" F:keilARMBIN40fromelf.exe "led.axf" --i32combined --output "led.hex" 神奇的是,运行该bat文件(PS:bat是windows下的一种批处理文件,类似于linux下的shell脚本),竟然就可以生成想要的hex文件。看来keil的奥秘就藏在这个bat文件中了。bat文件分为两段,第一段是 几个SET命令,设置了一些变量;第二段是ArmCC,ArmAsm,ArmLink,fromelf.exe命令构成,但是 --Via “main.__i” 这种是什么鬼就不得而知。 1.2 编译 查看keil的帮助文档: --via=filename* This option instructs the compiler to read additional command-line options from a specified file. The options read from the file are added to the current command line. Via commands can be nested within via files. Syntax --via=*filenameWhere: *filenameis the name of a via file containing options to be included on the command line. Example Given a source file main.c, a via file apcs.txt containing the line: --apcs=/rwpi --no_lower_rwpi --via=L_apcs.txtand a second via file L_apcs.txt containing the line: -L--rwpi -L--callgraphcompiling main.c with the command line: armcc main.c -L-o”main.axf" --via=apcs.txtcompiles main.c using the command line: armcc --no_lower_rwpi --apcs=/rwpi -L--rwpi -L--callgraph -L-o"main.axf" main.c现在清楚了,编译一个文件需要指定各种编译选项,这些选项可以直接写在命令行中,同时可以将这些命令选项写在一个文件中,然后使用“--via”指明该文件。 打开生成的main.__i文件,内容如下: -c --cpu Cortex-M3 -g -O0 --apcs=interwork -IE:srcstm32CMSIS -IE:srcstm32StartUp -IE:srcstm32StdPeriph_Libinc -IE:srcstm32led -I "F:keilARMINC" -I "F:keilARMINCSTSTM32F10x" -DSTM32F10X_MD -DUSE_STDPERIPH_DRIVER-o "main.o" --omf_browse "main.crf" --depend "main.d" "E:srcstm32ledmain.c"这些都是执行armcc命令带的参数,-c,-I -g是比较通用,--cpu显然是指明CPU的类型,编写makefile的时候可以直接借用。 1.3 链接 执行ArmLink命令时候的使用的命令参数在文件led.lnp中,其中内容如下: --cpu Cortex-M3 "main.o" "stm32f10x_it.o" ".startup_stm32f10x_md.o" "stm32f10x_gpio.o" "stm32f10x_rcc.o" "core_cm3.o" "system_stm32f10x.o" --strict --scatter "led.sct"--autoat --summary_stderr --info summarysizes --map --xref --callgraph --symbols --info sizes --info totals --info unused --info veneers--list ".led.map" -o "led.axf"注意其中的--scatter "led.sct",该选项表示链接器ArmLink使用的链接文件led.sct; -o "led.axf",表示链接生成的目标文件。 知识点:hex,axf,bin,elf格式文件文件
fromelf.exe "led.axf" --i32combined --output "led.hex" 命令是讲生成的axf文件转换为hex文件,isp下载的使用的就是hex文件。 2.编写makefile 由之前的分析,知道了,怎么用命令将源文件转换为hex文件,下面就用makefile将这些命令组合起来。 2.1 安装windows版make工具 下载一个windows版的GNU make工具 ,安装到本地。http://www.gnu.org/software/make/manual/make.html 2.2 编写makefile 编写一个点亮LED的程序,程序本身由startup_stm32f10x_md.s和main.c两个文件组成。整个编译makefile由三个文件组成,分别是common_compile.mk,common_config.mk,Makefile common_compile.mk的内容如下 %.o:%.c $(ARMCC) $(CFLAGS) $(INC) $(CMACRO) $< -o $@ %.o:%.s $(ARMASM) $(ASMFLAGS) $(INC) $(CMACRO) $< -o $@ all:$(OBJS) $(ARMLINK) --libpath "$(KEIL_PATH)RV31LIB" $(LINKFLAGS) $(MAP) $(INFO) $^ -o $(TARGET).axf $(FROMELF) --bin -o $(TARGET).bin $(TARGET).axf $(FROMELF) --i32 -o $(TARGET).hex $(TARGET).axf del $(OBJHTM) $(OBJAXF) $(OBJS) # 若只是生成LIB库,只需要以下一条命令就可以了 # $(ARMAR) $(APPNAME).lib -r $(OBJS) .PHONY : clean clean: -del $(OBJS) *.map *.htmcommon_config.mk内容如下 SHELL=cmd.exeKEIL_PATH = F:KeilARMARMCC = $(KEIL_PATH)BIN40armcc ARMASM =$(KEIL_PATH)BIN40armasmARMAR = $(KEIL_PATH)BIN40armar ARMLINK =$(KEIL_PATH)BIN40armlink FROMELF = $(KEIL_PATH)BIN40fromelf TARGET =.outputstm32OBJMAP := .stm32.map OBJHTM := .output*.htm OBJAXF := .output*.axf CFLAGS := -c --cpu Cortex-M3 -D__MICROLIB -g -O0 --apcs=interwork CMACRO := ASMFLAGS := --cpu Cortex-M3 -g --apcs=interwork --pd "__MICROLIB SETA 1" LINKFLAGS := --cpu Cortex-M3 --library_type=microlib --scatter=led.sct --strict MAP := --autoat --summary_stderr --info summarysizes --map --xref --callgraph --symbols INFO := --info sizes --info totals --info unused --info veneersMakefile内容如下 include ./common_config.mk OBJS = .main.o .startup_stm32f10x_md.o INC += -I$(KEIL_PATH)INCStSTM32F10x INC += -I$(KEIL_PATH)RV31INC include ./common_compile.mk命令行中执行make命令,成功编译输出bin,hex文件。 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1786 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1622 浏览 1 评论
1089 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
730 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1680 浏览 2 评论
1942浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
739浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
576浏览 3评论
598浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
560浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 16:05 , Processed in 0.879606 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号