H7-TOOL的I2C接口方式脱机烧录操作方法,已经发布(2022-07-16)

标签:
bootloaderbspcanspi |
分类: STM32 |
通过Lua小程序,我们可以方便方便的在线方式做I2C接口方式固件烧录,也可以离线方式运行Lua小程序做烧录。
本次是说明是采用H7-TOOL的I2C接口连接我们V7板子做的操作说明。
【协议说明】
1、发送固件大小:符号‘*’
来同步,然后发送固件大小,板子收到后,回复0x30表示擦除相应扇区大小成功,回复0x60表示擦除失败。
2、发送固件数据:符号‘$’
来同步,然后发送固件数据,每次64字节大小,板子收到后,回复0x30表示数据编程成功,回复0x60表示擦除失败。如此反复,一直到发送完毕。
3、发送结束命令:符号‘#’ 表示传输结束,目标板可以加载到APP运行了。
要更新APP固件的I2C设备地址,我们设置为0x20,通信速度设置的100KHz。
【硬件接线】
H7-TOOL通过I2C接到V7板子的I2C接口上
【准备工作】
当前上位机还没有做专门的I2C接口脱机烧录一键下载界面,需要手动将Lua文件和app固件存到TOOL的eMMC
1、H7-TOOL进入虚拟U盘
上电首界面长按S键 -> 系统设置 -> USB eMMC磁盘,
进入eMMC模拟U盘后,在如下路径新建文件夹串口脱机烧录
将如下两个文件存到新建的文件夹下
2、将目标板程序下载到V7开发板
硬件I2C从机实现。
【在线方式操作说明】
H7-TOOL可以采用USB,以太网或者WiFi方式连接上位机。
将前面lua小程序i2cbootloader.lua的内容复制到如下窗口:
【离线方式操作说明】
操作TOOL显示屏,进入Lua小程序界面:
执行效果如下:
注释非常详细:
-------------------------------------------------------
--
--
--
-------------------------------------------------------
local str
local len
local bytes
local bin
local offset
local value
local count
local filesize
local byte0
local byte1
local byte2
local byte3
local filepath = "0:/H7-TOOL/Lua/I2C脱机烧录/app.bin" --
表示I2C脱机烧录文件夹下存的文件
local filepath1 =
"0:/H7-TOOL/Lua/I2C脱机烧录"
local ack
local i, m
local res
local str_offset
local str_offset1
local str_offset2
-------------------------------------------------------
--
-------------------------------------------------------
local _usAddress = 0x20 -- I2C设备地址
-------------------------------------------------------
--
-------------------------------------------------------
f_dir(filepath1)
print()
-------------------------------------------------------
--
-------------------------------------------------------
-- 获取固件大小
filesize=f_size(filepath)
print("============================================")
str= string.format("固件大小:%d",filesize)
print(str)
-- 将固件大小转换成四个字节
byte0 = ((filesize >> 0) & 0xFF)
byte1 = ((filesize >> 8) & 0xFF)
byte2 = ((filesize >> 16) & 0xFF)
byte3 = ((filesize >> 24) & 0xFF)
-- 设置I2C速度是100KHz
i2c_bus("init", 100000)
i2c_bus("start")
ack = i2c_bus("send", _usAddress) -- 写操作
if (ack ~= 0) then
end
--发送固件大小给目标板
--发送*号表示固件大小命令
--发送固件大小
--固定发送64字节,前5个字节是其它用途
str_offset = string.format("d", 69 - 5)
str= string.format("%c%c%c%c%c".."%"..str_offset.."s", 42, byte0,
byte1, byte2, byte3, "A")
print(str)
ack = i2c_bus("send", str)
if (ack ~= 0) then
end
i2c_bus("stop")
end
i2c_bus("start")
ack = i2c_bus("send", _usAddress+1) -- 读操作
str = i2c_bus("recive", 1) -- 读取17个字节数据
if(str == '\x30') then
else
end
i2c_bus("stop")
-------------------------------------------------------
--
-------------------------------------------------------
offset = 0
-- 第1个参数是路径,第2个参数的偏移地址,第3个参数读取大小
-- 返回值bytes表示读取的字节数,bin表示都回的数据
bytes, bin = f_read(filepath, 0, 64)
offset = offset + bytes
-- 读取数据为0,表示传输完毕
while(bytes > 0)
do