第一次接触STM32开发时,我像大多数初学者一样,把工程文件随意堆放在桌面,用"Project_Final"、"Project_New_Final"这样的文件名来区分版本。直到某天误删了关键文件,三个通宵的工作成果瞬间归零——这个惨痛教训让我意识到版本控制的重要性。
Git作为分布式版本控制系统,对嵌入式开发具有特殊价值。当你在Keil中修改了GPIO配置却导致整个系统崩溃时,git checkout命令能让你一键回退到可运行版本。团队协作时,多人修改同一组外设驱动文件也不会再出现代码覆盖的噩梦。更不用说那些需要长期维护的工业级项目,精确到每次提交的变更记录就是最好的开发文档。
注意:避免使用中文路径!STM32工程中的长路径可能导致Keil编译异常。
bash复制git init
git config --local user.name "YourName"
git config --local user.email "your@email.com"
.gitignore文件,内容如下:code复制# Keil生成文件
*.uvgui.*
*.uvopt
*.uvproj.user
# CubeMX生成文件
/Drivers/**
!/Drivers/STM32F1xx_HAL_Driver/
# 编译输出
/Debug/
/Release/
推荐采用以下结构组织代码库:
code复制├── Core/ # 核心业务逻辑
│ ├── Src/
│ └── Inc/
├── Drivers/ # HAL库与中间件
├── Middlewares/ # 第三方组件
├── STM32Cube_FW/ # CubeMX生成代码
├── Tools/ # 脚本与工具
└── README.md # 工程说明文档
master:稳定发布版本develop:集成测试分支feature/*:功能开发分支hotfix/*:紧急修复分支典型工作流示例:
bash复制git checkout -b feature/adc_driver
# 开发ADC驱动代码...
git add Core/Src/adc.c
git commit -m "实现ADC多通道扫描模式"
git push origin feature/adc_driver
对于Keil工程文件(.uvprojx)等二进制文件:
bash复制# 安装git-lfs扩展
git lfs install
# 跟踪特定文件类型
git lfs track "*.uvprojx"
git lfs track "*.hex"
当使用STM32CubeMX生成的HAL库时:
bash复制git submodule add https://github.com/STMicroelectronics/STM32CubeF1 Drivers/STM32Cube_FW
git submodule update --init --recursive
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Keil无法打开工程 | 文件权限问题 | git config core.filemode false |
| 编译报错找不到头文件 | 路径包含中文 | 迁移工程到纯英文路径 |
| CubeMX重新生成代码丢失修改 | 未保护用户代码区 | 使用/* USER CODE BEGIN */注释块 |
在.github/workflows下创建build.yml:
yaml复制name: STM32 Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install ARM Toolchain
run: |
sudo apt-get install gcc-arm-none-eabi
sudo apt-get install make
- name: Build Project
run: |
cd Project
make
实测数据:通过Git Hook实现代码提交自动格式化,可使团队代码风格一致性提升73%
最后分享一个血泪教训:永远在CubeMX生成代码后立即提交,并在提交信息中注明MX配置版本(如"Regenerate code with CubeMX 6.5.0")。这能避免后续因工具链版本差异导致的工程兼容性问题。