stm32 IAP + APP ==>双剑合一

发布者:脑力风潮最新更新时间:2016-12-28 来源: eefocus关键字:stm32  IAP  APP 手机看文章 扫描二维码
随时随地手机看文章

(扩展-IAP主要用于产品出厂后应用程序的更新作用,上一篇博文详细的对IAP 升级程序做了详细的分析http://blog.csdn.net/yx_l128125/article/details/12992773,考虑到出厂时要先烧写IAP  再烧写APP应用程序要烧写2次增加工人劳动力基础上写了“STM32 IAP+APP ==>双剑合一”链接稍后发,希望通过IAP程序的hex 文件 和 APP的hex文件 合成一个hex  或者把合成的hex文件转成.bin 文件 减少“体力”)


一、简单框架介绍

(简单回顾上篇博文《IAP在线 升级详解》http://blog.csdn.net/yx_l128125/article/details/12992773的几个重要知识点:

1、stm32内部flash起始地址:0x0800 0000 -- 0x0802 0000 ,其中 从 0x0800 0000开始位置存放IAP 升级程序,  从0x 0800 3000开始的位置存放APP应用程序[ 而APP中的中断向量表放在0x0800 3000地方,更重要的是中断向量表的第1项存放的是栈顶地址,第二项放的是”复位中断“ ]

  

二、IAP +APP 结合的方法

 IAP 和APP 的hex 文件合成1个hex 文件的方法有2种:

(1)  "简单1+1"    

(2) IAP 先烧写进flash 的 0x0800 0000 开始位置,  APP烧写到 flash  的0x 0800 3000开始的地方; 之后通过我上一篇博文的 IAP程序的文件读出功能读取flash 上的数据读到一个.bin文件上;


我们先来详细分析“方法一”的操作:

1.我们设置编译IAP程序的编译器(如图),这个设置意思是把IAP程序下载到flash 的 0x0800 0000开头的位置,然后编译程序


2.编译完程序后,在工程目录的output文件夹中找到编译后生产的.hex文件;

用 notepad++  或者 UltraEdit 打开  IAP 的.hex文件   和APP 的.hex 文件 ,  (顺便问一下.hex文件格式你会看吗?)

hex文件格式:

(1)以行为单位,每行以冒号开头,内容全部为16进制码(以ASCII码形式显示)

(2)在HEX文件里面,每一行代表一个记录。记录的基本格式为:


冒号本行数据长度本行数据起始地址数据类型数据校验码

1 byte2 bytes1 byten byte1 byte














第一个字节 表示本行数据的长度;

第二、三字节表示本行数据的起始地址;

第四字节表示数据类型,数据类型有:0x00、0x01、0x02、0x03、0x04、0x05。

'00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录

'01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾

'02' Extended Segment Address Record:用来标识扩展段地址的记录

'03' Start Segment Address Record:开始段地址记录

'04' Extended Linear Address Record:用来标识扩展线性地址的记录

'05' Start Linear Address Record:开始线性地址记录

然后是数据,最后一个字节 为校验和。

校验和的算法为:计算校验和前所有16进制码的累加和(不计进位),检验和 = 0x100 - 累加和

打开.hex内容如下:(中间部分数据略去)


  1. :020000040800F2  

  2. :10000000B80B00207D250008850300088703000841  

  3. :100010009B0300089F030008A303000800000000E2  

  4. :10002000000000000000000000000000A70300081E  

  5. :10003000A903000800000000AB030008AD0300089E  

  6. 。  

  7. 。  

  8. 。  

  9. :102B40000400000000000000000000000000000081  

  10. :102B50000000000000000000000000000000000075  

  11. :102B6000010203040102030406070809020406081F  

  12. :102B700000366E01000000000000000001020304A6  

  13. :042B80000607080933  

  14. :0400000508000121CD  

  15. :00000001FF  


先分析第一条语句---- “:02 0000  04 0800  F2”



冒号本行数据长度本行数据起始地址(偏移地址)数据类型数据校验码

1 byte2 bytes1 byten byte1 byte


  1.   



  1.   




020000040800F2

在上面的数据类型后2种记录(04,05)都是用来提供地址信息的。每次碰到这2个记录的时候,都可以根据记录计算出一个“基”地址。对于后面的数据记录,计算地址的时候,都是以这些“基”地址为基础的。以我们的语句为例:


第1条记录的长度为02,LOAD OFFSET为0000,RECTYPE为04,说明该记录为扩展段地址记录。数据为0008,校验和为F2。从这个记录的长度和数据,我们可以计算出一个基地址,这个地址为(0x0800 << 16) = 0x0800 0000 ,后面的数据记录都以这个地址为基地址。

第二条语句----“ :10000000B80B00207D250008850300088703000841”

冒号本行数据长度本行数据起始地址(偏移地址)数据类型数据校验码

1 byte2 bytes1 byten byte1 byte


  1.   


  1.   





:10000000B80B00207D250008850300088703000841

第2条记录的长度为10(0x10=16字节),LOAD OFFSET为0000,RECTYPE为00('00' Data Rrecord:用来记录数据,HEX文件的大部分记录都是数据记录),数据为B80B00207D2500088503000887030008  校验码为41;此时基地址为:0x0800 0000  加上偏移地址:0x0000   这条记录的16个字节的数据的起始地址为:0x0800000 + 0x0000 =0x0800 0000


第3条语句----“:0400000508000121CD”

冒号本行数据长度本行数据起始地址(偏移地址)数据类型数据校验码

1 byte2 bytes1 byten byte1 byte


  1.   


  1.   





:0400000508000121CD

记录的长度为04,LOAD OFFSET为0000,RECTYPE为05 ,此时,EIP寄存器里存放的地址:0x0800 0121; 即IP指向下一个要执行的指令所在地址,我们来看一下IAP工程list目录下的.map文件,其中第393行处如图:(看到没?0x0800 0121值main函数的入口地址)害羞


EIP是32位机的指令寄存器, IP是指令寄存器,存放当前指令的下一条指令的地址。CPU该执行哪条指令就是通过IP来指示的

上图参考hex数据文档:http://pages.interlog.com/~speff/usefulinfo/Hexfrmt.pdf 或 http://microsym.com/editor/assets/intelhex.pdf

第4条语句---“:00000001FF”  (每一个.hex文件的最后一行都是固定为这个内容)

冒号本行数据长度本行数据起始地址(偏移地址)数据类型数据校验码

1 byte2 bytes1 byten byte1 byte


  1.   






:00000001
FF

 (每一个.hex文件的最后一行都是固定为这个内容)
记录的长度为00,LOAD OFFSET为0000,RECTYPE为01  (01' End of File Record:用来标识文件结束,放在文件的最后,标识HEX文件的结尾)


三、iap 和app  的.hex 文件结合

操作1:设置编译IAP程序的编译器(如图),这个设置意思是把IAP程序下载到flash 的 0x0800 0000开头的位置,然后编译程序,生产.hex文件;


操作2:设置编译APP程序的编译器(如图),这个设置意思是把APP程序下载到flash 的 0x0800 3000开头的位置,然后编译程序,生产.hex文件;



操作3:用 notepad++  或者 UltraEdit 打开  IAP 的.hex文件   和APP 的.hex 文件

把IAP的.hex 最后一句结束语句去掉(即:删除:00000001FF)

把APP的.hex 全部内容拷贝复制到 刚才删掉结束语句的 IAP的.hex后面(如图)

原来第701行为 :00000001FF 的结束语句


操作4:把两个.hex合成的.hex文件重新命名,烧写到0x0800 0000 开始位置的地址即可;

这里把 合成的.hex文件上传到我的资源:http://download.csdn.net/detail/yx_l128125/6475171(必须把PB1管脚拉低,串口1连接超级终端才能看到升级程序的引导信息):


关键字:stm32  IAP  APP 引用地址:stm32 IAP + APP ==>双剑合一

上一篇:STM32 DMA 应用之(二) DMA 串口 数据传输--发送
下一篇:STM32的优先级NVIC_PriorityGroupConfig的理解及其使用

推荐阅读最新更新时间:2024-03-16 15:27

STM32之I2C模块调试总结
前一段时间对STM32的I2C模块进行了调试,今天做一个总结。关于I2C协议的知识,这里就不再赘述,网上有很多介绍I2C协议的文章。目前实现I2C协议的方式有两种,一是采用GPIO口来模拟I2C协议,另外一种是使用STM32自带的I2C模块。虽说使用GPIO口模拟I2C协议较为复杂,需要详细了解I2C协议的内容,但是实现这种方式的资料也非常多,网上都有对应的源码实现,只需要简单修改,就可以实现功能。而针对使用STM32自带的I2C模块,网络上贬斥的声音较多,说是模块本身自带bug,容易出问题,甚至还有人说是史上最难调的I2C模块。当然了,这些问题我自己目前还没有遇到,可能需要以后来验证了。好了,言归正传,今天主要记录一下调试过程以
[单片机]
<font color='red'>STM32</font>之I2C模块调试总结
基于STM32的手机蓝牙温度视频监控小车设计
设计说明 本设计采用手机的蓝牙作为遥控器控制小车的行驶,同时将小车所在环境的温度和周围环境通过2.4g无线传输到电脑终端,实时监控。 本设计是基于stm32微控制器实现的蓝牙控制视频采集小车。 本设计用到的有蓝牙模块,l298n模块,无线音视频采集模块,摄像头模块, 无线音视频接收模块。DS18b20温度采集模块。stm32程序裸奔没有嵌入ucosii实现的。 设计功能 只要通过手机上的APP发送一定的字码,就可控制小车的前后左右停止,温度上报,摄像开关空控制。 再通过电脑终端显示小车所在位置的前端环境,通过控制转动来查看四周环境,视频距离10m内,蓝牙距离40米。空旷处。 采集环境温度等参数控制器采用arm芯片s
[单片机]
基于<font color='red'>STM32</font>的手机蓝牙温度视频监控小车设计
STM32单片机TFTLCD显示实验:TFTLCD简介
STM32单片机TFTLCD显示实验学习笔记 1、TFTLCD模块接口图 以2.8寸的TFTLCD为例,采用16位的并方式与外界进行连接,模块接口图如下所示: 具有如下一些信号线: CS:TFTLCD片选信号 WR:向TFTLCD写入数据 RD:从TFTLCD读取数据 D :16位双向数据线 RST:硬复位TFTLCD,直接连接到stm32的复位引脚上 RS:命令/数据标志(0,读写命令;1,读写数据) 2、ILI9341控制器 ILI9341控制器是TFTLCD的驱动芯片,在16位的模式下,ILI9341采用RGB565格式储存颜色数据,下面为16位数据与显存的对应关系,最低5位代表蓝色,中间六位代表绿色,最高5位代
[单片机]
<font color='red'>STM32</font>单片机TFTLCD显示实验:TFTLCD简介
stm32输出pwm波使无刷电机转起来
现阶段使用stm32,基本处于模仿阶段,用野火的教程以及程序,修改一些IO口,然后烧到自己的开发板上,实现一些功能。 第二个实验室了解pwm波这个东西,脉宽调制,调节占空比可以改变电机转速,原理可以看刘洋老师的基础视频,讲的很详细。 修改野火的pwm程序,野火用了四个通道,我只用了TIM4的第一通道,程序如下: #include pwm_output.h void pwm_value(void) { TIM4- CCR1=1300; } /* * 函数名:TIM3_GPIO_Config * 描述 :配置TIM3复用输出PWM时用到的I/O * 输入 :无 * 输出 :无 * 调用 :内部调用 */ static v
[单片机]
基于STM32+RFID设计的宿舍检修管理系统
1. 需求 需求: 一个寝室一个标签,设备端扫描标签,通过显示屏键入维修成功与否之类的的信息提交到平台 系统构架: 一个设备端 + 一个上位机 硬件选型: (1)STM32F103RCT6作为设备端的主控MCU (2)RC522作为设备端的射频刷卡设备,读写IC卡 (3)多张IC卡,模拟代表每个宿舍 实现思路: 设计一个上位机,用来管理查看维修检修信息,当维修寝室的设备或者检修完成时,通过STM32上的RC522刷一下这个寝室的IC卡,识别这是哪个寝室,识别成功后在软件上弹出一个对话框,填写本次维修或者检修的事件,填写完毕点击提交即可。 软件分为两个功能: (1)注册功能:每个寝室都有一张IC卡,这张卡第一次使用需
[单片机]
基于STM32+RFID设计的宿舍检修管理系统
使用STM32、SFPGA和I.MX6ULL IO点亮LED灯
摘要:你点亮过多少板子的LED灯呢?有很多小伙伴要求讲一下STM32、FPGA、Liunx他们之间有什么不同。不同点很多,口说无凭,今天就来点亮一下STM32、FPGA和Liunx板子的LED灯,大家大致看一下点灯流程和点灯环境以及点灯流程,就能大概的了解一下三者的区别,可以有选择的去学习! 一、使用STM32点亮LED灯 STM32从字面上来理解ST是意法半导体,M是Microelectronics的缩写,32 表示32位,合起来理解,STM32就是指ST公司开发的32位微控制器。在如今的32 位控制器当中,STM32可以说是最璀璨的新星,它受宠若娇,大受工程师和市场的青睐,无芯能出其右。首先使用STM32电亮一个led灯,
[单片机]
使用<font color='red'>STM32</font>、SFPGA和I.MX6ULL IO点亮LED灯
正点原子STM32学习笔记——MPU6050介绍
一、MPU6050简介 1.什么是MPU6050? MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器(DMP: Digital Motion Processor)硬件加速引擎,通过主IIC接口,可以向应用端输出完整的9轴姿态融合演算数据。 有了DMP,我们可以使用InvenSense公司提供的运动处理资料库,非常方便的实现姿态解算,降低了运动处理运算对操作系统的负荷,同时大大降低了开发难度 。 2.MUP6050特点。 MPU6050 的特点包括: ① 以数字形式输出
[单片机]
正点原子<font color='red'>STM32</font>学习笔记——MPU6050介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved