基于Linux系统的stm32f103开发构建

基于Makefile(后续更新基于xmake,cmake的现代构建方式)

GNU Make为开源的C语言构建软件,本文基于GNU Make, GNU Arm-GCC, OpenOCD开源生态工具来构建一个更加开放的C语言开发方式。(本文基于Std库进行示例)并且要求有一定的Github基础知识

必要工具获取

OpenOCD获取

通过官网下载其Release版本。先暂放,之后与arm-none-eabi-gcc一起配置

make与git获取

sudo apt update && sudo apt upgrade -y 
sudo apt install make git bear -y

bear为我个人用来生成compile_commands.json用的,可以不需要

arm-none-eabi-gcc获取

arm官网选择适合你的交叉编译工具。在解压之后将其放在任意目录下,笔者放在/opt目录下,查看/opt目录下的文件

ls /opt
gcc-arm-none-eabi openocd

将两个文件加的目录加入到~/.bashrc~/.zshrc

export PATH=$PATH:/opt/gcc-arm-none-eabi/bin
export PATH=$PATH:/opt/openocd/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc-arm-none-eabi/lib
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/openocd/libexec

执行source ~/.bashrc或者source ~/.zshrc

模板工程获取

确保你的git可以访问Github链接。

mkdir ~/projects && cd ~/projects
git clone git@github.com:Robinsssson/STM32F103-Template.git

这将会在你的~/projects/STM32F103-Template下创建一个模板工程。
如果您使用的是正点原子精英版。
执行make all make flash即可将交替闪烁流水灯的程序烧写到您的项目中。
否则需要修改makefile文件

makefile

# Project configuration
PROJECT ?= template
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
OBJCOPY = arm-none-eabi-objcopy
CC_PATH = /opt/gcc-arm-none-eabi/arm-none-eabi
STD_PERIPH_LIBS ?= ./STM32F10x_StdPeriph_Lib_V3.6.0/

# Directories
SOURCES_DIR = src
BUILD_DIR = build
INCLUDE_DIR = include
STARTUP_DIR = startup
LIB_DIR = lib
3RD_LIB_DIR = 3rdparty

