单片机
返回首页

【Linux】GCC+Makefile打造正点原子stm32单片机开发环境

2025-10-22 来源:bilibili

arm-none-eabi-gcc+stlink-tool+Makefile

正点原子精英STM32F103ZET6开发板采用V3.5库的头文件

下载固件库:https://www.st.com/content/ccc/resource/technical/software/firmware/48/ab/e5/17/0d/79/43/74/stsw-stm32054.zip/files/stsw-stm32054.zip/jcr:content/translations/en.stsw-stm32054.zip

解压得到STM32F10x_StdPeriph_Lib_V3.5.0

新建文件夹:stm32,stm32/lib,stm32/ware

将下列文件(夹)到使stm32/lib文件夹下

STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/TrueSTUDIO/startup_stm32f10x_hd.s STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/TrueSTUDIO/STM3210E-EVAL/stm32_flash.ld STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/stm32f10x.h   STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.h    STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.c    STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/CMSIS/CM3/CoreSupport/core_cm3.h   STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/stm32f10x_it.c  STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/stm32f10x_it.h  STM32F10x_StdPeriph_Lib_V3.5.0/Project/STM32F10x_StdPeriph_Template/stm32f10x_conf.h    STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/inc STM32F10x_StdPeriph_Lib_V3.5.0/Libraries/STM32F10x_StdPeriph_Driver/src

stm32启动文件:startup_stm32f10x_hd.s

stm32链接文件:stm32_flash.ld

stm32头文件:stm32f10x.h

时钟配置文件:system_stm32f10x.h和system_stm32f10x.c,

内核支持文件:core_cm3.h

中断服务程序文件:stm32f10x_it.h和stm32f10x_it.c

固件库配置头文件:stm32f10x_conf.h

外设驱动库:STM32F10x_StdPeriph_Driver

如果用KEIL MDK环境开发就选择arm文件夹下的启动文件,如果用IAR环境开发就选择iar环境下的启动文件,gcc_ride7适用基于GCC_ride7编译器

truestudio使用的是gcc编译器

makefile详解

TARGET=testCC=arm-none-eabi-gccCP=arm-none-eabi-objcopy

使用适合Arm Cortex-M的交叉编译器arm-none-eabi-gcc

利用arm-none-eabi-objcopy工具可以将elf文件转化为适合于单片机的bin文件和hex文件

PWD=$(shell pwd)

使用shell命令pwd,生成当前文件的绝对路径

把自己写的和正点原子提供的文件都放到ware中

WARE=$(patsubst %,-I $(PWD)/ware/%,$(shell ls $(PWD)/ware))

patsubst:模式字符串替换函数。函数返回被替换过后的字符串

%:表示任意长度的字串

这段代码大致意思就是:在ware文件夹下所有的文件夹路径前面都加上一个-I参数。在后面的CFLAGS变量里用到

把正点原子提供的寄存器版本源码的sys文件夹下的sys和delay文件夹复制ware下

略作修改

#sys.c

##把下列源码换成下下列代码

__aSM void MSR_MSP(u32 addr) 

{

    MSR MSP, r0         //set Main Stack value

    BX r14

}

void MSR_MSP(u32 addr)

{

__ASM volatile("MSR MSP, r0"); 

__ASM volatile("BX r14");

}

usart的printf无法在此编译器下使用,网上有很多解决办法,但我没成功。下面是网上的一个解决方案

#usart.c

#if 0

###endif下面写

int _write (int fd, char *pBuffer, int size)  

{  

    for (int i=0;i<size;i++)  

    {  

        while((USART1->SR&0X40)==0);      //等待上一次串口数据发送完成  

        USART1->DR=(u8) pBuffer[1];       //写DR,串口1将发送数据

    }  

    return size;  

}

还要在链接器参数那里加上-specs=nosys.specs -specs=nano.specs 

后面那个加不加编译都会成功,但烧录后printf好像没用

find启动文件

把.s后缀的换成.o

START_SRC=$(shell find . -name startup_stm32f10x_hd.s)START_OBJ=$(START_SRC:%.s=%.o)

find所有的.c文件

C_SRC=$(shell find . -name '*.c')C_OBJ=$(C_SRC:%.c=%.o)

CPUFLAGS=-mthumb -mcpu=cortex-m3INCFLAGS=-I $(PWD)/lib -I $(PWD)/lib/inc $(WARE)CFLAGS=$(CPUFLAGS) $(INCFLAGS) -D STM32F10X_HD -D USE_STDPERIPH_DRIVER -Wall -g -c -o

