// 读取芯片内部flash数据
, p k1 m1 b- f/ }! m
// 地址范围:0x0800 0000 ~ 0x0801 ffff 128K Byte
4 A/ m$ Q! s" s
// 循环读取,每次读取16个字节,读取128K Byte /16Byte = 8000 次
_2 t4 w2 t. } G- p& Y+ H
int base = 0x08000000;
) k& _( @! ]# ^) B
for(int i =0;i<8000;i++)
9 ]+ e9 Z7 d' u. z. k" H$ K# U
{
% i1 B9 L/ y7 m( Z7 y, r1 B; M
//1.发送读内存命令0 b z. d9 J1 n& T
UartSendHex("11ee");
, A- y3 U* |" j' m; R1 D0 I
Sleep(5); A% x# O/ G, S9 m7 r4 B( Z9 Q4 B
//2.发送地址和校验和" T3 \1 x' i+ R: r
int offer = base + i*16;
, Q {1 D- h+ v y
QString offer_str = QString::number(offer,16);
' N' Z+ X2 C/ w* R9 Z4 J
if(offer_str.size()<8)* `! [: _: t [9 D: B& R4 l
offer_str.insert(0,"0");2 t6 ?0 S9 z# ]$ _
QString check_str;0 b. C. g8 h+ {7 s
check_str = getXORresult(offer_str.mid(0,2), offer_str.mid(2,2));
+ F3 w% I: }6 P& u. Q5 n: r& I
check_str = getXORresult(check_str, offer_str.mid(4,2));
" Z2 T% |# u; v; w* H
check_str = getXORresult(check_str, offer_str.mid(6,2));
1 i" Y. ]* z5 c3 T
0 n, X* z# ^3 ^! v' @3 z. k" F
UartSendHex(offer_str+check_str);
) Y i2 \! B3 u* p( H& V
Sleep(5);7 t1 e7 @3 g4 w- s
//3.发送要读取的字节数和效验和
* v0 l6 v, @6 k
QByteArray ByteNum = "0ff0";4 x/ e* V5 L$ A, m* O
UartSendHex(ByteNum);
* C5 W) F: D0 ]/ k% j: n. F* I
Sleep(5);! S) P2 A( c' v" R: `$ R" S! Z; Y
ui->progressBar->setFormat(QString::fromLocal8Bit("%1%").arg(QString::number((i+1)/10, 'f', 1)));4 E; c" I+ z; l' C9 C9 V
ui->progressBar->setValue((i+1)/10);* U+ R: m8 l5 e2 n
}0 G* \( ]" ` I* `* I U/ |0 Y1 W
. k8 ?4 \ a% d5 M9 {9 }9 ]
2 E1 G; V1 t2 P6 R4 g- ^& `% D
// Qt flash数据 转 hex文件算法* {6 r2 d' O, p; E6 @
& K5 A1 `1 B% y3 h B+ M
int t = 0,g = 0;9 Y% u) [) I* @- D' j2 {" p
QString text = ui->textEdit_Recv->toPlainText();
: i; \$ A' Y: |% i1 I+ A) L
QStringList number_list = text.split("\n");( Z- E+ _2 n' X% |# w9 X
QStringList result_list;
1 G1 g$ j! a/ ~7 E, `
// 遍历字符串列表,滤除全ffff.........结尾,记录行数
6 d! n8 R5 P5 ~ X( A7 W
for(int i = 0; i < number_list.size(); ++i)" U2 m- b' M) ^2 P- b* n
{
9 ^0 d r6 E7 q
if(number_list.at(i) == "ffffffffffffffffffffffffffffffff")
4 |: ~/ g( ]# Z! @, ~- s+ g
{# L$ O1 X" ^/ z" B* n$ I: `: \
t = i;, W$ ^/ O$ Z1 f/ H2 i: L- q
break;. x# I; A& W+ c9 ]
}
2 m" [. ]/ T, O6 b
}
! D$ y3 N8 q8 ~, t: A c' S9 e
// 遍历字符串列表斩断行,滤除改行的 ffff.........: `) t$ v V' a) V* a
text.clear();
; R* ~) Q/ e/ f4 y
text = number_list.at(t-1);
" Y. g# O/ X: C% w' Q
for(int i =0;i<text.size();i++)1 W* i7 [& z) G! B- D! a
{
4 j. a$ c* y& t* x! u! G4 A% @
if((text.at(i) == 'f')&&(text.at(i+1) == 'f')&&(i%2 == 0))6 A ]* M9 v$ d. d
{3 x- _2 A* N1 w# J+ P6 X. N7 w
g = i;
/ X7 J8 D4 }" G! m# e9 q N0 g
break;# n, i4 j9 M! _# X! y1 I
}
+ P& D0 H5 Q4 L9 p2 B, |) l/ J2 h2 {
}8 s# g' Y, D2 b9 z4 k o
// 拼接新的全数据的字符串列表
$ ]+ ? Q& I6 D$ x6 N
for(int i =0;i<t-1;i++)
$ Z5 e) H' F* F% G. I/ k. q
{5 i! M0 `% I: S- m0 H, Z) Q
result_list<<number_list.at(i);) J. {" l/ y% M( D5 X) a' b
}
4 n; w2 I5 B$ n, d& S
if(g!=0)5 Y# \3 F$ ~8 }: ^; }
{
. ?3 o5 v/ {: V! N# c" q# k! K
text = text.remove(g,32-g);8 {! c+ F% v7 c3 {3 Q8 S
- _3 `' d- C! ~/ X3 \
result_list<<text;
3 o' a, V5 C5 C
}
# ]5 K7 R5 I, ~: }! Y* X" ~) f
//生成HEX文件
1 _2 Z1 t- u! D/ P5 U; Y5 G# D- J# ]
//1.添加 10 字节数0 c T9 \7 f1 j, j& V8 H$ K
text.clear();
. W: E$ k0 q8 n3 ` K: @9 P5 D3 _
QStringList result_list1;
. D8 \. k! u; p- H& z% m9 D
for(int i = 0; i < t; ++i)! x' d. Y, {; _3 J& a7 O4 f
{
& E2 C% \& b u) Z
text = result_list.at(i);
6 ~8 r( T% z' N: F. }( T
if(i!=t-1)
. _' A0 m* w+ O3 h/ I5 i4 C
text = text.insert(0,"10");; t+ @5 w$ B+ n* h# ?5 M
else
; b+ |. D. U: S- B
{6 y4 i+ n* H, z7 t0 U9 ?1 A
QString str = QString::number(text.size()/2,16);
9 H& K: ~# n& t/ E" L- b
if(str.size()<2)
" X2 S2 ~% f, r1 q
str.insert(0,"0");
) R/ P3 ]( D* W/ _ E! S
text = text.insert(0,str);! V) D, l% x2 O
}
$ U& Z1 N* I9 E. j. `9 j
result_list1 << text;
# w! S4 N9 U/ N# _1 `( n
}
& T/ V2 @; O H$ P0 N3 E
//2.添加地址偏移9 Z4 D3 |" ]0 z
QStringList result_list2;5 B3 o5 B P: {2 h3 |& A2 w% O* r3 W' h
int offer = 0x0000;
2 x$ N+ l% k4 y/ p% G$ k
QString offer_str;
2 b% Y# U7 n3 k6 U1 ?0 n( B; |; q
text.clear();
: u7 X$ x; \* m
for(int i = 0; i < t; ++i)) D5 I/ t, L! E8 L- T
{
, P, i% N7 W8 d6 X& h
offer = i*16;" S8 c5 B, R5 c) @4 p: C; _+ ~
offer_str = QString::number(offer,16);7 ?$ R" g, J# v
if(offer_str.size()<4)
& ]# n8 r! z8 f1 |& q
{
7 ^6 s* e6 {8 ^
if(offer_str.size() == 1); t, C" D; l" }" P
offer_str.insert(0,"000");
3 \* A/ l/ C, j3 ~; ~
if(offer_str.size() == 2)* @0 F3 C6 m, f0 b, A
offer_str.insert(0,"00");
, d5 A* N7 a7 C
if(offer_str.size() == 3)6 f/ {" D8 s* C* G6 h" n' i
offer_str.insert(0,"0");
% }3 a6 S7 V* D" k+ r# P& z$ U
}
' E( ~, B5 q' b- J
text = result_list1.at(i);
+ L4 d1 ?3 j2 Y D' ^
text = text.insert(2,offer_str);
1 \: E& _3 n8 {5 R. G* t& L
result_list2 << text; F6 ^3 }* g+ {2 l1 ~
}
5 h' A: K* i# w
//3.添加效验和7 e0 A' L4 x7 `9 p
// 以020000040003F7为例子
) i0 [+ ]& ^* O" n1 V
//具体算法为 0x100-((0x02+0x00+0x00+0x04+0x00+0x03)%256)= 0xF7
: v7 G. ^, Q B4 k& L, R
text.clear();
i2 ]4 W* D: q5 l- r; F, \
bool ok;
# v7 e' U# k3 |) p
int check;
) i# C5 N7 f+ K+ M8 t# Y
QString check_str;4 ]# w# _( R1 d+ Y; g# m% X1 p: q
QStringList result_list3;4 U; d! J* V' M* v
( U" \& `, p% L0 f+ a, d
for(int i = 0; i < t; ++i). K: h$ P9 b2 \ p3 A- E
{
9 a) l1 R: k' x4 X) U
text = result_list2.at(i);% Q9 n7 F' b1 \& x" T: ^
check = 0;' F; _. Q: T8 e8 r& Z
for(int j=0;j<text.size();j++)
$ Q$ ?$ q* y; N- F8 B0 D" @" l; I
{+ {/ U) _! C. _
check += text.mid(j*2,2).toInt(&ok,16);
( ~; x4 A3 u) U$ m0 W9 {, j* ^
}
2 }9 H7 S: F6 ]0 ^$ w. F) y- V
check = (0x100 - check%256);# n1 h, w M) M' B. H) @6 P0 F
check_str = QString::number(check,16);
/ Z8 R2 V+ V5 O. X" q' o
if(check_str.size()<2)5 z( y8 K7 v5 g; e0 u0 {* X6 n/ v
check_str = check_str.insert(0,"0");
0 h Q/ ~0 M$ }( Y! @0 L3 N' ]
text = text.insert(text.size(),check_str);/ m- t# l) p. r
result_list3<<text;
) \+ t8 M$ Y) Q7 G, W
}
/ E1 \0 w' ?- {, p" R2 {' {
//4.添加冒号 :
& C+ {! ?5 P" M" A! }* D* |' q+ B
QStringList result_list4;1 {/ |$ i- i5 V- h" T& J
text.clear();
- e- z2 l, z, Z% U8 g* `
for(int i = 0; i < t; ++i)& y b2 O, g, w" T* V
{
) w. E( S6 r* i$ }& i c
text = result_list3.at(i);
: a& X7 z+ ~* |% N5 Y& U8 ~% t
text = text.insert(0,":");
8 m" Y0 ]& ?" q3 J8 S% g
result_list4<<text;/ l! g: Q5 d* W2 l
}
/ o2 Z: M" F$ f3 }1 B; |7 ?
//5.添加HEX头部. Z& H9 O+ e, j
QString hear=":020000040800f2";
. a# U' q w2 |, A- c8 Y) c
//QStringList result_list5;
& c0 t6 A6 T( g: ?! j% A% o
result_list4.insert(0,hear);
, ]( P1 ]! s, F. z9 V
//6.添加HEX尾部
n9 Q4 A5 W& n+ o
QString tail1=":04000005080001cd21";
! O; N0 [' E9 @" |) [9 j9 ]: P8 l
QString tail2=":00000001ff";/ }9 j& f. n' b/ i+ n' e1 R0 H8 f
result_list4.insert(t+2,tail1);+ m H' D% V' Q8 r: Z& _9 m1 Z
result_list4.insert(t+3,tail2);
% }7 ]% x- A B: m- k4 o/ Z$ _
//7.保存数据为.hex文件" x* u% w3 w3 | m
...............
U/ s% ?& I9 U$ U/ i