FR801X系列带SWDIO,事实上使用Jlink通过SWD下载程序,再加上Segger RTT打印LOG会更为简单一些;但如果就是很讨厌用调试器而想用串口,倒是可用看看本文的串口协议分析。富芮坤官方提供的下载工具只有下载功能,没有串口调试助手功能,这就很鸡肋了,跑一次程序首先得关掉串口调试助手的串口,使用官方下载工具下载程序,最后再切回串口调试助手看日志,加大了工作量。因此这里就分析下它的串口升级协议,看完后你也能随手写一个带程序下载功能的串口工具了。PS:由于开放的资料(github)和给厂商提供的资料都没串口升级细节文档,在某些情况下可能会产生异常,所以有些未知的指令或参数还得您自行研究。
官方原版的串口下载工具,功能很简陋,串口下载过程放在UI线程,下载时不能拖动窗口,否则就无响应。。。程序是pyqt写的,要是C#的直接反编译了干它了。
步骤一
上电时,FR8016会发送如下字节,等待上位机中断正常引导过程,这个等待时间比较短,估计就100~200ms,手动通过串口助手发送中断字节是来不及的;这里推荐异步方式响应FR8016的数据,查询也可以但建议间隔在50ms以内。66 72 65 71 63 68 69 70
转换成Ascii码就是 freqchip
步骤二
上位机回复以下字节数据,中断FR8016的正常引导过程。46 52 38 30 31 58 4F 4B 00 00 00 00 00 00 00
转换成Ascii码为 FR801XOK
后面的7个 00
不能省略
步骤三
FR8016收到上位机在步骤二的内容后,回复以下内容确认,这之后就没有时间限制了,FR8016的bootloader会一直等待上位机进一步指示。6F 6B 01 01 00 00 00 00 00
可见字节转换成Ascii码为 ok
,这里只需要比较前4个字节就行,后5个 00
,在芯片内没有程序时会变成 00 00 00 00 01
,可以直接忽略
关于内部Flash
801X系列芯片内部叠封了一个512k字节或256k字节的flash,flash的空间划分如下图。
两种规格的内部flash,前160k都是用于用户存储程序和ota升级后的备份程序。针对于512K字节的,后面352k字节空间用于用户数据存储。针对于256K字节的内部flash,后面96k字节空间用于用户数据存储。
Fr801x芯片上电后,芯片从flash加载完整程序到SRAM运行,与传统的STM32系列单片机直接在Flash片上执行不同,这里为代码和数据共享RAM(用户可用RAM会减少)。
擦除扇区
FR8016内部堆叠的Flash和标准SPI NOR Flash类似,扇区大小4096字节,页大小256字节。
扇区首地址为小端模式,例如擦除第0个扇区为 00 00
, 擦除第一个扇区为 00 10
,第三个为 00 20
依此类推。
擦除的扇区数量根据bin文件大小来计算。
写入Flash
擦除完成后就可以写入了,一次写入的数据要求小于等于256字节(猜测内部按页写的),最后一包需要标记写入完毕,因此和正常数据包略有不同。
第三和第四个字节为写入页号(小端模式,第三字节为低8位,第四字节为高8位),1页=256字节,第二个字节作用未知。
写入完成
当程序下载完成时,关闭官方提供的上位机时,会向FR8016发送如下指令,FR8016也会回复相同内容,目前不知道起什么作用。
即使发送了这条指令,FR8016也不会自动重启,下载完成还是需要手动拉一下REST_n线,来运行新的程序。