用matlab生成HEX文件

来源:互联网 发布:看门狗卡顿优化补丁 编辑:程序博客网 时间:2024/06/13 01:06

首先,说明一下Intel HEX文件的格式

(可以参见wiki:http://en.wikipedia.org/wiki/Intel_HEX)

:10010000214601360121470136007EFE09D2190140:100110002146017EB7C20001FF5F16002148011988:10012000194E79234623965778239EDA3F01B2CAA7:100130003F0156702B5E712B722B732146013421C7:00000001FF
每一行代表对一个数据的描述,最后一行是结束。

可以看到每一条数据有6个颜色,每个颜色表示数据的一个区域:

  表示开始码,固定为:
  数据部分的字节数,数据部分两个16进制数代表一个字节
  地址,固定4个16进制数,可见,可描述的数据是有限的
  数据类型:00表示数据,01表示结尾,,,,
  数据
  校验,检验的方式是把前面的数据除了开始码部分的按每两个16进制一个字节进行相加,加大结果保留一个字节,并取反码。
知道了结果就用matlab编个程序吧:(参考:http://bbs.ednchina.com/BLOG_ARTICLE_2087845.HTM)
clear all;
clc;
%描述一个16位位宽的数据
y=0:63;
N = length(y);        %%数据的长度,即存储器深度。
word_len = 16;           %%每个单元的占据的位数,需自己设定。
len = ceil(word_len/8);  %%转换成字节数。
y_quan =fi(y,1,word_len,0); %%该函数详细见Matlab帮助
fid=fopen('dat.hex','w');%打开文件
temp1=fi(256,0,9,0);
word_len = fi(len,0,8,0); %%即前面所说的”nn”
for i=1:N
addr = fi(i-1,0,16,0); %%即前面所说的”aaaa”
%%下面计算校验和
    temp=word_len+bitsliceget(addr,16,9)+bitsliceget(addr,8,1);
    temp=temp+bitsliceget(y_quan(i),16,9)+bitsliceget(y_quan(i),8,1);
    temp=bitsliceget(temp,8,1); %%取低8位,即相当于取模256
    temp=temp1-temp;%%上面两步是取其补码,如果字长是n位,大小%%为a,则其补码为2^n-a;
    temp=bitsliceget(temp,8,1); %%重新取低8位,这里需要明白%Matlab中fi构造的定点数性质
    fprintf(fid,strcat(':',hex(word_len),hex(addr),'00',hex(bitsliceget(y_quan(i),16,9)),hex(bitsliceget(y_quan(i),8,1)),hex(temp),'\n')); 
end
fprintf(fid,':00000001ff');

fclose(fid);  %%关闭文件



补充说明一下:

  • a = fi(v,s,w,f) 这个函数返回的是v的定点表示,s表示是否是有符合的,w表示字长,f表示小数点后的字长。





原创粉丝点击