本文目录
- 1. 1. API
- 2. 2. Flash 规划(以 HMI80480M070 为例)
- 3. 3. 进度回调状态
- 4. 4. 案例:SD 卡自动升级
通过 LUA 实现远程固件升级(OTA):初始化、写入、校验、解压、重启。升级包放在 SD 卡,插卡自动检测触发。
1. API
| 函数 | 说明 |
|---|---|
| ota_init(md5, filesize, addr) | 初始化升级:md5 为固定串 「0123456789abcdef」;addr ≥ Flash 总量一半 |
| ota_write(writeTb) | 写入升级数据(字节表 ≤2048,不足自动补 0x00) |
| ota_check_upgrade(1) | 校验并开始升级 |
| ota_destory() | 擦除残留升级数据 |
| on_ota_progress(status, value) | 升级进度回调 |
2. Flash 规划(以 HMI80480M070 为例)
16MB 总量:系统 1MB + 工程 4.38MB = 已用 5.38MB,空闲约 10.62MB。但 OTA 必须从 ≥8MB(后半部分)开始,防止与工程区交叉覆盖;OTA 包大小须小于 Flash 一半。块地址占用高地址区会导致不可升级。

3. 进度回调状态
| status | 含义 | value |
|---|---|---|
| 1 | 校验开始 | 0 |
| 2 | 校验结果 | 0=失败 / 1=成功 |
| 3 | 解压进度 | 0~100 |
| 4 | 解压结果 | 0=失败 / 1=成功(即将重启) |
4. 案例:SD 卡自动升级
_otaFile = "1:/a.bin" -- 量产时 ota.bin 改名 a.bin
function on_sd_inserted(dir)
-- SD卡插入, 检查升级包
list_dir("1:/")
end
function on_list_dir(path, filename, type, fsize)
if filename == "a.bin" then
start_ota()
end
end
function start_ota()
file_open(_otaFile, 0)
local fsize = file_size()
-- addr 取 Flash 后半部分: 16MB 取 8MB=0x800000
ota_init("0123456789abcdef", fsize, 0x800000)
local remain = fsize
while remain > 0 do
local n = (remain > 2048) and 2048 or remain
local buf = file_read(n)
ota_write(buf)
remain = remain - n
end
file_close()
ota_check_upgrade(1)
end
function on_ota_progress(status, value)
if status == 2 then
if value == 0 then
print("OTA 校验失败")
ota_destory()
end
elseif status == 4 then
if value == 0 then print("OTA 解压失败") end
end
end
OTA 三条红线:①md5 参数必须用官方固定串 「0123456789abcdef」;②起始地址必须 ≥ Flash 一半,否则会覆盖工程区把屏刷成砖;③升级包太大(≥一半 Flash)不可升级,先查文件大小再开始。
整理自 广州大彩科技 VisualHMI 开发文档(hmi-doc.gz-dc.com)LUA 教程「OTA 升级」,版权归大彩科技所有。
发表回复