STMCU小助手
发布时间:2022-12-11 15:29
|
生命在于运动,技术在于折腾,你是否厌倦了在keil、iar下孜孜不倦的写代码、debug,是否玩累了在外部编辑器下写代码,然后在转到ide下进行仿真、下载等操作呢?
仿真:
(2) 创建launch.json文件 如下图所示:
. k$ O2 l/ V1 `5 J) r2 a: m& W 然后选择Cotrex Debug即可创建好launch.json文件
; x5 B. Z, z9 A2 y% b: Z (3) 配置launch.json文件 稍微按照自己的芯片修改下就好,以FM33LC026为例:
然后将厂商提供的.svd文件放到你的工程根目录即可开始仿真,可以看变量、看外设寄存器、内核寄存器等等,还可以保存你的断点等。 然后实现这一切的核心就是makefile文件,不用管,我已经帮你写好了,而且全部中文注释,各种参数也是取自stm32cube的makefile参数,放心的用,放心的学! 然后我将在附件提供一个基于阿波罗开发板stm32f429igt6的点灯例程。如果的芯片不是stm32f429,但只要你的核是arm核,本例程本makefile,通通能用! 2 O1 T/ o& q" |* v 换芯片后你需要改以下内容: 1,找到你的芯片的基于gcc的启动文件和链接脚本,一般问厂商要肯定有的,不用自己写,然后替换到根目录下的2个对应文件
#************************************************************************* # ** # ** File : Makefile # ** Abstract : This is the introduction to the document # ** Author : wr # ** mail : 791314247@q.com # ** Created Time : 2020年11月22日星期日 11时58分06秒 # ** copyright : COPYRIGHT(c) 2020 # ** # ************************************************************************/ 5 f6 [2 w( p# d1 bifneq ($(V),1) Q := @ else Q := endif ################################以下项目需用户根据需要更改########################## # 输出文件的名称,默认为main(main.elf main.bin main.hex) TARGET := main #链接文件名称和所在路径 LDSCRIPT := ./STM32F429IGTx_FLASH.ld #启动文件名称和所在路径 START_FILE_SOURCES := ./startup_stm32f429xx.s 5 S' B7 [7 w# e; G( @#内核选择,FPU, FLOAT-ABI可为空 CPU := -mcpu=cortex-m4 FPU := -mfpu=fpv4-sp-d16 FLOAT-ABI := -mfloat-abi=hard #系统宏定义 C_DEFS := \ -DUSE_HAL_DRIVER \ -DSTM32F429xx # 芯片型号,用于Jlink仿真调试、下载 CHIP := STM32F429IG # 选择优化等级: # 1. gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。 # 2. 在编译时,如果没有指定上面的任何优化参数,则默认为 -O0,即没有优化。 # 3. 参数 -O1、-O2、-O3 中,随着数字变大,代码的优化程度也越高,不过这在某种意义上来说,也是以牺牲程序的可调试性为代价的。 # 4. 参数 -Og 是在 -O1 的基础上,去掉了那些影响调试的优化,所以如果最终是为了调试程序,可以使用这个参数。不过光有这个参数也是不行的,这个参数只是告诉编译器,编译后的代码不要影响调试,但调试信息的生成还是靠 -g 参数的。 # 5. 参数 -Os 是在 -O2 的基础上,去掉了那些会导致最终可执行程序增大的优化,如果想要更小的可执行程序,可选择这个参数。 # 6. 参数 -Ofast 是在 -O3 的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。 # 7. 如果想知道上面的优化参数具体做了哪些优化,可以使用 gcc -Q --help=optimizers 命令来查询。 OPT := -Og 8 h% j/ U% p" Z8 {2 |# 是否将debug信息编译进.elf文件,默认打开 DEBUG := 1 1 _; S. j/ T. `6 ~# I# 输出文件夹,.hex .bin .elf放在此文件夹下,.o .d文件放在此文件的子目录Obj下(自动创建) BUILD := ./build # 支持双系统编译,故需选当前系统,0为linux,1为windows SYS := 1 # 若指定了windows系统,则需确认编译器的路径,若安装时以默认路径安装,则正确 ifeq ($(SYS), 1) GCC_PATH = "/c/Program Files (x86)/GNU Tools Arm Embedded/9 2019-q4-major/bin" JLINK_PATH = "/c/Program Files (x86)/SEGGER/JLink" endif ###################################用户修改结束################################### " N$ @$ ^1 r5 a: {# 编译器定义 PREFIX = arm-none-eabi- ifdef GCC_PATH SUFFIX = .exe CC := $(GCC_PATH)/$(PREFIX)gcc$(SUFFIX) SZ := $(GCC_PATH)/$(PREFIX)size$(SUFFIX) OBJCOPY := $(GCC_PATH)/$(PREFIX)objcopy$(SUFFIX) GDB := $(GCC_PATH)/$(PREFIX)gdb$(SUFFIX) BIN := $(OBJCOPY) -O binary -S HEX := $(OBJCOPY) -O ihex else CC := $(PREFIX)gcc SZ := $(PREFIX)size OBJCOPY := $(PREFIX)objcopy GDB := $(PREFIX)gdb BIN := $(OBJCOPY) -O binary -S HEX := $(OBJCOPY) -O ihex endif * s# V) `# A) o) t7 P2 V# ^# Jlink定义,用于支持一键下载和gdb仿真 ifdef JLINK_PATH SUFFIX = .exe JLINKEXE := $(JLINK_PATH)/JLink$(SUFFIX) JLINKGDBSERVER := $(JLINK_PATH)/JLinkGDBServer$(SUFFIX) else JLINKEXE := JLinkExe JLINKGDBSERVER := JLinkGDBServer endif #################### CFLAGS Config Start ########################## MCU = $(CPU) -mthumb $(FPU) $(FLOAT-ABI) #搜索所有的h文件,并输出携带-I的.h文件路径 C_INCLUDES := $(addprefix -I,$(subst ./,,$(sort $(dir $(shell find ./ -type f -iname "*.h"))))) #编译参数 CFLAGS = $(MCU) $(C_DEFS) $(C_INCLUDES) $(OPT) -fdata-sections -ffunction-sections #开关警告 CFLAGS += -Wall -W -Wno-unused-parameter #标准 CFLAGS += -std=c99 ) K3 x4 h1 Q& H, J) G#当开启DEBUG功能时携带DEBUG参数 ifeq ($(DEBUG), 1) CFLAGS += -g -gdwarf-2 endif #自动生成依赖文件 CFLAGS += -MMD -MP -MF"$(@:%.o=%.d)" #################### CFLAGS Config End ########################## $ Q2 O! U$ r6 p# F8 q1 K0 x# libraries LIBS = -lc -lm -lnosys LIBDIR = #链接指令集-specs=nosys.specs LDFLAGS = $(MCU) -T$(LDSCRIPT) -specs=nano.specs $(LIBDIR) $(LIBS) -Wl,-Map=$(BUILD)/Obj/$(TARGET).map,--cref #是否开启优化掉未使用的函数和符号 LDFLAGS += -Wl,--gc-sections ( e9 |; \- k0 x( ^+ [, X#制作启动文件依赖Obj,输出去掉路径的.o文件,可兼容.s和.S START_FILE_OBJ = $(addsuffix .o, $(basename $(notdir $(START_FILE_SOURCES)))) OBJECTS = $(addprefix $(BUILD)/Obj/, $(START_FILE_OBJ)) : M* ~( H2 k) W: O1 g#搜索所有的c文件,制作所有的.c文件依赖Obj C_SOURCES = $(subst ./,,$(shell find ./ -type f -iname "*.c")) OBJECTS += $(addprefix $(BUILD)/Obj/, $(notdir $(C_SOURCES:%.c=%.o))) #PS:去掉终极目标的原始路径前缀并添加输出文件夹路径前缀(改变了依赖文件的路径前缀,需要重新指定搜索路径) #指定makefile搜索文件的路径(假如终极目标的依赖文件不携带.c文件所在的路径, #且不指定搜索路径,makefile会报错没有规则制定目标) vpath %.c $(sort $(dir $(C_SOURCES))) #取出路径并去重和排序(以首字母为单位) vpath %.s $(dir $(START_FILE_SOURCES)) vpath %.S $(dir $(START_FILE_SOURCES)) 5 z# A- h4 j U& X; a#指定为伪目标跳过隐含规则搜索,提升makefile的性能,并防止make时携带的参数与实际文件重名的问题 .PHONY:all clean printf JLinkGDBServer debug download reset commit + e' N! o* W8 x0 u9 p6 U0 c* ^all : $(BUILD)/$(TARGET).elf $(BUILD)/$(TARGET).bin $(BUILD)/$(TARGET).hex ; W) j$ N# c, ]6 b' t4 Y #链接所有的.o生成.elf文件 $(BUILD)/$(TARGET).elf : $(OBJECTS) | $(LDSCRIPT) $(Q)$(CC) $(LDFLAGS) -o $@ $(OBJECTS) $(Q)echo "make $@:" $(Q)$(SZ) $@ 7 z9 h+ U0 L( ~& n" n' I) T#编译启动文件备用参数:#-x assembler-with-cpp $(BUILD)/Obj/$(START_FILE_OBJ) : $(START_FILE_SOURCES) Makefile | $(BUILD)/Obj $(Q)echo "buid $(subst ./,,[ DISCUZ_CODE_34 ]lt;)" $(Q) $(CC) -c $(CFLAGS) -o $@ [ DISCUZ_CODE_34 ]lt; ' `# T! _3 r$ b#编译工程 $(BUILD)/Obj/%.o : %.c Makefile | $(BUILD)/Obj $(Q)echo "buid $(subst ./,,[ DISCUZ_CODE_34 ]lt;)" $(Q) $(CC) -c $(CFLAGS) -Wa,-a,-ad,-alms=$(@:%.o=%.lst) -o $@ [ DISCUZ_CODE_34 ]lt; 3 U* Q- a& Q6 w% g! V$(BUILD)/Obj : $(Q)mkdir -p $@ $(Q)echo "mkdir $@" %.bin : $(BUILD)/$(TARGET).elf $(Q) $(BIN) [ DISCUZ_CODE_34 ]lt; $@ $(Q)du -h $(BUILD)/$(TARGET).bin %.hex : $(BUILD)/$(TARGET).elf $(Q) $(HEX) [ DISCUZ_CODE_34 ]lt; $@ #用于检查链接脚本和启动文件是否存在,不存在则报错误 $(START_FILE_SOURCES): $(Q)echo ERROR: The startup file does not exist or has the wrong path !;\ exit 1 $(LDSCRIPT): $(Q)echo ERROR: The link file does not exist or has the wrong path !;\ exit 2 clean: $(RM) -rf $(BUILD) printf: $(Q)echo $(info $(LDFLAGS)) ! N8 F7 H4 r* o4 i2 V9 R: }' S3 \5 c2 U JLinkGDBServer: $(Q)JLinkGDBServer -select USB -device $(CHIP) \ -endian little -if SWD -speed 4000 -noir -LocalhostOnly debug: $(Q)make $(Q)echo target remote localhost\:2331 > gdb.gdb $(Q)echo monitor reset >> gdb.gdb $(Q)echo monitor halt >> gdb.gdb $(Q)echo load >> gdb.gdb $(Q)echo b main >> gdb.gdb $(Q)echo - >> gdb.gdb $(Q)echo c >> gdb.gdb $(Q)-$(GDB) $(BUILD)/$(TARGET).elf --command=gdb.gdb $(Q)$(RM) gdb.gdb download: $(Q)make $(Q)echo "h" > jlink.jlink $(Q)echo "loadfile" $(BUILD)/$(TARGET).hex >> jlink.jlink $(Q)echo "r" >> jlink.jlink $(Q)echo "qc" >> jlink.jlink $(Q)$(JLINKEXE) -device $(CHIP) -Speed 4000 -IF SWD -CommanderScript jlink.jlink $(Q)$(RM) jlink.jlink reset: $(Q)echo "r" >> jlink.jlink $(Q)echo "qc" >> jlink.jlink $(Q)$(JLINKEXE) -device $(CHIP) -Speed 4000 -IF SWD -CommanderScript jlink.jlink $(Q)$(RM) jlink.jlink M4 z b9 K2 r: k! U. dcommit: $(Q)git add . $(Q)status='$(shell git status | grep "git pull")';\ if test -n "$status";then echo "Need to do git pull !";exit 10;fi $(Q)explain='$(shell read -p "Please input git commit explain:" explain;echo "$explain")';\ if test -z "$explain";then git commit -m "Daily development submission"; \ else git commit -m "$explain";fi $(Q)git push $(Q)git status ( w& a* Z# B) y2 r% k# @4 U-include $(wildcard $(BUILD)/Obj/*.d)7 m/ Q. j& X6 o% l9 u9 a$ o |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版