# Source files
SOURCES = \
    $(SOURCES_DIR)/main.c \
    $(SOURCES_DIR)/stm32f10x_it.c \
    $(SOURCES_DIR)/system_stm32f10x.c \
    $(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_rcc.c \
    $(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_gpio.c \
	$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/stm32f10x_usart.c \
    $(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/src/misc.c \
    $(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/CoreSupport/core_cm3.c

# Include directories
INCLUDES = \
    -I$(INCLUDE_DIR) \
    -I$(3RD_LIB_DIR) \
    -I$(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/ \
    -I$(STD_PERIPH_LIBS)/Libraries/CMSIS/CM3/CoreSupport/ \
    -I$(STD_PERIPH_LIBS)/Libraries/STM32F10x_StdPeriph_Driver/inc/ \
    -I$(CC_PATH)/include

# Libraries
LIBS = \
    -lc

# Compiler and linker flags
CFLAGS = \
    -g -Wall --specs=nosys.specs -march=armv7-m -O0 \
    -mlittle-endian -mthumb -mcpu=cortex-m3 \
    -mfloat-abi=soft \
    -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER \
    $(INCLUDES)

LDFLAGS = \
    -Wl,--gc-sections $(LIBS) -T$(STARTUP_DIR)/stm32_flash.ld

# Startup file
START_FILE = startup_stm32f10x_hd

# st-flash tool
ST_FLASH ?= st-flash

# Object files
OBJECTS = $(SOURCES:$(SOURCES_DIR)/%.c=$(BUILD_DIR)/%.o) \
          $(BUILD_DIR)/startup/$(START_FILE).o

# Quiet mode
QUIET ?= @

# Default target
all: $(BUILD_DIR)/$(PROJECT).elf

# Compile target
$(BUILD_DIR)/$(PROJECT).elf: $(OBJECTS)
	@echo "Linking $@..."
	$(QUIET)mkdir -p $(BUILD_DIR)
	$(QUIET)$(CC) $(OBJECTS) $(CFLAGS) $(LDFLAGS) -o $@
	@echo "Generating HEX and BIN files..."
	$(QUIET)$(OBJCOPY) -O ihex $@ $(BUILD_DIR)/$(PROJECT).hex
	$(QUIET)$(OBJCOPY) -O binary $@ $(BUILD_DIR)/$(PROJECT).bin

# Pattern rule for object files
$(BUILD_DIR)/%.o: $(SOURCES_DIR)/%.c
	@echo "Compiling $<..."
	$(QUIET)mkdir -p $(dir $@)
	$(QUIET)$(CC) $(CFLAGS) -c $< -o $@

# Rule for compiling the startup file
$(BUILD_DIR)/$(STARTUP_DIR)/$(START_FILE).o: $(STARTUP_DIR)/$(START_FILE).s
	@echo "Compiling $<..."
	$(QUIET)mkdir -p $(dir $@)
	$(QUIET)$(CC) $(CFLAGS) -c $< -o $@

# Remove binary files
.PHONY: clean flash compile_commands

clean:
	@echo "Cleaning project..."
	$(QUIET)rm -rf $(BUILD_DIR)

# Flash target
flash:
	@echo "Flashing the device..."
	$(QUIET)/opt/openocd/bin/openocd -f /opt/openocd/openocd/scripts/interface/stlink.cfg \
	-f /opt/openocd/openocd/scripts/target/stm32f1x.cfg \
	-c "program $(BUILD_DIR)/$(PROJECT).bin verify reset exit 0x08000000"

# Generate compile_commands.json for clangd
compile_commands:
	@echo "Generating compile_commands.json..."
	$(QUIET)bear -- make all -j2
	$(QUIET)mv -f compile_commands.json $(BUILD_DIR)/compile_commands.json

文件树介绍

	├── build 								#构建中间文件存放
	├── include								#头文件包含位置
	├── src									#源文件位置
	├── startup								#启动文件*.s *.ld位置
	└── STM32F10x_StdPeriph_Lib_V3.6.0		#ST标准库位置
	    ├── _htmresc
	    ├── Libraries
	    ├── Project
	    └── Utilities

修改方法

根据您单片机容量型号,选择单片机的设置宏,修改

	SOURCES += $(STARTUP_DIR)/startup_stm32f10x_hd.s # startup_stm32f10x_ld.s
	CFLAGS += -DSTM32F10X_HD -DUSE_STDPERIPH_DRIVER # DSTM32F10X_MD 
	# 从$(STD_PERIPH_LIBS)/Project/STM32F10x_StdPeriph_Template/下选择符合您型号的*.ld文件

有问题可在仓库提issue,我会尽快回复

Github仓库 地址

  • 23
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于STM32F103R6的小车系统开发,是一项将STM32F103R6单片机和相关硬件组件结合起来,实现一个功能完善的小车系统的过程。 首先,我们需要准备STM32F103R6单片机开发板,该开发板具有丰富的外设接口和强大的计算能力,非常适合用于小车系统开发。然后,我们需要根据需求选择合适的电机驱动模块、传感器模块等硬件组件,以实现小车的基本功能,如运动控制、距离检测等。 在软件方面,我们可以使用Keil MDK开发环境来进行程序开发。首先,我们需要编写适配STM32F103R6的驱动程序,以实现对各个硬件模块的控制。例如,编写电机驱动程序,可以通过PWM信号控制电机的转速和方向;编写传感器驱动程序,可以读取传感器的数据。然后,我们可以编写控制算法,用于实现小车的自主导航、避障等功能。最后,我们可以编写上位机程序,通过串口或无线通信,与小车进行通信,监控和控制其运行。 在开发过程中,我们需要充分发挥STM32F103R6单片机的性能,合理利用中断、定时器等高级特性,提高系统的实时性和稳定性。同时,我们需要对电源管理进行合理设计,以确保系统的稳定供电和节能。 综上所述,基于STM32F103R6的小车系统开发需要综合考虑硬件和软件方面的因素,合理设计系统架构和程序流程,最终实现一个功能完善的小车系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值