------------------------------------------------------- -- -- H7-TOOL CAN FD脱机烧录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/CANFD_UPDATE/H7_Bootloader_APP_Test.bin" -- 表示CAN脱机烧录文件夹下存的文件 local filepath1 = "0:/H7-TOOL/Lua/CANFD_UPDATE" -- 浏览CAN脱机烧录文件下存的文件 local can_id = 0x222 -- 目标板的ID local str_offset local str_offset1 local update_index local update_index_str local update_sum local update_index_str ------------------------------------------------------- -- 第1步:浏览串口脱机烧录文件夹下存的文件 ------------------------------------------------------- f_dir(filepath1) print() ------------------------------------------------------- -- 第2步:CAN FD配置 ------------------------------------------------------- print("CAN FD测试") --第1个参数 ----open,close,send,recive --第2个参数 ----- 0 表示FDCAN_FRAME_CLASSIC ----- 1 表示FDCAN_FRAME_FD_NO_BRS ----- 2 表示FDCAN_FRAME_FD_BRS --第3个参数,支持的数据个数 ---- 表示64个字节 --第4个参数,仲裁阶段波特率 --第5个参数,数据阶段波特率 can_bus("open", 1, 64, 500000, 500000) ------------------------------------------------------- -- 第3步:发送固件大小,方便目标板擦除相应大小扇区 ------------------------------------------------------- -- 获取固件大小 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) --发送固件大小给目标板 --发送*号表示固件大小命令 --发送固件大小 --固定发送64字节 str_offset = string.format("%02d", 64 - 5) str= string.format("%c%c%c%c%c".."%"..str_offset.."s", 42, byte0, byte1, byte2, byte3, "A") print(str) --第1个参数 ----open,close,send,recive --第2个参数 ----ID类型,0表示标准ID,1表示扩展ID --第3个参数 ----0数据帧,1遥控帧 --第4个参数 ----字符串 can_bus("send", 0, 0, can_id, str) print("执行扇区擦除.....") -- 正常这里应该等待CAN返回应答0x30,暂时用延迟实现 delayms(2000) ------------------------------------------------------- -- 第4步:发送固件大小 ------------------------------------------------------- offset = 0 -- 第1个参数是路径,第2个参数的偏移地址,第3个参数读取大小 -- 返回值bytes表示读取的字节数,bin表示都回的数据 bytes, bin = f_read(filepath, 0, 32) offset = offset + bytes update_index = 0 while(bytes > 0) do -- 发送$表示开始传输固件命令 -- 发送固件数据给目标板 -- 固定每次发送64个字节 count = 64 - 2 - 2 - 4 - bytes str_offset = string.format("%02d", count) str_offset1 = string.format("%"..str_offset.."s", "A") str_offset2 = string.format("$%c", bytes) byte0 = ((update_index >> 0) & 0xFF) byte1 = ((update_index >> 8) & 0xFF) byte2 = ((update_index >> 16) & 0xFF) byte3 = ((update_index >> 24) & 0xFF) update_index_str = string.format("%c%c%c%c",byte0, byte1, byte2, byte3) update_sum = 0 for i=1,bytes,1 do update_sum = update_sum + string.byte(bin,i) end byte0 = ((update_sum >> 0) & 0xFF) byte1 = ((update_sum >> 8) & 0xFF) update_sum_str = string.format("%c%c",byte0, byte1) str= str_offset2..update_index_str..update_sum_str..bin..str_offset1 can_bus("send", 0, 0, can_id, str) -- 等待目标板返回确认数据0x30 -- 返回0x30表示发送成功 -- 暂时用延迟实现 delayms(30) bytes, bin = f_read(filepath, offset, 32) -- 继续读取数据 offset = offset + bytes update_index = update_index+1 if(bytes ~= 0) then -- 读取不为0,打印发送的总字节数 print("发送固件:", offset) end end ------------------------------------------------------- -- 第5步:发送传输结束命令 ------------------------------------------------------- str_offset = string.format("%02d", 64 - 1) str= string.format("#".."%"..str_offset.."s", "A") can_bus("send", 0, 0, can_id, str) print("固件传输完成") ------------------------------------------------------- -- end of file ------------------------------------------------------- --local byte0 = 0x12 --local byte1 = 0x12 --local byte2 = 0x12 --local byte3 = 0x12 --local str_offset --local str_offset1 --str_offset = string.format("%02d", 64 - 5) --str= string.format("%c%c%c%c%c".."%"..str_offset.."s", 42, byte0, byte1, byte2, byte3, "A") --for i=1,64,1 do -- print(string.format("%02d", i),"=",string.format("%02x", string.byte(string.sub(str,i,i)))) --end