4、LoRa基站固件编译与烧录:交叉编译环境搭建、源码获取与编译、固件烧录工具(ST-Link、J-Link)使用
好,咱们接着往下走。上一章我们把硬件平台搭起来了,板子能上电、能跑系统了。但说实话,那只是个空壳子。真正让基站“活”起来的,是固件。
这一章,我们就来搞定固件的编译与烧录。说白了,就是把我们写的代码,变成芯片能执行的机器码,然后塞进Flash里。我刚开始接触LoRa基站开发时,最头疼的就是这步——环境搭不好,编译报错一堆,烧录又连不上。嗯,今天我把这些坑都给你指出来。
4.1 交叉编译环境搭建
为什么需要交叉编译?你想想看,我们的开发电脑是x86架构,但基站主控芯片通常是ARM Cortex-M或Cortex-A系列。x86的指令,ARM不认识。所以我们需要在x86电脑上,用一套特殊的工具链,编译出ARM能跑的代码。这就是交叉编译。
4.1.1 工具链选择
我个人习惯用ARM官方的GNU工具链。对于LoRa基站,主控芯片常见的是STM32系列(Cortex-M)或i.MX系列(Cortex-A)。
- STM32系列:使用
arm-none-eabi-gcc,无操作系统裸机开发。 - i.MX系列:使用
arm-linux-gnueabihf-gcc,跑Linux系统。
我在项目中遇到过有人用错了工具链版本,编译出来的固件一运行就死机。折腾了两天才发现是工具链不匹配。所以,下载前一定确认好芯片架构。
4.1.2 安装步骤(以Ubuntu 20.04为例)
# 更新软件源
sudo apt update
# 安装ARM裸机工具链(STM32用)
sudo apt install gcc-arm-none-eabi
# 安装ARM Linux工具链(i.MX用)
sudo apt install gcc-arm-linux-gnueabihf
# 验证安装
arm-none-eabi-gcc --version
arm-linux-gnueabihf-gcc --version
嗯,这里要注意:如果你用的是Windows,建议装个WSL2或者直接用虚拟机。我试过在Windows原生环境下折腾,各种路径问题、换行符问题,烦得很。
4.2 源码获取与编译
环境搭好了,接下来就是拿源码。LoRa基站的固件源码,通常来自芯片厂商的SDK,或者开源社区的项目。
4.2.1 源码获取方式
- STM32系列:从ST官网下载STM32Cube固件包,或者从GitHub拉取LoRaWAN协议栈(如IBM的LoRaMac-node)。
- Semtech SX130x系列:从Semtech官网获取LoRa网关参考设计源码。
- 开源项目:比如Lora-net的packet_forwarder、ChirpStack Gateway Bridge等。
我记得有一次,我从GitHub上拉了一个分支,结果编译死活过不去。后来发现是子模块没更新。所以,拉完代码后,记得执行:
git submodule init
git submodule update
4.2.2 编译流程(以STM32 + LoRaWAN基站为例)
假设我们拿到了ST的LoRaWAN扩展包,目录结构大概是这样:
Projects/
Multi/
Applications/
LoRaWAN/
End_Node/
EWARM/ # IAR工程
MDK-ARM/ # Keil工程
SW4STM32/ # STM32CubeIDE工程
我个人更推荐用命令行编译,方便集成到CI/CD流水线。以STM32CubeIDE为例,它底层其实也是调用的arm-none-eabi-gcc。
编译命令大致如下:
cd Projects/Multi/Applications/LoRaWAN/End_Node/SW4STM32
make clean
make -j4
编译成功后,会在 Binary/ 目录下生成 .hex 或 .bin 文件。这就是我们要烧录的固件。
4.3 固件烧录工具使用
固件编译好了,怎么塞进芯片?这里就要用到烧录工具了。最常用的两种:ST-Link和J-Link。
4.3.1 ST-Link(适用于STM32系列)
ST-Link是ST官方出的调试烧录器。便宜、稳定,我手头常备好几个。
硬件连接:
| ST-Link引脚 | 目标板引脚 | 说明 |
|---|---|---|
| SWCLK | SWCLK | 时钟线 |
| SWDIO | SWDIO | 数据线 |
| GND | GND | 地线 |
| 3.3V | VCC | 供电(可选) |
烧录步骤(使用STM32CubeProgrammer):
- 打开STM32CubeProgrammer,选择“ST-Link”连接方式。
- 点击“Connect”,如果能读到芯片ID,说明连接成功。
- 在“Download”页面,选择编译好的.hex或.bin文件。
- 设置起始地址(通常为0x08000000)。
- 点击“Start Programming”,等待进度条走完。
嗯,这里有个细节:如果烧录失败,先检查接线。我遇到过好几次,都是因为杜邦线接触不良。建议用排线或者直接焊上去。
4.3.2 J-Link(通用型,支持多种ARM芯片)
J-Link是Segger家的产品,贵是贵了点,但功能强大。如果你同时玩STM32、NXP、TI的芯片,J-Link是首选。
烧录步骤(使用J-Flash):
- 打开J-Flash,新建工程。
- 选择芯片型号(比如STM32L476RG)。
- 加载固件文件(.hex或.bin)。
- 设置烧录地址(默认0x08000000)。
- 点击“Target” -> “Connect”,然后“Target” -> “Auto Program & Verify”。
4.3.3 命令行烧录(进阶)
如果你跟我一样,喜欢自动化,那命令行烧录是必须掌握的。
ST-Link命令行(使用st-flash):
# 安装st-link工具
sudo apt install stlink-tools
# 擦除芯片
st-flash erase
# 烧录固件
st-flash --reset write firmware.bin 0x08000000
J-Link命令行(使用JLinkExe):
# 启动JLink命令行
JLinkExe -device STM32L476RG -if SWD -speed 4000 -autoconnect 1
# 在JLink命令行中执行
loadfile firmware.hex
r
g
exit
我个人习惯把烧录命令写成脚本,一键执行。比如写个 flash.sh:
#!/bin/bash
echo "正在烧录LoRa基站固件..."
st-flash --reset write build/lora_gateway.bin 0x08000000
echo "烧录完成!"
这样每次改完代码,直接 ./flash.sh 就完事了,省心。
4.4 烧录后的验证
固件烧进去,不代表就成功了。我建议做两步验证:
- 读回校验:用烧录工具读回Flash内容,和原始固件做比对。ST-Link和J-Link都支持这个功能。
- 串口日志:基站启动后,通过UART输出日志。如果能看到“LoRa Gateway Init OK”之类的信息,说明固件跑起来了。
我曾经有一次,烧录时没注意地址偏移,固件写到了错误的位置。结果板子怎么都不启动。后来用读回功能一看,发现起始地址是0x08010000,而不是0x08000000。嗯,从那以后,我每次烧录完都会读回确认一下。
好了,这一章的内容就到这里。交叉编译环境、源码编译、烧录工具,这三步走完,你的LoRa基站就有了灵魂。下一章,我们开始配置射频参数,让基站真正能收发数据。