-mthumb             表明使用的指令集

-mcpu=cortex-m3     表明芯片内核

-I                  声明头文件路径

-D                  定义宏

-Wall               允许输出所有警告

-g                  产生调试信息

-c                  编译和汇编但不链接

-o                  重命名生成文件

对于STM32F103系列芯片,设置原则如下:

16KB≤FLASH≤32KB       选择:STM32F10X_LD

64KB≤FLASH≤128KB      选择:STM32F10X_MD

256KB≤FLASH≤512KB     选择:STM32F10X_HD

正点原子精英开发板STM32F103ZET6的芯片属于大容量STM32芯片,所以选择STM32F10X_HD

只有用预编译指令预定义了“USE_STDPERIPH_DRIVER”,才会将"stm32f10x_conf.h"包含进“stm32f10x.h”中,从而被"main.c"用到。

官方推荐使用arm-none-eabi-gcc来链接,不建议直接使用arm-none-eabi-ld

LDFLAGS=-T $(PWD)/lib/stm32_flash.ld -Wl,-cref,-u,Reset_Handler -Wl,-Map=$(TARGET).map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group -0

-T                                              指定链接脚本

-Wl,<options>                                   传<options>到链接器

-Map                                            生成映射文件  还能减少输出

-Wl,--start-group <options> -Wl,--end-group     options为要使用的静态库

-o                                              重命名生成文件

$(TARGET).hex:$(TARGET).elf $(CP) $^ -Oihex $@$(TARGET).elf:$(START_OBJ) $(C_OBJ) $(CC) $^ $(LDFLAGS) $@$(START_OBJ):$(START_SRC) $(CC) $^ $(CFLAGS) $@$(C_OBJ):%.o:%.c $(CC) $^ $(CFLAGS) $@

抽取全部C_OBJ中.o文件的文件名前缀作为%代表的字符串

$@          代表目标文件(冒号前)

$^          代表所有的依赖文件(冒号后)

指定伪目标,避免和文件重名

.PHONY: hex bin clean flash

生成hex文件

hex:        $(CP) $(TARGET).elf -Oihex $(TARGET).hex

生成bin文件bin:        $(CP) $(TARGET).elf $(TARGET).bin

烧录hex文件,因为博主还没学到地址的具体用处,所以选择hex烧录

flash:        st-flash --format ihex write $(TARGET).hex

清除生成文件

clean:        rm -f $(shell find . -name '*.o') $(TARGET).*

Makefile

TARGET=testCC=arm-none-eabi-gccCP=arm-none-eabi-objcopyPWD=$(shell pwd)WARE=$(patsubst %,-I $(PWD)/ware/%,$(shell ls $(PWD)/ware))START_SRC=$(shell find . -name startup_stm32f10x_hd.s)START_OBJ=$(START_SRC:%.s=%.o)C_SRC=$(shell find . -name '*.c')C_OBJ=$(C_SRC:%.c=%.o)CPUFLAGS=-mthumb -mcpu=cortex-m3INCFLAGS=-I $(PWD)/lib -I $(PWD)/lib/inc $(WARE)CFLAGS=$(CPUFLAGS) $(INCFLAGS) -D STM32F10X_HD -D USE_STDPERIPH_DRIVER -Wall -g -c -oLDFLAGS=-T $(PWD)/lib/stm32_flash.ld -Wl,-cref,-u,Reset_Handler -Wl,-Map=$(TARGET).map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group -0$(TARGET).hex:$(TARGET).elf $(CP) $^ -Oihex $@$(TARGET).elf:$(START_OBJ) $(C_OBJ) $(CC) $^ $(LDFLAGS) $@$(START_OBJ):$(START_SRC) $(CC) $^ $(CFLAGS) $@$(C_OBJ):%.o:%.c $(CC) $^ $(CFLAGS) $@.PHONY: hex bin clean flashhex:        $(CP) $(TARGET).elf -Oihex $(TARGET).hexbin:        $(CP) $(TARGET).elf $(TARGET).binflash:        st-flash --format ihex write $(TARGET).hexclean:        rm -f $(shell find . -name '*.o') $(TARGET).*


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 1瓦线性调频增强器

  • 家用电器遥控器

  • 12V 转 28V DC-DC 变换器(基于 LM2585)

  • 红外开关

  • DS1669数字电位器

  • HA1377 桥式放大器 BCL 电容 17W(汽车音频)

    相关电子头条文章