前面已经将下位机部署完毕,本节将讲述上位机。
上位机的工作相对比较简单,主要就是解析Hex文件,然后将数据发送到下位机。注意发送的Hex文件只能是User App,不能带有Bootloader,否则可能会覆盖之前的Bootloader,导致出错。
上位机源码下载地址:https://download.csdn.net/download/u010875635/10819828
上位机主要工作流程如下:
1、选择Hex文件。
2、进入Bootloader。
3、烧录文件,烧录实际上有三个动作,一是检查是否处于Bootloader中;二是擦除用户程序区;三是烧录文件。
4、烧录完毕后,下位机会自动复位。
注意数据发送时,一定要采用一问一答模式,即发送一帧数据,收到回馈后再发送下一帧,避免时间不够MCU将数据写入Flash。
部分解析Hex文件的代码如下,详细参考上位机源码程序:https://download.csdn.net/download/u010875635/10819828
Hex文件内容与实际地址数据之间的转换:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SpecialFunctions.HexParse
{
/// <summary>
/// Microchip的MPLAB X生成的HEX解析
/// MPLAB可以生成3中不同格式的执行文件
/// 其中两种是HEX文件,它们分别称为
/// INHX8M(Intel Hex Format) -- 一般用于8位核心设备编程器
/// INHX32(Intel Hex 32 Format) -- 一般用于16位核心设备编程器
/// 另外一种INHX8S(Intel Split Hex Format)生成的是HXL和HXH文件,分别保存指令数据的低字节和高字节,这里不做说明
/// 详情参考MPLAX帮助文件
/// </summary>
public class MicrochipHexParse
{
#region INHX32格式解析,MPLAB内嵌连接器MPLINK在默认情况下生成INHX32,适用于dsPIC33E/PIC24E
/*************************************************
* 1、hex文件以ascii形式,按照行来记录数据
* 2、每一行从:开始,每至少2个字符表示一组16进制数据,格式为 :BBAAAATTHHHH....HHHCC
* BB -- 16进制,表示此行数据长度字节数,表示HH的数目
* AAAA -- 16进制,表示数据记录的起始地址,若此行是数据记录,则表示偏移地址,其它无意义
* TT -- 16进制,表示记录类型,
* 00-数据记录(Data Record);
* 01-文件记录结束(End of File record);
* 02-扩展段地址记录(Extend Segment address record);后面所有数据地址+段地址左移4位
* 04-扩展线性地址记录(Extend Linear address record);后面所有数据地址+线性地址左移16位
* HH...HH -- 16进制,低字节/高字节 结合数据,高字节在后;注意,若是偏移地址,则都是2字节,高字节在前,低字节在后
* CC -- 16进制,校验码,除冒号和自身以外的其他字节数据加起来模除256的余数的补码,例如:10A6B0000000EB00D4FD0700000F78001E007800BA,CC=01+~(00+00+EB+00+D4+FD+07+00+00+0F+78+00+1E+00+78+00)=BA
*
*
* 需要特别注意的是,:
* 1、对于dsPIC33E/PIC24E,Hex文件地址是乘了一个2,例如一个部分存于0x100,而在Hex中为0x200,详见dsPIC33E/PIC24E编程规范(DS70619B)扩展A中的介绍。
* 2、dsPIC33E/PIC24E没有扩展段地址,只有扩展线性地址
* 3、MPLAB X项目属性中的建设里,勾选规范会HEX文件和不勾选生成的HEX文件是不一样的
* 4、数据记录为little-endian,低端在前
*
*
* 一旦出现段地址或者线性地址,之后所有数据都要加偏移地址,直到出现一个新的段地址或者线性地址,再重新变更偏移地址
* 对于真实地址,是 线性地址左移16位+段地址左移4位+偏移地址
*
* 示例:
* :020000040108EA 线性偏移地址:0108
* :0200000212FFBD 段偏移地址:12FF
* :0401000090FFAA5502 数据地址:0100
* :00000001FF 文件结束
* 真实地址为:0108左移16位,为01080000;12FF左移4位,为00012FF0;数据地址为00000100;加起来为010930F0
* 最终解析出来(8位单片机):
* 地址 数据
* 010930F0 90
* 010930F1 FF
* 010930F2 AA
* 010930F3 55
* 对于dsPIC33E/PIC24E,16为单片机,2个16位组成32(有效的是低24位)地址要除以2,所以真实地址解析如下:
* 00849878 55AAFF90