1. 搭建开发环境与版本控制
任务说明
本案例目标为:在Windows主机上配置基于VS Code + GCC Arm Embedded工具链的单片机开发环境,并建立Git仓库对代码版本进行管理。选用STM32F103系列作为目标芯片,以LED闪烁程序为验证载体,完成从环境搭建、代码编写到版本提交的完整闭环。
环境配置
所需依赖如下,均需提前安装并加入系统PATH:
- VS Code(含C/C++扩展)
- Arm GNU Toolchain(arm-none-eabi-gcc,版本10.3或更新)
- Git for Windows
- STM32CubeF1固件包(仅需CMSIS核心文件与启动文件)
验证工具链安装:在终端执行 arm-none-eabi-gcc --version 与 git --version,能正常输出版本号即视为安装成功。
工程结构
led_blink/
├── .gitignore
├── Makefile
├── core/
│ ├── startup_stm32f103xb.s
│ ├── stm32f103xb.h
│ └── system_stm32f103xb.c
└── src/
└── main.c
代码实现
main.c 实现基于SysTick延时的LED闪烁逻辑,直接操作GPIOB的ODR寄存器控制PB0引脚:
#include "stm32f103xb.h"
void delay_ms(uint32_t ms) {
for (uint32_t i = 0; i < ms * 8000; i++) {
__NOP();
}
}
int main(void) {
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN; // 使能GPIOB时钟
GPIOB->CRL = (GPIOB->CRL & ~0x0F) | 0x03; // PB0推挽输出50MHz
while (1) {
GPIOB->ODR ^= (1 << 0); // 翻转PB0
delay_ms(500);
}
}
Makefile 定义编译规则,生成ELF与HEX文件:
PREFIX = arm-none-eabi-
CC = $(PREFIX)gcc
OBJCOPY = $(PREFIX)objcopy
CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -O2 -Icore
LDFLAGS = -T core/stm32f103xb.ld -nostdlib
OBJS = core/startup_stm32f103xb.o core/system_stm32f103xb.o src/main.o
all: led_blink.hex
led_blink.elf: $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS)
%.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
%.o: %.s
$(CC) $(CFLAGS) -c -o $@ $<
led_blink.hex: led_blink.elf
$(OBJCOPY) -O ihex $< $@
clean:
rm -f $(OBJS) led_blink.elf led_blink.hex
链接脚本 stm32f103xb.ld 定义FLASH起始0x08000000(容量64KB)、RAM起始0x20000000(容量20KB),并导出最小向量表与堆栈符号。.gitignore 忽略编译产物:
*.o
*.elf
*.hex
Git版本控制
在工程根目录执行以下命令完成首次提交:
git init
git add .
git commit -m "初始版本:LED闪烁工程"
后续每次修改代码后,使用 git add 与 git commit 记录新版本;使用 git log --oneline 查看提交历史。
构建与验证
在工程根目录执行 make,若编译通过则生成 led_blink.hex。验证判定标准:
make命令无报错退出,且生成目标文件;git log --oneline能显示至少一条提交记录;- 将HEX文件通过ST-Link烧录至STM32F103开发板后,PB0引脚外接LED以约1Hz频率闪烁(500ms翻转一次)。
若编译报错,优先检查工具链路径与CMSIS头文件路径是否正确;若烧录后无现象,检查PB0引脚连接与CRL寄存器配置是否匹配实际硬件。