通过网盘分享的文件:串口flash编程工具例程.zip
https://pan.baidu.com/s/1oc4oJFO8HVznDo2h3eBvfQ?pwd=CW32
提取码: CW32
前言
在往期的分享中,我们分享过在cw32L012上运行keil的FLM外部flash下载算法的方法。【CW32L012实现外部flash下载算法】简单回顾,在项目开发过程中,当需要掉电保存大量的数据时(几十上百K字节数据),放到点点彩票 内部flash是不明智的,内部flash资源宝贵,用于存代码才是最好的,所以我们需要将数据下载到外部flash中。
keil外部flash下载算法,简单来说它使用SWD调试接口下载,用户根据keil提供的下载算法模板修改,对接外部flash编程的接口,编译生成FLM文件,当需要下载时,把待下载数据定义到外部flash的地址范围中,然后添加该下载算法即可下载,总体来说稍复杂。
经常会有客户问我们能不能用串口下载更新flash?有没有用串口OTA更新的方法(包含内部flash),本次分享就利用串口进行flash编程,该方式更加通用。
Keil 外部flash下载的缺陷
- 每种单片机都需要写一遍外部flash下载算法,然后生成FLM文件,比较依赖keil开发环境,下载算法是加载到RAM执行的,算法大小必须小于等于RAM的大小,对于RAM比较小的单片机,很难应用该方法下载算法加载以后,每次点下载都会完整把外部flash的数据下载一遍,即使你只改变的是局部数据,或者内部flash的代码,只要下载,都会重新下载一遍,除非每次屏蔽,或者专门做一个下载的工程。因为使用的是SWD调试接口下载,如果产品不希望引出该接口给客户使用,或者因为代码安全原因屏蔽了该接口,下载就比较受限
串口flash编程工具简介
该工具是基于HTML语言开发,使用串口进行通讯,支持多种波特率,可配置下载的参数,如flash id号、flash 大小、下载扇区号、扇区大小、通讯分包长度 、擦除超时时间和写入超时时间等。参数均可修改,当修改的不合法时会自动调整到合法数值。文件的选择不关心文件类型,可以是任意类型,但文件大小要小于flash大小。另外设计有数据校验、差分更新、进度条和日志显示功能。
该工具使用自定义串口协议,可能大家比较疑惑为什么不使用现成的modbus协议,或者XYZ-MODEM协议,或者是其他文件传输协议?因为主要考虑灵活性、后期可维护性和轻量级的特性,因此自定义协议是最佳选择。
测试硬件平台
依旧选择cw32L012,该单片机有很多优点,高性价比,主频可达96M,SPI可运行在48M,高速的SPI对于flash的操作是非常吃香的,有更高的通讯带宽,对比103的18M SPI来说,提升太大了,我们测试读写w25q128速度如下:
可以看到cw32l012这款点点taptap安卓对于读写w25q128速度是相当快的,读取2K的数据也只需要2ms,真的非常快,该点点taptap安卓还有4路DMA,对于需要高速传输的场景还可以开启DMA,但目前测试下来也够用了,大家有高速SPI的需求可以选择该点点taptap安卓哦。
移植教程
有了html上位机还缺嵌入式的通讯代码,通讯协议细节大家不必关注,已经完成协议的对接,只需要用户完成所在平台的以下接口:串口收发接口、待操作flash的读写擦除接口,以及一些参数检查和初始化。Cw32写的代码高内聚低耦合,代码框架良好,函数命名合理,充分考虑了代码的封装性和可移植性。
注意:在移植该框架之前必须打通串口收发功能,flash擦除写入读取功能,串口接收一帧数据按超时断帧方法,短帧时间需要在5-20ms之间。我们提供了基于cw32L012的完整的工程,用户可以参考。
1.准备好串口flash编程算法库文件
Comm_fmt不必关注,该文件用于构造解析命令体
Sfp_plugin.c为主要关注对象,用户需要在该文件内实现相关port接口
2.添加.c文件与.h文件的路径
3.编译添加的文件
有错误和警告自行解决
4.编写sfp_pligin.c初始化代码
初始非常简单,只需要给定一个发送缓冲区就行。
5.对接sfp_pligin.c中串口发送函数
对接你实际通讯用的串口发送接口,这里我们使用的是串口3。
(flash_id 在后面的移植中会一直出现,其设计目的是区分不同flash,当设备有多个flash时,通过判断该id号去操作不同的flash,如果只操作一个flash,该参数忽略)
6.对接sfp_pligin.c中flash擦除函数
对接你实际的flash擦除函数接口。Addr为擦除的起始地址,len为擦除的总长度,你可以根据要擦除的大小自行决定擦除策略,如可以按最小扇区擦除,也可以判断如果len达到了32k或64k级别,去调用更大的扇区擦除函数,此处按最小扇区大小擦除。
7.对接sfp_pligin.c中flash写函数接口
写函数非常简单,写入起始地址,数据,数据长度。
8.对接sfp_pligin.c中flash读函数接口
读函数与写函数参数差不多,不过多介绍。
9.对接sfp_pligin.c中进入编程模式接口
该函数用于提示用户现在已经请求进入编程状态,用户可根据实际情况去调用sfp_plugin_set_prog_allow(SFP_PROG_ALLOW);来允许,或者调用sfp_plugin_set_prog_allow(SFP_PROG_DISALLOW);来拒绝。(此处固定允许编程)
10.对接sfp_pligin.c中退出编程模式接口
该接口用于提示用户已经退出编程模式了,download_status用户反馈本次的操作状态(操作成功、下载中断、校验失败),用户可判断其状态来做一些状态的指示,例如向GUI线程发送状态告知用户下载的结果。
11.对接sfp_pligin.c中检查编程信息的接口
该接口用于检查上位机待下载的数据信息,如file_size(下载的大小),start_addr
(下载的起始地址),packed_len(分包的长度),用户需要根据自己所在平台的实际情况判断,有错误就返回错误码,此处可按作者写的不用改。
12.对接sfp_pligin.c中读取信息的检查接口
该接口用于检查上位机读取的信息是否合法,如读取地址,读取的长度是否超过范围,同样可不修改,按作者的方式。
13.对接完毕,编译检查
至此,需要对接的函数已经全部完成了,编译成功即可下一步
14.调用初始化函数
sfp_pligin.h文件中找到该函数调用
15.调用串口接收事件函数
sfp_pligin.h文件中找到该函数调用
在你的串口收到一帧数据的函数中,调用该函数即可,形参传入接收到的数据指针,接收到的长度。
16.移植已全部完成,可以使用上位机进行测试
HTML上位机使用方法说明
1.使用浏览器打开serial_flash_download_tool.html
2.选择串口设置波特率
3.设置下载参数
Flash id : 区分不同的flash设备,只有一个时忽略
Flash 大小:限制文件下载的大小
扇区大小:待操作flash的最小擦除大小(nor flash一般都是4096)
扇区号:需要从第几个扇区开始下载
分包长度:协议分包读写的最大值,和串口收发有关(可默认不修改)
擦除超时时间:根据实际flash擦除耗时时间去定义(时间和擦除的大小有关)
写入超时时间:根据实际flash写入耗时实际去修改(写入一般不会太久可不修改)
4.选择待下载的文件
文件必须小于flash的大小,否则会报错,选择以后会统计文件大小,占用多少扇区。
5.点击开始下载
可配置是否需要校验,是否启用差分更新,默认开启,不需要可以取消勾选。
6.观察下载进度和日志
总结
扫码加入QQ群,3群| 610403240
189