// 读取芯片内部flash数据: z% f9 x: e: u
// 地址范围:0x0800 0000 ~ 0x0801 ffff 128K Byte: x' v$ H6 [2 A# H9 A
// 循环读取,每次读取16个字节,读取128K Byte /16Byte = 8000 次" b4 Z( N7 c$ s& F9 d. s4 o; G2 f
int base = 0x08000000;0 F& F) T6 Y4 O9 {
for(int i =0;i<8000;i++)
0 H4 I; y2 w. \; ]" w& q+ A
{
1 C& R; ^5 |2 V
//1.发送读内存命令9 r$ H6 R! w5 ~% ]; z
UartSendHex("11ee");
: z L. \" f# O" o' F0 e5 N0 F
Sleep(5);+ B6 I) K* ^6 {
//2.发送地址和校验和
# Q' ?+ d$ E6 k1 M0 i) h
int offer = base + i*16;/ {* o; |! E) @2 [; g( Q, k
QString offer_str = QString::number(offer,16);/ o- R& L) @: g, T, A* z: m
if(offer_str.size()<8)
% q0 C! d. g" h0 I' O1 g
offer_str.insert(0,"0");
1 q- u; L7 a/ `6 \9 q* H9 f
QString check_str;7 j: U# ?" c; M5 v- D" ^
check_str = getXORresult(offer_str.mid(0,2), offer_str.mid(2,2));
1 w& B: M2 ^! S+ R0 e. X
check_str = getXORresult(check_str, offer_str.mid(4,2));
5 P* v0 X8 F4 s/ k1 W# _* @
check_str = getXORresult(check_str, offer_str.mid(6,2));
- Y, P, p% p$ v1 t0 D; J
3 s, r0 j5 [' x/ s
UartSendHex(offer_str+check_str);
4 K: Y& K( m r: A* }7 O
Sleep(5);
6 H' B S/ _, \0 U
//3.发送要读取的字节数和效验和
3 g- k- l1 R K1 A3 r
QByteArray ByteNum = "0ff0";
. I/ N$ A; f* _2 ?* G# g0 z8 L3 e
UartSendHex(ByteNum);% Y, s" J' r, H( K# q
Sleep(5);
, ~" W7 l; F' N, g- F
ui->progressBar->setFormat(QString::fromLocal8Bit("%1%").arg(QString::number((i+1)/10, 'f', 1)));
# {! u2 x! s# c0 c; B( x
ui->progressBar->setValue((i+1)/10);1 t8 J: w# X* H+ T7 Q
}1 k4 z: _' q& U6 y! F0 p
/ E$ Y- U$ f; Z# O
+ f, X. @' m* @, E7 a
// Qt flash数据 转 hex文件算法
* f) z% `7 W U: q6 i
( ]! Z5 |9 K* Y9 [/ s! V. A) `
int t = 0,g = 0;# \9 @# d. o' X) ~$ p
QString text = ui->textEdit_Recv->toPlainText();
) J6 G" v" K: K) h; z# \
QStringList number_list = text.split("\n");. {; W( Z5 b' F" L3 H, q
QStringList result_list;
S9 W8 i6 l( q! m- L, P& G
// 遍历字符串列表,滤除全ffff.........结尾,记录行数
. J8 J9 B3 g5 P5 @# |/ L
for(int i = 0; i < number_list.size(); ++i)
- C: G4 G2 B( L# x0 E8 F+ `. v
{3 R) D2 }7 y$ {: f& P- R6 O. ^' h, A
if(number_list.at(i) == "ffffffffffffffffffffffffffffffff")
& x2 x+ a. e1 r+ G: b5 B; ^
{7 T$ q) m8 q! ~* l9 I# o
t = i;
$ B+ [7 q3 r0 J
break;' M& r* ]+ N# u# u+ A
}6 Q, k% [$ B: i8 T1 [
}
I4 _+ c/ ~# ]3 K
// 遍历字符串列表斩断行,滤除改行的 ffff.......... Q J) e, j0 G( R
text.clear();
& g( _+ }% h. w
text = number_list.at(t-1);2 ? N4 P/ l4 Q
for(int i =0;i<text.size();i++)
+ [2 n5 c% R1 K4 i9 l
{
4 R% t, z$ s: x: v c: P
if((text.at(i) == 'f')&&(text.at(i+1) == 'f')&&(i%2 == 0))
0 n# A$ I" n7 B# J
{; T4 q9 p b- N( a- V" p
g = i;
; R9 p% x( I, {$ A0 Y
break;0 `; Z3 u2 n# _* J' u
}
) z7 _$ U2 V" c6 V3 C
} P# z* i# H+ c* x% T; b' Y
// 拼接新的全数据的字符串列表# V. Y, u0 |, v. H; k
for(int i =0;i<t-1;i++)" Q, A3 ]" d# X. i3 _& {* p
{% k$ ]0 b4 q: k; L
result_list<<number_list.at(i);
- A' U( W, o/ d4 {" }# V! q ^
}
' Q" O; g. A8 a2 } x& M
if(g!=0)( b/ _( p6 @0 V( Y( b U g# A
{: d( I ?6 s8 O. Q$ h0 k
text = text.remove(g,32-g);( ~0 _/ V6 ~& C- c" `0 ^% s
* Z s7 t& ~. f/ ~. k1 y
result_list<<text;$ G! N5 I, {2 @# k1 {
}4 D* G+ c0 C K5 y$ e. V6 f/ U) ]
//生成HEX文件* o3 L8 O& W" M. j
//1.添加 10 字节数. }3 i! n# N r. ?) u/ _
text.clear();
1 K8 Q+ S* u) Z( X1 a
QStringList result_list1;
+ W x' B2 N5 t1 P
for(int i = 0; i < t; ++i)7 Q/ @" `/ i* J4 G( T
{
% g" M9 j9 e1 G6 Q, g& f" [
text = result_list.at(i);/ \% w: }/ y$ `- U
if(i!=t-1)
0 Q& [8 Q3 Q6 s7 }+ P# G
text = text.insert(0,"10");
& w: N4 B# l% I/ w
else! B/ I* s( _( n8 c! @
{/ i$ ] V! ~9 r" N4 S; l
QString str = QString::number(text.size()/2,16);. r' }! i* J9 e0 {0 S
if(str.size()<2)+ F. k4 a% p3 J& c" K2 y
str.insert(0,"0");
+ U4 M6 D' _8 n$ i# N k, p
text = text.insert(0,str);
7 |7 L! b, B. B0 \! b- h v
}
7 y5 c% {; T, g& {$ |! h) ]% y4 z
result_list1 << text;
: L- t4 e' @, N% }$ R
}
5 j2 g& L; B2 T
//2.添加地址偏移4 U+ I% h& J! N2 A% _; t G
QStringList result_list2;1 }9 h( B* n6 p* w3 n6 ?) T
int offer = 0x0000;
* D. L& r# M% }& B+ j
QString offer_str;/ D0 x2 o; @+ Z( z4 {) X( h7 }9 s
text.clear();. v) H) a) p6 Y
for(int i = 0; i < t; ++i)
7 b" [$ N0 {# d7 u& m
{
/ |$ a6 f) t: o- |" K) f( i {0 W
offer = i*16;+ H: n# t$ U5 H/ i$ O& V. k# U
offer_str = QString::number(offer,16);
4 Z0 {& G" C" T" O) S" C3 ~
if(offer_str.size()<4)
- d- F: D: l/ x q, A, j6 R8 l
{& M7 d6 N a2 ]4 T- | i3 r
if(offer_str.size() == 1)
. O1 v( D1 `/ S: }) z
offer_str.insert(0,"000");( c- b8 B+ o) W
if(offer_str.size() == 2)$ A2 v# Z8 H, c, a/ P0 c4 d+ L
offer_str.insert(0,"00");
5 I, _% }4 U$ N" b* P
if(offer_str.size() == 3)) a2 E* \5 D3 G% n: k, z0 x2 d3 t
offer_str.insert(0,"0");
& D# L; }) R) u% r8 d9 ^8 g& K. q! b
}8 M: e! I# W3 ~) |" V( c
text = result_list1.at(i);& `5 i7 C9 ~+ y+ R. D; i0 l
text = text.insert(2,offer_str);
: l+ D8 w1 b+ I3 n- T
result_list2 << text;
* x9 Q; T. X9 e) s a5 S3 O3 @0 U
}
& T# W. }' V" g5 { `
//3.添加效验和
1 D' |" H+ X" t$ ~' b# P w4 [
// 以020000040003F7为例子4 K$ u; y' z; K
//具体算法为 0x100-((0x02+0x00+0x00+0x04+0x00+0x03)%256)= 0xF76 y; u* f* M, `; y8 }* U
text.clear();
! `, g/ Z# c: {5 ~; S) H
bool ok;
$ p8 f- {+ P2 |) e) ]2 r
int check;
7 m) X* T P3 R4 _
QString check_str;, l* c; M8 w0 K' Q. U
QStringList result_list3;
% u. s6 W3 [4 c5 V- V
i9 n9 s0 v$ a" Z1 T
for(int i = 0; i < t; ++i)
- s6 ` W1 x$ d; ?# h0 k
{$ B" N3 E# y6 o0 t
text = result_list2.at(i);
5 N9 H( w! X6 A; M
check = 0;3 g- w7 I! h0 ^9 t0 T1 P* J1 ^( M
for(int j=0;j<text.size();j++)
9 T7 Z" I7 r6 i, d2 }
{5 |6 r+ {4 O2 t( ^ s$ q) M
check += text.mid(j*2,2).toInt(&ok,16);. u+ s3 \- K! `- |
}
* p( }7 k: a( }1 `7 X0 R: k
check = (0x100 - check%256);# W. ?9 W& Q' V! m7 z' _
check_str = QString::number(check,16);5 \9 C" k3 u3 B! ?( {
if(check_str.size()<2)
0 H6 e. M* y7 s- d! {0 ]
check_str = check_str.insert(0,"0");- L% O; u6 s6 c( d
text = text.insert(text.size(),check_str);
# r) D. h+ `1 d% W% C
result_list3<<text;* v' M7 J. {( ]' Q6 ?. w
}* {- Q( x% I& j
//4.添加冒号 :
$ B5 G. Y9 }: O j% J" k1 ~; h
QStringList result_list4;
2 R; F9 L1 _! e
text.clear();" ~( S% r; [. B, m! j9 l
for(int i = 0; i < t; ++i)* U2 f; R) P# L
{6 l/ U, J/ \0 f* S' W+ y- }
text = result_list3.at(i);% n* a: d! n* n) a7 ?* h) D, q, ]$ e
text = text.insert(0,":");7 u% ^. ~) g9 T n
result_list4<<text;: F* u: I+ N. y
}
7 O0 e/ [) `" |9 x- f" P: v; }
//5.添加HEX头部- R8 U+ x) B8 j) V5 k3 F0 u
QString hear=":020000040800f2";' Y( g# v& Q' v$ n8 C
//QStringList result_list5;/ e) d5 n9 n* i! `$ N( P4 i
result_list4.insert(0,hear);
. O- h+ x \( t" C' Z. e
//6.添加HEX尾部; D9 ?2 a4 G- D( B- ]9 D
QString tail1=":04000005080001cd21";
5 a0 T) ]5 u, E
QString tail2=":00000001ff";7 O' p' Q: A/ b" P: O+ v5 @
result_list4.insert(t+2,tail1);
1 l+ Y3 \* E- k- W4 L
result_list4.insert(t+3,tail2);
0 s! r3 Z5 W1 t1 C
//7.保存数据为.hex文件
! O. r! Z. }, e
...............
F! t, W! O5 ]8 C* [' O