2. 固件开发环境搭建:硬件工具、软件工具与通信协议基础
做光模块固件开发,第一步就是把“家伙事儿”备齐。我见过不少新手,上来就啃代码,结果烧录器连不上、I2C不通,折腾半天才发现是环境没搭对。今天咱们就把这摊子事理清楚。
2.1 硬件工具:烧录器与调试器
说白了,硬件工具就是你和芯片之间的“桥梁”。没有它,你写的代码就是一堆没用的字符。
2.1.1 烧录器(Programmer)
烧录器负责把编译好的固件写到芯片的Flash里。光模块里常用的MCU,比如STM32、EFM8、MSP430,各自有对应的烧录器。
| MCU类型 | 推荐烧录器 | 接口协议 |
|---|---|---|
| STM32 | ST-Link / J-Link | SWD |
| EFM8 (Silicon Labs) | ToolStick / U-EC6 | C2 |
| MSP430 | TI MSP-FET | SBW / JTAG |
| 通用ARM Cortex-M | J-Link / DAP-Link | SWD / JTAG |
2.1.2 调试器(Debugger)
调试器比烧录器多一个功能:让你能单步执行代码、看变量值、设断点。我在项目中遇到过最头疼的事,就是代码烧进去后模块不工作,但没调试器,只能靠猜。后来我学乖了,调试器必须配。
调试器通常和烧录器是同一个硬件,比如J-Link既是烧录器也是调试器。区别在于你用的软件工具链。
2.2 软件工具:IDE、编译器与调试工具链
硬件有了,软件也得跟上。软件工具链的选择,直接影响你的开发效率。
2.2.1 IDE(集成开发环境)
我个人最常用的是Keil MDK和IAR Embedded Workbench。如果你用STM32,STM32CubeIDE也是不错的选择,免费且功能齐全。
- Keil MDK: 老牌IDE,对ARM内核支持极好。缺点是收费,但社区版够用。
- IAR: 编译优化强,代码密度高。适合对Flash空间有严格要求的项目。
- STM32CubeIDE: 免费,基于Eclipse,集成了CubeMX配置工具。新手友好。
2.2.2 编译器与调试工具链
编译器负责把C代码变成机器码。ARMCC(Keil自带)和GCC是最常用的两个。
调试工具链方面,我推荐用Ozone(SEGGER出品)配合J-Link。它的界面比Keil自带的调试器清爽很多,而且能直接看寄存器、外设状态。
// 一个典型的调试会话启动命令(命令行方式)
JLinkGDBServer -device STM32F405RG -if SWD -speed 4000 -port 2331
为什么用GDB Server?因为你可以用VS Code + Cortex-Debug插件来调试,比IDE自带的调试器灵活得多。
2.3 I2C/SPI通信协议基础
光模块里,MCU和DSP、激光驱动器、TEC控制器之间,全靠I2C和SPI通信。这两个协议你必须烂熟于心。
2.3.1 I2C协议
I2C只有两根线:SCL(时钟)和SDA(数据)。它是个多主从协议,但光模块里通常MCU做主设备,其他芯片做从设备。
你想想看,一根线上挂好几个设备,怎么区分?靠地址。每个I2C设备都有一个7位或10位的地址。比如光模块里常用的DSP芯片,地址通常是0x50或0x51。
// I2C读操作示例(伪代码)
uint8_t i2c_read(uint8_t dev_addr, uint8_t reg_addr) {
i2c_start(); // 发送起始条件
i2c_write(dev_addr << 1); // 写地址 + 写位(0)
i2c_write(reg_addr); // 写寄存器地址
i2c_stop(); // 发送停止条件
i2c_start(); // 重新起始
i2c_write(dev_addr << 1 | 1); // 写地址 + 读位(1)
uint8_t data = i2c_read(); // 读取数据
i2c_stop(); // 发送停止条件
return data;
}
2.3.2 SPI协议
SPI比I2C快,但线多。它需要4根线:SCLK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。
光模块里,SPI常用于和DSP高速通信,比如配置均衡器参数、读取诊断数据。SPI的速率可以跑到几十MHz,而I2C通常只有400kHz或1MHz。
// SPI写操作示例(伪代码)
void spi_write(uint8_t cs_pin, uint8_t *data, uint32_t len) {
gpio_set_low(cs_pin); // 拉低片选,选中设备
for (uint32_t i = 0; i < len; i++) {
spi_transfer_byte(data[i]); // 逐字节发送
}
gpio_set_high(cs_pin); // 拉高片选,释放设备
}
2.4 知识体系总览
下面这张图,把本章的核心内容串起来了。你可以把它当作搭建环境的“路线图”。
这张图里,我把硬件、软件、协议三大块分开了。你搭建环境时,就按这个顺序来:先搞定硬件连接,再装好IDE和工具链,最后把I2C/SPI调通。每一步都有坑,但走一遍之后,后面就顺了。
公众号:蓝海资料掘金营,微信deep3321