你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)  

[复制链接]
xuhaoyu-326567 发布时间:2014-4-1 22:49
        最近做一个产品,由于是新品不了解现场环境,导致仪表到现场安装完了还要改程序。这样就悲剧了要把仪表拆开,断开看门狗连上电脑才能修改程序。所以想要使用IAP(通俗的说就是程序下修改ROM的内容)来修改程序,这样就可以避免以上问题。- L! l% J1 N0 b' _4 V  Q* K
        带着这样的问题在网上搜索相关内容,首先搜索到的是战舰开发板串口升级程序,www.openedv.com/posts/list/11494.htm这是一篇非常好的文章。通过这个教程我们可以了解STM32的启动过程,以及调用中断函数的过程这里我就不多说了。但是实验下来发现这个是一个好的教程但不是一个好的方案。主要问题有三点! S; Y, f; k& ]: s# J! D9 y& a0 p
        1、升级程序不能离开电脑(或者自己串口发送设备)‘;5 J/ O8 p% C1 k2 @/ A& ^
         2、要升级的程序是先通过串口写到RAM再写道ROM中的,这样就有很大的局限性。比如代码的大小不能大于RAM的大小等;
& q4 j) J$ `/ t# c+ b         3、无校验功能,串口通讯存在一定的不可靠性可能会出现 错误的代码文件。
4 Q4 l6 r$ n2 E! _& m" m2 P- f        带着以上三个问题继续思考,要解决第一个问题首先需要一个程序的载体(存储器)。这个载体需要通用型强,携带方便这样SD卡和U盘就在我的考虑范围之内了。选哪一个呢我们看看他们的优缺点
, C8 ~" u! w; D7 h5 c1 i# f; {        1、首先不管是SD卡还是U盘都需要移值文件系统;
  p$ J( W# u( H' g! ~) q4 A         2、SD卡在接口方面是SPI驱动比较简单(无SPI口也可以通过IO口模拟实现);0 @' J# [7 N) w$ N6 Z2 v3 h: ^
         3、U盘的接口为USBHOST接口(无法模拟)。
. V  g* O/ H4 E9 v8 l  V        考虑到通用(部分单片机不带USB—OTG)和易用性最终选择了SD作为程序的载体升级程序。$ r" @, a8 l& v1 D
        第二个问题RAM大小的局限性,可以通过数据流的方式解决,简单说就是把数据分段搬到RAM中再写到ROM中。
5 M& i! I: [. {) S  ]# o6 m        第三个问题校验的问题,校验的问题想到两个方案
2 c9 {, e' ^6 V/ s: y       1、使用上位机程序处理BIN文件加上头尾以及校验码,这样感觉是一个新的文件格式了呵呵;
# ^% a0 b0 P. P# X4 E! R. X5 D       2、使用HEX文件直接烧写程序(HEX文件自带校验)。: B* w. `: P# O) t3 A; ^2 u# A
       考虑到简单易用选用了HEX的文件烧写解决校验的问题。
