前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >H7-TOOL的CANFD/CAN接口脱机烧写操作说明, 已经更新(2022-07-12)

H7-TOOL的CANFD/CAN接口脱机烧写操作说明, 已经更新(2022-07-12)

作者头像
Simon223
发布2022-09-16 11:04:22
3280
发布2022-09-16 11:04:22
举报
文章被收录于专栏:安富莱嵌入式技术分享

通过Lua小程序,我们可以方便方便的在线方式做CANFD固件烧录,也可以离线方式运行Lua小程序做烧录。 本次是说明是采用H7-TOOL的CANFD方式连接我们V7板子做的操作说明。 【协议说明】 1、发送固件大小:符号‘*’ 来同步,然后发送固件大小,板子收到后,回复0x30表示擦除相应扇区大小成功,回复0x60表示擦除失败(由于TOOL的当前版本固件没有注册CANFD接收功能,所以简单做个延迟等待)。 2、发送固件数据:符号‘$’ 来同步,然后发送固件数据,每次224字节大小,板子收到后,回复0x30表示数据编程成功,回复0x60表示擦除失败。如此反复,一直到发送完毕(由于TOOL的当前版本固件没有注册CANFD接收功能,所以简单做个延迟等待)。 3、发送结束命令:符号‘#’ 表示传输结束,目标板可以加载到APP运行了。 【硬件接线】

H7-TOOL通过CAN接到V7板子的CANFD1接口上,注意CANH接CANH,CANL接CANL

V7板子使用CANFD1,注意跳线帽:

【准备工作】 当前上位机还没有做专门的CANFD接口脱机烧录一键下载界面,需要手动将Lua文件和app固件存到TOOL的eMMC 1、H7-TOOL进入虚拟U盘 上电首界面长按S键 -> 系统设置 -> USB eMMC磁盘, 进入eMMC模拟U盘后,在如下路径新建文件夹串口脱机烧录

将如下两个文件存到新建的文件夹下

app.bin (50.03 KB)

canbootloader.lua (4.12 KB)

2、将目标板程序下载到V7开发板

基于V7的CANFD接口脱机烧录目标板程序.7z (2 MB) 【在线方式操作说明】 H7-TOOL可以采用USB,以太网或者WiFi方式连接上位机。

将前面lua小程序canbootloader.lua的内容复制到如下窗口:

点击下面的执行按钮就可以看到动图更新了:

【离线方式操作说明】 操作TOOL显示屏,进入Lua小程序界面:

执行uartfirmware.lua小程序。

执行效果如下:

【Lua小程序简单说明】

注释非常详细:

代码语言:javascript
复制
-------------------------------------------------------
--   
--     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/CAN脱机烧录/app.bin" -- 表示CAN脱机烧录文件夹下存的文件
local filepath1 = "0:/H7-TOOL/Lua/CAN脱机烧录"        -- 浏览CAN脱机烧录文件下存的文件
local can_id = 0x111  -- 目标板的ID
local str_offset
local str_offset1
 
 
-------------------------------------------------------
--   第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", 2, 64, 500000, 2000000) 
 
-------------------------------------------------------
--   第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
 
-- 读取数据为0,表示传输完毕
while(bytes > 0)
do
    -- 发送$表示开始传输固件命令
    -- 发送固件数据给目标板
    -- 固定每次发送64个字节
    count = 64 - 2 - bytes
    str_offset = string.format("%02d", count)
    str_offset1 = string.format("%"..str_offset.."s", "A")
    str_offset2 =  string.format("$%c", bytes)
    str= str_offset2..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
    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
-------------------------------------------------------

【目标板程序简单说明】

最关键的就是串口程序处理:

【参考资料】 之前更新过三期BootLoader的视频教程,可以作为参考学习: 单片机bootloader专题,启动,跳转配置和调试下载的各种用法 https://www.armbbs.cn/forum.php?mod=viewthread&tid=112792 基于NAND,eMMC,SD卡和U盘的BootLoader实战,带CRC完整性校验 https://www.armbbs.cn/forum.php?mod=viewthread&tid=113053 单片机BootLoader的AES加密实战,含上位机和下位机代码全开源 https://www.armbbs.cn/forum.php?mod=viewthread&tid=113361

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档