2、固件基础:嵌入式固件的定义、在HVAC中的作用、固件与硬件的交互

好,咱们正式开始聊固件。很多刚入行的朋友问我:「固件到底算软件还是硬件?」

我的回答一直是:固件是介于软件和硬件之间的「翻译官」。它不像应用软件那样跑在操作系统上,也不像硬件那样焊死在电路板上。它是一段固化在存储器里的代码,专门负责让芯片「听懂」你要干什么。

2.1 嵌入式固件的定义

说白了,固件就是嵌入在硬件设备里的程序。它存储在 Flash、EEPROM 或 ROM 里,上电后由 CPU 执行。

我习惯把固件分成三层:

  • 底层驱动层:直接操作寄存器,读写 GPIO、配置定时器。这部分最枯燥,但也最不能出错。
  • 中间件层:比如 RTOS(实时操作系统)、通信协议栈(Modbus、BACnet)。
  • 应用层:控制逻辑、用户交互、故障诊断。

举个例子,你家里的温控器。按下「制冷」按钮,应用层收到指令,中间件把指令打包成 Modbus 帧,底层驱动通过 UART 把数据发出去。整个过程,就是固件在跑。

核心要点:固件不是一次性的。它需要升级、打补丁、优化性能。这就是为什么我们要讲 OTA。

2.2 固件在 HVAC 中的作用

暖通空调系统里,固件到底管什么?我直接列几个关键场景:

  1. 温度控制:PID 算法跑在固件里。我见过太多项目,PID 参数调不好,压缩机频繁启停,最后烧了接触器。
  2. 通信管理:室内机、室外机、线控器之间怎么对话?固件负责解析协议、处理冲突、重发丢包。
  3. 故障保护:高压保护、低压保护、过流保护。这些逻辑必须写在固件里,而且响应时间不能超过 100ms。
  4. 能效优化:变频压缩机的转速控制、电子膨胀阀的开度调节,全靠固件算。

我记得有一次,某品牌的中央空调在高温天频繁报 E4 故障。查了半天,发现是固件里的排气温度保护阈值写死了 120°C,但实际工况下 125°C 才是安全的。改一行代码,问题解决。你看,固件的一行判断,直接影响整个系统的可靠性。

我的经验:HVAC 固件开发,最容易被忽视的是「异常处理」。正常工况谁都会写,但断电重启、通信中断、传感器漂移这些边界情况,才是考验功底的地方。

2.3 固件与硬件的交互

固件怎么和硬件打交道?说白了就是「读写寄存器」。你想想看,一个 MCU 芯片,外面接了温度传感器、继电器、风扇电机。固件要做的事就是:

  • 通过 ADC 读取传感器电压,换算成温度值
  • 根据温度值,决定要不要吸合继电器
  • 通过 PWM 控制风扇转速

下面是一个典型的 HVAC 温度采集代码片段:

// 伪代码:读取 NTC 温度传感器
uint16_t adc_value = ADC_ReadChannel(0);  // 读取 ADC 通道 0
float voltage = adc_value * 3.3f / 4095.0f;  // 换算成电压
float temperature = NTC_CalcTemp(voltage);    // 查表得到温度

if (temperature > 30.0f) {
    GPIO_SetPin(RELAY_COOL, HIGH);  // 开启制冷继电器
} else {
    GPIO_SetPin(RELAY_COOL, LOW);   // 关闭
}

这段代码看起来简单,但坑不少。我曾经遇到过一个问题:ADC 采样值跳动很大,导致继电器频繁开关。后来加了软件滤波,取 10 次采样的平均值,才稳定下来。

避坑指南:我曾经在量产前才发现,某个型号的 MCU 在低温下 ADC 参考电压会漂移。结果所有产品的温度读数都偏高了 2°C。从那以后,我每次选型都会仔细看芯片手册里的「温度特性」表格。

2.4 固件与硬件的交互方式

交互方式其实就几种,我整理了一个表格:

交互方式 典型硬件 固件操作
GPIO 读写 继电器、LED、按键 设置高低电平、读取电平状态
ADC 采样 温度传感器、压力传感器 配置采样通道、读取转换结果
PWM 输出 风扇电机、电子膨胀阀 设置占空比、频率
通信接口 UART、I2C、SPI 收发数据、解析协议
定时器/计数器 延时、PWM 生成 配置定时周期、捕获输入信号

嗯,这里要注意:固件和硬件的交互,本质上是「时间敏感」的。比如 PWM 的频率如果偏差 1%,电机噪音就会变大。再比如通信时序如果差几个微秒,数据就会错乱。

我个人的习惯是,在写固件之前,先画一张「硬件资源分配表」。哪个引脚接了什么外设,用了哪个定时器,中断优先级怎么分配。这张表画清楚了,写代码就是填空。

2.5 小结

这一章我们聊了固件的定义、在 HVAC 里的作用,以及它怎么和硬件打交道。说白了,固件就是让硬件「活起来」的灵魂。没有固件,芯片就是一块废铁;固件写不好,系统就是一颗定时炸弹。

下一章,我们会深入聊聊固件升级到底是怎么一回事。为什么不能直接改代码?为什么需要 Bootloader?到时候我会拿一个真实的 OTA 失败案例来拆解。

课后思考:你手头的 HVAC 项目里,固件和硬件之间有没有出现过「沟通不畅」的问题?比如传感器读数不准、通信偶尔丢包?试着从固件角度分析一下原因。