+ b6 n7 V: z7 }+ Y      这样通过以上方案论证得出最终的方案为,使用SD卡作为文件的载体 ,数据分段写入ROM中采用带校验的HEX文件作为烧写的源文件进行IAP更新程序。
( `8 O% q" d. X. L# Y8 v ////////////////////////////以上为方案论证///////////////////////////////7 o* J' f  e+ m( Y
//////////////////////////////////方案实现/////////////////////////////////////) T1 y- W8 ?4 l$ M
   SD卡的驱动以及文件系统的移植网上的资料比较多,大家可以搜一下。战舰的例程就是非常好的这里不多讲。本文要着重讲一下HEX文件,HEX文件无法直接写到ROM中要转为BIN可以。那么如何转换呢,这样我们首先就要学习HEX文件的编码格式。看一下KEIL的官方说明www.keil.com/support/docs/1584.htm在这个网页里面详细的说明了了HEX文件的编码格式。, k2 A# f0 S/ ?8 o; \6 m8 r
    [size=1.125em] [size=1.125em]简单说一下HEX文件格式:3 q0 ~3 l9 L3 f+ m6 v
- b0 h! N0 }4 N2 f5 v0 W: V
      一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.
, Q- z9 d+ u+ \1 }' A:llaaaatt[dd...]cc
) [  q* y; j; y5 z1 _/ v每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述." {1 u# O" d. e4 K- o/ m$ G7 ~9 q
:冒号是每一条Intel HEX记录的开始' P. k: r6 d4 J
ll是这条记录的长度域,他表示数据(dd)的字节数目., I0 F7 @( @: J4 w2 n- ]5 y6 R
aaaa是地址域,他表示数据的起始地址" S. b3 M- g7 J, B' @. d6 e
tt这个域表示这条HEX记录的类型,他有可能是下面这几种类型4 r. a8 N6 L- N" m/ {) w; G+ C" b
00 ----数据记录. W1 w& @* }2 S; m2 Z# l, A  T
01 ----文件结束记录
  [3 X! Y& C: t! T: G02 ----扩展段地址记录2 A, y- S4 N; i6 B" E4 ^9 j
04 ----扩展线性地址记录' R+ ~$ w# l( ?/ i# i+ Y! Y
05 ----启动地址记录行(只有MDK-ARM下才有)# L% ?; S2 h+ p. r
dd是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看ll域的说明
8 D" S2 d% l$ j, Acc是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有对字母所表示的十六进制数字都加起来然后模除256得到的余数最后求出余数的补码即是本效验字节<span lang="EN-US" style="font-size:10.5pt;mso-bidi-font-size:12.0pt;font-family:"Tahoma","sans-serif";mso-fareast-font-family:宋体;color:#333333;mso-font-kerning:1.0pt;mso-ansi-language:EN-US;mso-fareast-language:ZH-CN;mso-bidi-language:AR-SA">cc.7 P* o0 {0 v9 H
='0'&&l='a' && l='A' && l='0'&&h='a' && h='A' &&h = nSize)2 X0 k1 I* m! D. G; ~6 Q
    {
0 [9 x- @! y  i" }; `; y9 U        return false;3 A. [' n) H) S
    }
; W& C# L9 i# F% X# V5 D' k % {( b* e4 h) L) w7 Q, g) m$ e

( y1 i( h! Y" D& B6 A4 y    for(nPos=nStart; nPos=60)' V, P4 g. _3 H0 d& f0 @/ D; p
                        {' i' ]: ?, A; t/ P/ |$ K
                        return false;9 L  l: T1 m) G2 c  S( P9 |
                        }
0 I" h) L2 A7 j! S* \, g* u             memcpy(strLine, pBuff+nStart, len);
( e- Q; }$ T3 M1 P1 h/ W+ i/ ^               strLine[len] = '\0';
% i: `( ~. D6 E% ~& C5 r0 X             nStart = nPos+2;
* E& V: {/ w* G: s8 D" j/ \" v                     nRemain = 0;# x, F) N4 s+ w5 r$ s" Y
             return TRUE;3 \$ F2 m! c3 o9 M9 D8 Z3 D
        }        
" Z3 x: s# E4 z8 P, X! }    }
( y7 @- g: B0 K+ L    //最后一行没"\r\n"
9 N5 U' _% R2 S* E" a" d, J    len  = nPos-nStart;2 ~; h) f7 a* C% t1 V
   if(len >=60)
$ s" u& A  R9 P   {
) r; o" b* ?3 x0 r   return false;
5 R2 D, P. \; t1 i7 V( U/ V   }+ m% r' U& l' l6 w+ Y" n1 j1 ?# a% d
    memcpy(strLine, pBuff+nStart,len); //拷贝数据8 D% C# D8 z. E8 U, {
     strLine[len] = '\0';
3 ?  D3 M* @4 m8 d7 f' o5 ~//         printf("%s\n",strLine);3 g' R7 A3 m6 u7 \! A/ ~" Y$ o1 C% ?
    nRemain = len;% i! C: h1 f4 w" v- ?+ ?3 ]
    nStart = nSize;% N& i( w% k' n/ P, A
    return false;/ \  v+ h8 C3 w/ B% Q
}
: v# ?$ m$ ^. O) ]: c/ a. p9 ]# F 0 r: J9 k8 O% A3 C$ v; `, u
对数据校验
6 M# e. a' P1 l& [, l; s/ `2 D; h
5 [7 M/ |8 U1 `. _* g2 E, r* X$ C( BBOOL CheckHexFile(char *source,  UINT MaxDataSize ,char *hexLineBuffer)) C8 |, [# K! t3 e6 S* c
{ , l# p6 `4 F. J, O, Y' ^
char binBuffer[30];' g0 z$ E) K/ C/ T  n6 M+ b. U6 Y' x/ y
U16 lenTemp,loopTemp;8 {5 ~& W/ ~* q/ g3 B3 |3 C/ p
U16 checksum ;# S4 x% H5 J! [" ~( W
U32 bootAdd;
3 }9 ]8 A( b: u6 Q- Q" d6 y //static char hexLineBuffer[60];
6 U2 V7 G9 _$ {8 M$ ?1 x' h, H
. c  T6 R! X1 R6 s9 p% v; O" ] 2 g5 A! d7 G8 M7 e, T4 B/ @2 h
if(MaxDataSize == 0 || source == NULL)7 a" T  d* g+ f- k7 f* @, N
{       / v3 [: P1 [2 G
    return false; //无有效存储空间8 Q& Y6 u& T) R' @, f, r8 L
}
) j1 F& |- T" e9 [ReadLineInBuff(hexLineBuffer, source, MaxDataSize, true);//初始化/ y  d! b; k8 w; L
7 ?9 P, _3 i( r) A) \8 l
while(ReadLineInBuff(hexLineBuffer, source, MaxDataSize, false))
# r5 x2 _1 X% d, P5 @& Z{
% a* S6 Q- g- U: \! q0 _9 \lenTemp = strlen(hexLineBuffer);//printf("%x %d",hexLineBuffer[0],lenTemp);& w/ B% b0 ]8 s% B5 [! Z( t
  p+ C3 @  ^* r' Q
    if(hexLineBuffer[0] != ':' || lenTemp

SDBootLoder.rar

下载

6.16 MB, 下载次数: 5947

fatfs_移植.pdf

下载

421.36 KB, 下载次数: 873

FAT文件系统原理.pdf

下载

989.16 KB, 下载次数: 883

ff9a.zip

下载

836.94 KB, 下载次数: 732

winhex.zip

下载

1.72 MB, 下载次数: 1794

实验40 FATFS实验.rar

下载

1.09 MB, 下载次数: 2508

实验39 SD卡实验.rar

下载

337.4 KB, 下载次数: 875

实验48 串口IAP实验-战舰STM32开发板.zip

下载

1.75 MB, 下载次数: 1776

hex格式介绍及转bin格式的源程序.doc

下载

230 KB, 下载次数: 980

Hex文件格式.doc

下载

67.5 KB, 下载次数: 803

赞 5 收藏 54 评论173 发布时间:2014-4-1 22:49

举报

173个回答
xuhaoyu-326567 回答时间:2014-4-9 09:02:37

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

希望大家可以多交流呀
xuhaoyu-326567 回答时间:2014-4-9 09:03:07

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

全是自己的回帖呀呵呵
xuhaoyu-326567 回答时间:2014-4-9 08:57:51

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

还是没有人支持呀,好悲剧呀
xuhaoyu-326567 回答时间:2014-4-2 15:36:27

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

第一次发帖怎么没人捧场呢
xuhaoyu-326567 回答时间:2014-4-8 15:47:18

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

这个帖子没人回呀
xuhaoyu-326567 回答时间:2014-4-8 15:47:44

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

认真写了没人看好悲剧呀
xuhaoyu-326567 回答时间:2014-4-8 15:48:11

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

拿到只能自己顶自己了
xuhaoyu-326567 回答时间:2014-4-8 15:48:37

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

自己一个字一个字敲出来的呀
xuhaoyu-326567 回答时间:2014-4-8 15:49:02

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

希望大家踊跃的探讨呀
xuhaoyu-326567 回答时间:2014-4-9 09:03:55

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

一个字一个字敲出来的呀不容易
xuhaoyu-326567 回答时间:2014-4-9 09:04:17

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

可怜可怜我把呵呵
xuhaoyu-326567 回答时间:2014-4-15 14:29:42

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

还是没有呀悲剧了
mumu159 回答时间:2014-4-16 09:51:53

回复:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

 求指导啊
那片清茶 回答时间:2014-4-16 10:22:04

RE:【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)

楼主给力 的。。。

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版