【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)
来源:互联网 发布:vue vendor.js 包过大 编辑:程序博客网 时间:2024/04/30 21:36
【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)
带着这样的问题在网上搜索相关内容,首先搜索到的是战舰开发板串口升级程序,www.openedv.com/posts/list/11494.htm这是一篇非常好的文章。通过这个教程我们可以了解STM32的启动过程,以及调用中断函数的过程这里我就不多说了。但是实验下来发现这个是一个好的教程但不是一个好的方案。主要问题有三点
1、升级程序不能离开电脑(或者自己串口发送设备)‘;
2、要升级的程序是先通过串口写到RAM再写道ROM中的,这样就有很大的局限性。比如代码的大小不能大于RAM的大小等;
3、无校验功能,串口通讯存在一定的不可靠性可能会出现 错误的代码文件。
带着以上三个问题继续思考,要解决第一个问题首先需要一个程序的载体(存储器)。这个载体需要通用型强,携带方便这样SD卡和U盘就在我的考虑范围之内了。选哪一个呢我们看看他们的优缺点
1、首先不管是SD卡还是U盘都需要移值文件系统;
2、SD卡在接口方面是SPI驱动比较简单(无SPI口也可以通过IO口模拟实现);
3、U盘的接口为USBHOST接口(无法模拟)。
考虑到通用(部分单片机不带USB—OTG)和易用性最终选择了SD作为程序的载体升级程序。
第二个问题RAM大小的局限性,可以通过数据流的方式解决,简单说就是把数据分段搬到RAM中再写到ROM中。
第三个问题校验的问题,校验的问题想到两个方案
1、使用上位机程序处理BIN文件加上头尾以及校验码,这样感觉是一个新的文件格式了呵呵;
2、使用HEX文件直接烧写程序(HEX文件自带校验)。
考虑到简单易用选用了HEX的文件烧写解决校验的问题。
这样通过以上方案论证得出最终的方案为,使用SD卡作为文件的载体 ,数据分段写入ROM中采用带校验的HEX文件作为烧写的源文件进行IAP更新程序。
////////////////////////////以上为方案论证///////////////////////////////
//////////////////////////////////方案实现/////////////////////////////////////
SD卡的驱动以及文件系统的移植网上的资料比较多,大家可以搜一下。战舰的例程就是非常好的这里不多讲。本文要着重讲一下HEX文件,HEX文件无法直接写到ROM中要转为BIN可以。那么如何转换呢,这样我们首先就要学习HEX文件的编码格式。看一下KEIL的官方说明www.keil.com/support/docs/1584.htm在这个网页里面详细的说明了了HEX文件的编码格式。
[size=1.125em] [size=1.125em]简单说一下HEX文件格式:
一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.
:llaaaatt[dd...]cc
每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述.
:冒号是每一条Intel HEX记录的开始
ll是这条记录的长度域,他表示数据(dd)的字节数目.
aaaa是地址域,他表示数据的起始地址
tt这个域表示这条HEX记录的类型,他有可能是下面这几种类型
00 ----数据记录
01 ----文件结束记录
02 ----扩展段地址记录
04 ----扩展线性地址记录
05 ----启动地址记录行(只有MDK-ARM下才有)
dd是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看ll域的说明
cc是效验和域,表示记录的效验和,计算方法是将本条记录冒号开始的所有对字母所表示的十六进制数字都加起来然后模除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.
='0'&&l='a' && l='A' && l='0'&&h='a' && h='A' &&h = nSize)
{
return false;
}
for(nPos=nStart; nPos=60)
{
return false;
}
memcpy(strLine, pBuff+nStart, len);
strLine[len] = '\0';
nStart = nPos+2;
nRemain = 0;
return TRUE;
}
}
//最后一行没"\r\n"
len = nPos-nStart;
if(len >=60)
{
return false;
}
memcpy(strLine, pBuff+nStart,len); //拷贝数据
strLine[len] = '\0';
// printf("%s\n",strLine);
nRemain = len;
nStart = nSize;
return false;
}
对数据校验
BOOL CheckHexFile(char *source, UINT MaxDataSize ,char *hexLineBuffer)
{
char binBuffer[30];
U16 lenTemp,loopTemp;
U16 checksum ;
U32 bootAdd;
//static char hexLineBuffer[60];
if(MaxDataSize == 0 || source == NULL)
{
return false; //无有效存储空间
}
ReadLineInBuff(hexLineBuffer, source, MaxDataSize, true);//初始化
while(ReadLineInBuff(hexLineBuffer, source, MaxDataSize, false))
{
lenTemp = strlen(hexLineBuffer);//printf("%x %d",hexLineBuffer[0],lenTemp);
if(hexLineBuffer[0] != ':' || lenTemp
SDBootLoder.rar
6.16 MB, 下载次数: 961
fatfs_移植.pdf
421.36 KB, 下载次数: 245
FAT文件系统原理.pdf
989.16 KB, 下载次数: 270
ff9a.zip
836.94 KB, 下载次数: 195
winhex.zip
1.72 MB, 下载次数: 258
实验40 FATFS实验.rar
1.09 MB, 下载次数: 245
实验39 SD卡实验.rar
337.4 KB, 下载次数: 237
实验48 串口IAP实验-战舰STM32开发板.zip
1.75 MB, 下载次数: 267
hex格式介绍及转bin格式的源程序.doc
230 KB, 下载次数: 239
Hex文件格式.doc
67.5 KB, 下载次数: 204
0 0
- 【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)
- android sd卡读写 附源码
- MCU实战经验:多种的按键处理
- MCU实战经验:多种的按键处理
- MCU实战经验:多种的按键处理
- C#实现自动升级(附源码)
- C#实现自动升级(附源码)
- C#实现自动升级(附源码)
- Redis入门实战(附源码)
- Ehcache缓存入门实战(附源码)
- 微信小程序电影推荐demo实战开发小结(附源码及思维导图) ... ...
- STM32CubeMX的SDIO模式下对SD卡读写测试(附源码)
- STM32CubeMX基于SD卡的FATFS文件系统测试(附源码)
- SilverLight浏览器交互之:Html页面通过Javascript调用SilverLight程序内方法(附源码)
- 通过Google内置计步器和加速度传感器制作android计步程序(附源码)
- imx53通过SD卡升级EBOOT和NK
- 如何通过adb command 完成自动SD卡升级?
- 如何通过adb command 完成自动SD卡升级?
- myeclipse配置spring
- [转]Servlet的生命周期
- mysql死锁问题分析
- ps切图(1)——界面设置
- genymotion下载地址
- 【MCU实战经验】+ 通过SD卡升级HEX格式程序(附源码)
- Material.SetTextureOffset 设置纹理偏移
- JAVA包的概念
- 王健林:中国最大的机会在服务业,不是传统服务业
- ubuntu下c语言编程获取系统时间
- UDP广播实例理解
- 用前序和中序恢复二叉树
- SpringMVC+Mybatis框架开发
- linux通过端口号杀进程