// 读取芯片内部flash数据
g3 Y# b% M; [& ^& @$ G% M
// 地址范围:0x0800 0000 ~ 0x0801 ffff 128K Byte+ M- t4 Y% V6 L3 q- G
// 循环读取,每次读取16个字节,读取128K Byte /16Byte = 8000 次" K; v4 S; i# Q" l
int base = 0x08000000;
' \' X4 S& q) p' H: ?) D+ A
for(int i =0;i<8000;i++)0 b: H3 @9 U6 m
{ K# o5 {. h& e# ~; v
//1.发送读内存命令
5 Q$ b& ?+ B! G o+ q
UartSendHex("11ee");
) r8 E/ t2 [9 W, i% Y' B% C: _( P$ K
Sleep(5);
8 X4 M/ f2 q" }( ^4 } J
//2.发送地址和校验和
" [% K( }# \! Z: e, a* \
int offer = base + i*16;
* `. Z7 F9 U- Y' e
QString offer_str = QString::number(offer,16);, s/ S a7 K" u
if(offer_str.size()<8)
- J: W' I3 Y. d/ V. `
offer_str.insert(0,"0");
9 g( n0 G$ p! U, R/ g% S+ z9 h
QString check_str;2 p& M) B( M9 I
check_str = getXORresult(offer_str.mid(0,2), offer_str.mid(2,2));
- E3 A! ^0 U- y+ o
check_str = getXORresult(check_str, offer_str.mid(4,2));
: I, [) |6 u7 E* q
check_str = getXORresult(check_str, offer_str.mid(6,2));& L* A. D' o/ `; R( O$ B4 k; |0 o" W2 V7 ]
$ `% b4 U! Z" a/ R/ u- R1 w
UartSendHex(offer_str+check_str);
2 N0 W* c3 `8 `! u& x# o* C
Sleep(5);% m. D, N% U9 A9 M( ^, E8 T6 m* `
//3.发送要读取的字节数和效验和) m7 k3 h; f% s' V6 p' c
QByteArray ByteNum = "0ff0";
! w9 e E2 K) O0 {
UartSendHex(ByteNum);
" s) \6 \- u/ r
Sleep(5);
2 s8 G) ~0 y- G7 R
ui->progressBar->setFormat(QString::fromLocal8Bit("%1%").arg(QString::number((i+1)/10, 'f', 1)));+ c& X3 o4 X; z2 B/ a& v
ui->progressBar->setValue((i+1)/10);( v o' l; j v! J
}5 A# @3 Z. V9 g9 W3 L
* Z, [! M3 c/ x. M/ B6 `& `
" C$ S5 u3 [6 K7 h) r7 U% i
// Qt flash数据 转 hex文件算法
$ H- v. R$ p/ `' F5 E+ F
$ U$ X* v1 P: L0 [' C/ D9 `2 ~
int t = 0,g = 0;
. N C* y) o9 s
QString text = ui->textEdit_Recv->toPlainText();4 J' g# V1 m: c& x# s
QStringList number_list = text.split("\n");8 J" C' ?" K+ ]2 W1 o2 S
QStringList result_list;# H4 Y# s8 O0 p N9 p( A2 w
// 遍历字符串列表,滤除全ffff.........结尾,记录行数
/ v9 M4 R. r3 R
for(int i = 0; i < number_list.size(); ++i)% A2 w0 C! `6 W. u* U
{( p+ J1 n, S- {' M: u2 u4 B! f
if(number_list.at(i) == "ffffffffffffffffffffffffffffffff")4 B! u5 {- N% B
{
% M' I. F0 A2 _& r; Q6 r
t = i;
0 Z# f1 L& ^6 g! y
break;$ d i! J" z% S* x( ^
}
j6 z" f$ |: x" M' G: M7 h- X
}
+ c6 D- I& f; G
// 遍历字符串列表斩断行,滤除改行的 ffff.........
9 `* C1 S" N' u# V. R0 E+ G7 ^! y' U
text.clear();
i6 X! n9 q! Y- B) l$ f
text = number_list.at(t-1);. X1 u$ C& ~, U. f6 f; e% w) l% @
for(int i =0;i<text.size();i++)
8 c* f d3 j1 E9 d4 E. b3 J& M3 @
{
" L% h* v+ l2 A) M
if((text.at(i) == 'f')&&(text.at(i+1) == 'f')&&(i%2 == 0))
+ f! `* u+ K9 k' D& _
{. v+ R' X- | F: J4 N+ H/ |' K
g = i;
" u4 F1 c6 V) A$ A0 N |+ {8 D3 h
break;1 U& E& r/ o1 w& e
}
* H9 z' L3 B% `2 D" p7 q0 G
}
. D$ K2 p/ x0 a }' r! p
// 拼接新的全数据的字符串列表
4 x1 P% W* o2 F9 c1 e
for(int i =0;i<t-1;i++)
6 Q' K2 l9 ? }& L
{
( K: R' |; |! M
result_list<<number_list.at(i);/ A2 w! O8 g* _$ o# [
}9 d% m9 W; `! [# V9 L* L- J
if(g!=0)1 W7 x6 w- p; w" ^( W* _
{- F8 Y3 m: F# X3 l: k2 T! ~8 f
text = text.remove(g,32-g);
8 l3 y$ E( t3 z6 ~. u, B, a
4 r. M; u5 A' P0 u" q9 h" u
result_list<<text;, |. A& K' }* t1 s' s- o, c* w# k- ]- C
}0 `: O8 ^! y ?# z4 U
//生成HEX文件
l/ c# z0 M' k& o
//1.添加 10 字节数+ }6 _3 F# n+ U! ^
text.clear();9 D. M5 m; g+ ? H0 o
QStringList result_list1; z$ [' Z8 E) I5 t
for(int i = 0; i < t; ++i)
( P" D( T" F+ b& o
{6 g) L5 g& @3 f4 a$ b
text = result_list.at(i);9 K; L; }7 W: |) u
if(i!=t-1); u# t6 B1 t. @1 a* T4 V
text = text.insert(0,"10");# j& S- s C9 y' k% }) ^; R
else
' y' |7 z, z2 g- K4 O; y" q! n; W
{
3 A. u" y4 k5 E8 n$ g. f: x
QString str = QString::number(text.size()/2,16);
& Y4 B- L5 b* m/ }% Q
if(str.size()<2)+ U; }& f& {9 E+ a6 L6 x9 E) V
str.insert(0,"0");
5 a3 i0 i9 \ |: S# q/ |
text = text.insert(0,str);
d" @3 ~* \, H5 X8 Y
}
5 C' U/ m6 g/ T$ ~5 Q9 O
result_list1 << text;
; ^% w: e# r Z y, ]
}9 B" Y! A0 ?' Y2 t1 B
//2.添加地址偏移
" S2 Q* _5 M# S
QStringList result_list2;' A4 B8 u4 F& [+ K3 M; b+ c, {4 t
int offer = 0x0000;# m- w# D% x+ u# s; I* d
QString offer_str;
i2 G+ [ o w5 m
text.clear();
6 U9 K6 o5 \2 N
for(int i = 0; i < t; ++i)6 \( O% k) f9 o& T5 u( V
{
6 A' O# D. c0 D: ]
offer = i*16;" ^2 m. F4 s' {# T( E
offer_str = QString::number(offer,16);5 l/ P7 \$ r& l u+ R. [: _, b0 |
if(offer_str.size()<4)
: d9 F$ q* J% _
{& ?* {$ W0 w) q; t9 j w0 G2 D+ H3 Q4 ?
if(offer_str.size() == 1)0 J# n, ^3 J, S
offer_str.insert(0,"000");/ i! m% W1 c1 U5 m
if(offer_str.size() == 2)( d6 m O" x. t7 M0 C' I
offer_str.insert(0,"00");
2 Y! N8 C# i1 u; R0 Z
if(offer_str.size() == 3)
! s* S( I5 S! H# q
offer_str.insert(0,"0");5 L9 e. K* X- y$ h8 g! o+ X9 a
}5 _; { v5 K9 Q5 J2 @! {
text = result_list1.at(i);
* ~4 P6 Q$ a8 |) F: g5 H& \
text = text.insert(2,offer_str);- |! E) s R5 ~2 M% o" }
result_list2 << text;
4 Y6 W; T/ e' Z4 z3 A L
}
8 ^/ Y4 L( P: e: ~4 V; S9 k
//3.添加效验和! O. C1 e) w: Q v
// 以020000040003F7为例子- ]1 P+ x+ p$ }3 I+ S
//具体算法为 0x100-((0x02+0x00+0x00+0x04+0x00+0x03)%256)= 0xF7
* I0 N4 T0 T7 x! ~, V/ y
text.clear();
+ S) `! u& G7 W6 s" s" ^9 |) ?9 g3 z
bool ok;3 H& z2 q" j6 |. r/ `3 [: b4 x
int check;
& l X& V, ?7 x, I4 ^, `( }
QString check_str;% ^0 T" f; @5 {2 [! h) ^: H g
QStringList result_list3;* Y1 \9 r0 Q8 W
& d9 [2 t/ d! K, F& M6 L- p
for(int i = 0; i < t; ++i)1 Z7 z8 Z4 Z5 r0 Z' r
{/ U4 T c9 m% K5 P
text = result_list2.at(i);
2 Y7 `0 k3 \7 j# l0 n: v* z
check = 0;
3 x) p+ k% z+ n8 I/ C J. p
for(int j=0;j<text.size();j++)' E, q! i7 m0 F- F* z& {
{9 ~2 D6 ~# I+ P9 @+ I) y7 b
check += text.mid(j*2,2).toInt(&ok,16);
3 Z9 G( d( m, {( J4 W# G g( a
}6 r v8 L, J- }) ^7 z6 j3 f
check = (0x100 - check%256);* Y, m0 c- |5 j5 g
check_str = QString::number(check,16);# L$ _3 o5 u: O# o8 x ]/ I
if(check_str.size()<2)
8 w" v' p% w- ?7 t+ B3 V+ w( x
check_str = check_str.insert(0,"0");) |9 ^( C9 W) O/ c; U% L. N( t/ G
text = text.insert(text.size(),check_str);* K8 m. ^0 K7 @
result_list3<<text;8 w+ I5 ?0 ? ^5 h! E
} F: V6 I! \ J$ \- b
//4.添加冒号 :) `( }1 u# D) R, _. W9 ^2 b% V
QStringList result_list4;
# I: |& s/ U8 I; [" D( j/ Y
text.clear();1 n5 q$ C* B* K" Q3 d" G6 c7 e
for(int i = 0; i < t; ++i); ? v$ n* Q8 D% e) q
{* e2 e6 k% U3 @6 Q& f
text = result_list3.at(i);* z* w- g! s% r/ O2 w
text = text.insert(0,":");
1 I( w, R( T& O: e( ^" b% L
result_list4<<text;# i5 o y. ?: a, C* d) ?# e
}
4 r+ y, D' ?/ D* h* r
//5.添加HEX头部$ @5 N7 ^# o$ W$ [7 d& O# |
QString hear=":020000040800f2";! y. e- o# P8 e" Z+ a. z% i1 ?. |
//QStringList result_list5;- S! m* n8 c$ k7 _( J X7 `
result_list4.insert(0,hear);
! v3 T3 V% o6 @. M7 v5 s/ X+ J
//6.添加HEX尾部
; m) k/ @0 t) @( R3 f- H
QString tail1=":04000005080001cd21";6 J6 l' T; K2 e, J1 o
QString tail2=":00000001ff";
% [* r: l5 P& R* s: g1 E. J
result_list4.insert(t+2,tail1);
1 L* Z' x) R$ V+ W
result_list4.insert(t+3,tail2);
& c! {% P5 j8 _' R" H4 R
//7.保存数据为.hex文件( g1 q2 K) i% k( e. S
...............
! [) Y A8 s) a" s q