文章目录
引言
一、导出到文件
二、HEX386格式解析
三、合成有效数据
四、matlab代码实现
1) 读取文本文件到字符串数组
2) 解析hex格式
3) 转换为真实数据
4)调用方式如下:
一、导出到文件
导出方式如下:
1、 将需要导出的变量添加到memory窗口
2、 使用sava命令导出内存区域
Save命令格式如下:
SAVE d:\data.txt 0x20000924,0x20000924 – 1 + 1000
1
1
其中d:\data.txt为要导出文件的路径,0x20000924为要导出内存区域的起始地址,0x20000924 - 1+2000为要导出内存区域的结束地址。每个地址1byte;要导出内存区域长度由数组大小尘拦决定,如uint32_t debug[1000]占用的内存为1000*4字节,若debug[0]的地址为0x20000924,上述命令可写成SAVE d:\data.txt 0x20000924,0x20000924 – 1 + 4000,uint16_t[1000]占用内存为1000 * 2字节,若debug[0]的地址为0x20000924,上述命令可写成SAVE d:\data.txt 0x20000924,0x20000924 – 1 + 2000;导出的数据按照HEX386格式保存。
二、HEX386格式解析
HEX386格式也叫intel hex格式,在keil官网可以找到该格式的详细定义,详情参见http://www.keil.com/support/docs/1584.htm,在此摘录关键信息如下:
在这里插入图片描述
使派隐胡用keil导出的hex386格式文本每行以:开头
接下来一个字节为ll,表示有效数据长度
接下来两个字节为aaaa,表示这一行数据的起始地址
接下来一个字节为tt,表示这一行数据的含义,
tt=00表示本行数据为导出的内存数据
tt=01表示本行是文件的结尾
tt=02表示本行记录的是内存段
tt=04表示本行记录的是内存地址
接下来若干字节为数据
最后一个字节为校验
在这里插入图片描述
综上,解析hex文件就是找出tt = 00时的数据。
三、合成有效数据
完成hex文件的解析之后,只是实现了按照地址从低到高逐字节读出,还需要根据数组储存数据的类型进行转换。
因为stm32使用小端模式储存数据,对于32位数据aabbccdd,在内存中有低到高储存为ddccbbaa,所以完成hex格式解析后,要根据需要的数据类型重新排列数据,并转换为便于观察的整形数据。
对于有符号数,需要增加正负处理。
四、matlab代码实现
本次实验通过三部实现上述过程:
1) 读取文本文件到字符串数组
具体代码如下携携:
function strArray = readDataFromTxt(filename)
f = fopen(filename,'r')
line_num = 1
while 1
tmp = string(fgetl(f))
if(tmp) == "-1"
break
else
strArray(line_num) = tmp
line_num = line_num + 1
end
end
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
函数输入为文件路径。
函数输出为字符串数组。
2) 解析hex格式
代码如下:
function [address,data] = hex386Decode(strArray)
dataIndex = 1
for rowIndex = 1 : length(strArray)%逐行扫描
charTmp = char(strArray(rowIndex))
byteNum = length(charTmp)
state = 1
byteIndex = 1
while 1 %逐字节扫描
switch(state)
case(1)%:
if(charTmp(byteIndex) == ':')
state = 2
byteIndex = byteIndex + 1
end
case(2)%ll
dataByteNum = hex2dec(charTmp(byteIndex:byteIndex+1))
state = 3
byteIndex = byteIndex + 2
case(3)%aaaa
addr = hex2dec(charTmp(byteIndex:byteIndex+3))
state = 4
byteIndex = byteIndex + 4
case(4)%tt
dataType = hex2dec(charTmp(byteIndex:byteIndex+1))
if(dataType == 0)
state = 5
byteIndex = byteIndex + 2
else
break
end
case(5)%[dddddd]
for dataByteCnt = 1 : dataByteNum
address(dataIndex) = addr + dataByteCnt - 1
data(dataIndex,1:2) = charTmp(byteIndex:byteIndex+1)
byteIndex = byteIndex + 2
dataIndex = dataIndex + 1
end
break
end
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
使用状态机控制读取过程。
函数输入为字符串数组,字符串数组的序号对应导出文本的行。
函数输出为内存地址,以及每个地址对应的内容。
3) 转换为真实数据
代码如下:
function data = byte2word(hexByte,bits,isSigned)
data = 'ff'
switch(bits)
case(8)
data = hexByte
case(16)
len = length(hexByte)
cutNum = mod(len,4)
hexByte = hexByte(1:len - cutNum,:)
byte1 = 1 : 2 : length(hexByte)
byte2 = 2 : 2 : length(hexByte)
data = [hexByte(byte2,:),hexByte(byte1,:)]
case(32)
len = length(hexByte)
cutNum = mod(len,4)
hexByte = hexByte(1:len - cutNum,:)
byte1 = 1 : 4 : length(hexByte)
byte2 = 2 : 4 : length(hexByte)
byte3 = 3 : 4 : length(hexByte)
byte4 = 4 : 4 : length(hexByte)
data = [hexByte(byte4,:),hexByte(byte3,:),hexByte(byte2,:),hexByte(byte1,:)]
case(64)
len = length(hexByte)
cutNum = mod(len,4)
hexByte = hexByte(1:len - cutNum,:)
byte1 = 1 : 8 : length(hexByte)
byte2 = 2 : 8 : length(hexByte)
byte3 = 3 : 8 : length(hexByte)
byte4 = 4 : 8 : length(hexByte)
byte5 = 5 : 8 : length(hexByte)
byte6 = 6 : 8 : length(hexByte)
byte7 = 7 : 8 : length(hexByte)
byte8 = 8 : 8 : length(hexByte)
data = [hexByte(byte8,:),hexByte(byte7,:),hexByte(byte6,:),hexByte(byte5,:),hexByte(byte4,:),hexByte(byte3,:),hexByte(byte2,:),hexByte(byte1,:)]
otherwise
err = "不支持的输入"
end
data = hex2dec(data)
if(isSigned >0)
switch(bits)
case(8)
data(data >= 2^7)= -2^8 + data(data >= 2^7)
case(16)
data(data >= 2^15)= -2^16 + data(data >= 2^15)
case(32)
data(data >= 2^31)= -2^32 + data(data >= 2^31)
case(64)
data(data >= 2^63)= -2^64 + data(data >= 2^63)
end
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
函数输入为hexByte字符数组,每行为一个byte的内存数据。bits为每个输出数据占用的内存字节数,支持8bit,16bit,32bit,64bit,isSigned >0表示数据为有符号数,否则数据为无符号数。
函数输出为想要导出的数组内容。
发挥matlab矩阵 *** 作的优势,实现了8位、16位、32位、64位有符号整形及无符号整形的处理。
(1)一慎早般情况下,双击即可打开,因为默认安装程序,.mat默认用带镇MATLAB打开。(2)或者
运行matlab,在workspace
中有一个load
data
file按钮,即可读宽行雀入数据,
(3)用
imread
命令
------------
希望有帮助
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)