1、下载老版编译器:
我的整体开发环境是:Ubuntu20+conda(python2.7的虚拟环境)
gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
这个是下载地址:下载 |GNU Arm 嵌入式工具链下载 -- Arm 开发者

下载后会出现名字乱码,改名后解压:
1. 重命名 (把奇怪名字改成标准名字)
mv gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2 gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
2. 再次尝试解压
tar -xjf gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2
#3. 验证编译器功能:
这行命令的作用是:
在当前的 PATH 前面,临时插入老编译器的路径。
只有当前这个黑色窗口有效!
export PATH=HOME/embedded_tools/gcc-arm-none-eabi-5_4-2016q3/bin:PATH
arm-none-eabi-gcc --version查看编译器版本

2、获取iNav1.7.3固件源码
1. 回到你的主目录
cd ~
2. 克隆代码仓库 (这一步取决于网速,可能需要一点时间)
git clone https://github.com/iNavFlight/inav.git
3. 进入代码目录
cd inav
4. 穿越回 2017 年 (切换到 1.7.3 版本标签)
git checkout 1.7.3

综上便是通过github来获取得到的1.7.3的版本来适配STM32F103RCT6
3、创建虚拟环境开发源码
1. 创建一个名为 inav_build 的环境,指定 python 版本为 2.7
conda create -n inav_build python=2.7

2. 激活这个环境 (每次编译前都要运行这一句)
conda activate inav_build
3. 验证一下 (看看是不是变成了 Python 2.7.x)
python --version

4、修改和编译源码
1、如果要采用VScode的IDE环境进行代码修改,需要编写个配置文件,以免插件自动格式化和空格删除等影响文件编译:
touch ~/.vscode/setting.json
将以下代码粘贴进去,
bash
{
"editor.formatOnSave": false,
"C_Cpp.formatting": "Disabled",
"files.trimTrailingWhitespace": false
}
editor.formatOnSave: false -> 告诉 VS Code:"不管我按多少次 Ctrl+S,你都别动我的代码格式!"files.trimTrailingWhitespace: false -> 老代码里经常有很多没用的空格,git diff 会很敏感,关掉这个防止因为删空格导致文件变动。
做完这一步,你就可以放心大胆地用 VS Code 编辑 target.h 了,它现在就是个纯粹的文本编辑器,绝对不会乱动你的代码。
2、编写target.h文件:

确保路径文件没问题,只修改target.h文件的GPIO口来适配自己的版子的型号,这里我们的型号是STM32F103RCT6,根据原理图,将target.h文件内容修改为自己画的版子或者是买的最小系统板,重点关注修改晶振频率 (必改!) 找到 #define HSE_VALUE。原版通常是 12000000 (12M),你的板子是 8M、修改 LED 灯 (为了看状态)、确认 I2C 引脚 (连接 MPU6050)
3、编译文件
切换到inav目录下:cd ~/inav
激活环境:conda activate inav_build
确保编译环境:export PATH=HOME/embedded_tools/gcc-arm-none-eabi-5_4-2016q3/bin:PATH
删除obj文件:rm -rf obj(.hex文件保存位置)
编译文件:make TARGET=NAZE

text+data约等于flash要烧录的实际大小:这里换算是
text (代码段) :126760 字节 (约 123 KB)
data (数据段) :1524 字节 (约 1.5 KB)
bss (变量段) :17204 字节 (这是占 RAM 的,不占 Flash)
最终结论: 固件真实大小是 text + data ≈ 125 KB 。 STM32F103RCT6 有 256 KB 的 Flash 空间。 空间占用率仅 50% 左右! 哪怕是 128KB 的 F103CBT6 也能勉强塞进去。这就彻底验证了 iNav 1.7.3 是可以在这个芯片上完美运行的!
5、Ubuntu烧录代码检验成果
1、Ubuntu 22 直接烧录(最快):
sudo apt update
sudo apt install stm32flash
2、确认端口: 插上你的 USB 转 TTL 模块:
ls /dev/ttyUSB*
3、解除锁定(类似于权限)
这里的 /dev/ttyUSB0 换成你刚才看到的
sudo stm32flash -u /dev/ttyUSB0
4、开始烧录:
-w: 写入
-v: 校验 (Verify)
-g 0x0: 烧录完从地址0开始运行 (可选)
export PATH=HOME/embedded_tools/gcc-arm-none-eabi-5_4-2016q3/bin:PATH
sudo stm32flash -w obj/inav_1.7.3_NAZE.hex -v /dev/ttyUSB0
看到进度条走到 100% 并且显示 Verification: OK,就是成功了!

USB转TTL有时容易出问题,这里推荐用STLINK-v2进行烧录(上图我就是用STlink进行烧录的),非常稳定,以下是操作步骤
1、硬件部分:
| ST-LINK V2 (下载器) | ABrobot 开发板 | 注意事项 |
|---|---|---|
| SWCLK (或 CLK) | CLK | 时钟线 |
| SWDIO (或 DIO) | DIO | 数据线 |
| GND | GND | **必须接!**共地 |
| 3.3V | 3V3 | 供电 (见下方警告) |
2、Ubuntu上位机部分:
1>安装调试软件
OpenOCD 是 Linux 下最强大的开源调试软件,支持 ST-Link
sudo apt update
sudo apt install openocd
2、进行烧录:
cd ~/inav切换到目录下
解释:使用stlink配置文件,目标是stm32f1系列,执行烧录、校验、复位、退出
xk@ubuntu:~/inav$ sudo openocd -f interface/stlink-v2.cfg -f target/stm32f1x.cfg -c "program obj/inav_1.7.3_NAZE.hex verify reset exit"
6、Window进行代码烧录
PS:也可以用Window进行软件烧录:
1、下载软件:FlyMcu (经典老牌) 对于 STM32F103 这种板子,FlyMcu 是最简单好用的。
去搜一下"FlyMcu 下载"或者去 STM32 论坛找一个。它只有一个 .exe 文件,免安装。
2. 操作步骤:
-
打开 FlyMcu。
-
Port: 选择你的 USB 转 TTL 对应的 COM 口(去设备管理器确认)。
-
Bps: 选
115200或者256000。 -
Code File: 点击加载,选择你的
.hex文件。 -
底部选项 (关键): 选择 "DTR的低电平复位,RTS高电平进BootLoader" (即使你是手动跳线,选这个通常也没错,或者选"不使用RTS/DTR")。
-
点击 "开始编程 (Start ISP)"。
看到右边显示绿色进度条走完,提示"完成",就是成功了。
7、iNav地面站检查
地面站连接 (联机验证) 这是最终考核。要注意,烧的是 2017 年的固件,现代的 Configurator 连不上
-
必须下载旧版地面站: INAV Configurator 1.7.2 或 1.7.3。
-
去 GitHub Releases 页面翻以前的版本下载。
-
或者找 Cleanflight Configurator 2.x 版本也可以兼容。
-
-
连接:
-
用 USB 转 TTL 依然接在 PA9/PA10。
-
电脑上打开 Configurator。
-
选择端口,波特率选 115200。
-
点击 Connect。
-
-
成功标志:
-
如果不报错进入了界面。
-
拿起板子晃动,屏幕上的小飞机跟着实时转动
-