基于IAP和Keil MDK的远程升级设计
- 格式:doc
- 大小:166.50 KB
- 文档页数:21
一种基于Mqtt协议的STM32的远程升级方法发布时间:2023-01-31T07:39:06.971Z 来源:《中国科技信息》2022年第18期作者:潘思宇,赵洪山,殷博闻,卫彪[导读] 针对嵌入式系统远程升级过程中暂停运行潘思宇,赵洪山,殷博闻,卫彪四创电子股份有限公司安徽省合肥市 230088摘要: 针对嵌入式系统远程升级过程中暂停运行、升级的安全性无法保障及升级失败等问题,设计了基于STM32F407ZG处理器的远程升级系统。
系统通过LAN8720A接收远程的系统升级代码,并将升级代码存储在内部 Flash 存储器; 升级代码接收结束后,设置系统升级标志位,并重新启动系统。
系统重启检测到升级标志位后,由系统代码升级程序将升级代码写入程序存储区后,跳转到升级后的应用程序运行。
该远程升级技术满足了升级过程中系统的实时性要求,提高了远程升级的可靠性。
关键词: 远程升级在应用编程升级程序引导加载程序实时性1 远程系统升级原理在微处理器中,程序存储器的编程方法通常有 3 种: 并行编程模式、通过串口或JTAG 等接口进行编程的在系统编程( in system programming,ISP) 模式,以及在应用程序控制下的在应用编程( in application programming,IAP) 模式。
并行编程是较早单片机的编程方式。
该模式通过专用的编程器对单片机进行程序的烧写,需要额外的编程器,且花费较多的开发时间,这种单片机已被淘汰。
ISP 编程模式由于其调试的方便性得到众多厂家的广泛支持。
IAP 是应用 Flash 程序存储器的一种编程模式。
IAP 模式是将 Flash 程序存储区化分为两个不同程序区域( 程序区域 1 和程序区域 2) 。
运行于程序区域 1 的应用程序为引导加载程序,即Bootloader 程序; 运行于程序区域 2 的应用程序为用户应用程序。
Bootloader 程序是一段引导程序,它驻留在处理器的程序存储器,当处理器上电或复位后在用户应用程序之前运行。
stm32远程升级(原创)
⼀:简介
stm32远程升级说⽩了讲就是两段程序写⼊两段内存中,内存分配可以分为IPA区 APP区升级存储区,具体怎么分配,要结合实际程序⼤⼩。
⼆:IPA区,APP区,升级存储区
IPA区:程序运⾏⾸先运⾏的就是这段程序,它主要实现的功能就是判断程序是否要升级。
1.升级:去读升级存储区(下载好了),然后写⼊APP区,最后跳转APP区。
2.不升级:直接跳转APP区运⾏APP程序。
APP区:
APP区实现的就是设备的功能了,这⾥只介绍有关升级的部分。
有升级需求后,我们需要把要升级的BIN⽂件上传到平台,然后通过平台下发到要升级的设备(可以多台设备),设备接收后,把程序存储到升级存储区,复位,程序从IPA开始运⾏,从⽽实现升级。
升级存储区:存储升级的bin程序,⼤⼩分配根据实际要升级的程序⼤⼩分配。
下⾯贴上我分配的内存
IPA区
APP区
程序升级区
⼆:操作流程及编程思路
1.上传需要升级程序的bin⽂件到平台
2.平台下发升级包,设备接收后,把程序存储到备份区
3.复位重启,程序会从IPA区开始运⾏,读取升级标志位,判断是否要升级
4.读取备份区程序,然后写到app区,全部写完,跳转到app区,升级完成。
STM32IAP+Ymodem功能实现(参考官⽅代码)IAP:在线升级代码,通俗的讲就是通过USART,IIC,或者SPI,USB等等,⽅式,在程序中升级程序,⼀般⽤在远程升级,或者是在PCB板⼦都安装到模具之后还需要升级代码,这样我们就需要,通过IAP的⽅式来升级。
软件代码托管码云地址:开发环境:MDK-V5,stm32cubeMx,SecureCRT8硬件平台:stm32f103系列最⼩系统板,带有swd仿真接⼝和串⼝11、从st的官⽅获取到IAP的⼯程,⼀路拉到最下⾯下不了怎么办,⾃⼰想办法,需要填姓名邮箱等等,完事,⼈家会给你的邮箱发⼀条邮件,⾥⾯是下载链接。
点开后多等⼀会,毕竟是国外的⽹站,别等不及,连着重复的去点那个按钮,没⽤的,如果还是下载不了,那就找我吧,我这⼉有下载好的,留⾔或者邮件我都会回你的。
2、下载完了,解压之后点开⾥⾯有三个⼯程分别是l073,l469,f10的,根据需求⾃⼰选合适的,f10X的点开直接编译就可以,但是l073,和l469的点开发现没有库⽂件,我的天啊,这怎么办啊,哈哈,没关系了,接着向下看吧,3、我们现在打开stm32cubeMx,根据⾃⼰的需求⽣成⼀个带串⼝和CRC的⼯程,没有CRC直接带串⼝就可以了,需要注意的⼏个地⽅,时钟配置,⼀定要根据⾃⼰实际的情况去配置时钟,串⼝的位数,如果使⽤了校验位,⼀定要在数据位多加1,8bit的数据位,1bit的校验位,⼀定要设置9bit的数据位,唉,到处都是坑,好了,可以导出⼯程了,导出来之后,测试⼀下串⼝功能是不是有效的,main函数⾥⾯⾃⼰写吧,实在不会,可以找我的。
嘿嘿,完事之后备份⼀份这个代码,⼀会app代码也在这个⾥⾯写。
4、好了,我们现在有⼀个属于⾃⼰的带有串⼝的⼯程了,接着打开之前从官⽅下载的⼯程,把⾥⾯的Inc和Src⽂件夹拷贝过来,拷贝到我们的⾃⼰⼯程的路径下⾯,本来有的⽂件选择跳过就可以,⼀定不要替换。
基于 STM32处理器的 WSN 节点固件在线系统升级方法蒋存波;焦阳【摘要】In order to meet the needs of function upgrade and system reconstruction of the node devices in WSN (wireless sensor network),we studied the Cortex-Mx core-based renewing and upgrading method for embedded system firmware IAP.It triggers the upgrade by using the way of command requests plus authentication,splits the code into 128 byte information block by utilising partition function and then composes them into ModBus packet with 138 bytes for transmission.It employs CRC for data checking,adopts response mechanism to achieve flow control,utilises Flash recognition function to distinguish different Flash types,and applies Flash writing function to meet the programming needs of internal and external Flash,different parameters of NorFlash and NandFlash.By testing with experiment,this scheme can realise the upgrade of WSN nodes firmware and the need of WSNs in dynamic system reconstruction.%为满足无线传感网中节点设备的功能升级和系统重构需要,研究基于 Cortex-Mx 核的嵌入式系统固件 IAP 更新升级方法。
单片机程序烧录的3种方式(ISP、ICP、IAP)是什么说起给单片机烧录程序,大家应该都不陌生吧,我最早接触单片机是从51单片机开始的,型号是STC89C52RC,当时烧录程序就是用的下面这种烧录软件——STC-ISP。
这种方式,通过串口连接单片机,选择一个合适的波特率就可以烧录了。
后来学习STM32,编程时使用KEIL软件自带的下载按钮就能下载程序,方便了不少,但需要额外使用J-Link等下载器。
再后来,接触到产品研发,给已经发布出的产品升级,都是要靠远程无线升级的(想想看,产品已经到客户那里了,当软件需要升级时,要是还使用有线的方式烧录程序,得有多麻烦)既然给单片机烧录程序的方式有多种,那烧录方式具体怎么分类呢?可以分为3种:ISP(In-System Programming)在系统编程,使用引导程序(Bootloader)加上外围UART/SPI等接口进行烧录。
ICP (In-circuit programmer)在电路编程,使用SWD/JTAG接口。
IAP(In-Application Programming)指MCU可以在系统中获取新代码并对自己重新编程,即用程序来改变程序。
这3种烧录方式的原理是什么呢?在分析原理之前,需要先了解一下单片机Flash的访问地址,看看程序是烧录到哪个位置了。
单片机Flash在地址映射表中位置下图是一张STM32F4xx的地址映射表,从0x0000 0000到0xFFFF FFFF,总计4Gbyte。
单片机的片上Flash、片上RAM、片上外设以及外部扩展接口的访问地址,都被映射到这4Gbyte的范围之内。
这张图中,我们需要先注意下半部分Main memory 主存储区通常,我们编写的代码,是放到主存储区的起始位置(0x0800 0000)开始运行的,烧录程序时,直接将程序烧录到这里即可(KEIL 软件给STM32烧录程序的默认烧写地址就是0x0800 0000开始)System memory系统存储区System memory(起始位置0x1FFF 000)是STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
一种基于IAP 技术的批量升级GD32 微控制器芯片程序的方法摘要:本文主要研究了基于IAP 技术的批量升级GD32 微控制器芯片程序的方法。
首先,介绍了IAP 技术的原理和特点。
然后,结合GD32 微控制器芯片的特点,提出了一种基于IAP 技术的批量升级芯片程序的方法。
该方法采用了串口通信的方式,通过PC 和芯片之间的数据传输,实现了芯片程序的快速升级。
最后,对该方法进行了实验验证,结果表明,该方法具有升级速度快、数据传输稳定可靠等特点。
关键词:IAP 技术、GD32 微控制器芯片、批量升级、串口通信、数据传输。
Abstract:This article mainly studies the method of batch upgrading GD32microcontroller chip program based on IAP technology. Firstly, the principle and characteristics of IAP technology are introduced. Then,combined with the characteristics of GD32 microcontroller chips, amethod of batch upgrading chip programs based on IAP technology isproposed. The method adopts serial communication, and through the data transmission between PC and chip, the rapid upgrade of chip program is realized. Finally, the experimental verification of the method was carried out. The results showed that the method had the characteristics of fast upgrade speed, stable and reliable data transmission, etc.Keywords: IAP technology, GD32 microcontroller chip, batchupgrade, serial communication, data transmission.引言:随着技术的不断发展,微控制器芯片在各个领域的应用越来越广泛。
基于IAP15F2K61S2单片机的在线仿真功能的实现文/杜洋有单片机初学者问了我这样一个问题:单片机真是个好东西,可以实现我的很多想法,就是在编程开发的时候太麻烦,每次改动都要重新编译、下载,再等待着问题的出现。
仅调试一个参数就要花上几个小时的时间。
对于我们这些没什么经验的编程菜鸟来说太麻烦了。
我想单片机技术发展至今,应该有更便捷的开发工具吧.杜老师你平时是怎么开发单片机软件的?有什么秘诀传授一下呗!我的回答是:当然有秘诀,那就是使用“仿真功能”。
什么是仿真?它如何实现更快捷的开发呢?详见下文。
【什么是仿真】什么是仿真?我们举一个汽车设计的例子来说明一下吧.大家一定在影视剧或电视广告中看过这样的镜头:在一个大大的厂房里,一辆崭新的小汽车正在以很高的速度撞向一面厚厚的水泥墙.坐在车上的两个人面不改色心不跳,一动不动地等待着死亡。
他们为何如此冷静,因为“他们"是实验用的假人。
说时迟那时快,汽车已经撞到了墙上,巨大的声响夹杂着飞溅的碎片充满了空间,汽车在撞击中破了相。
旁边的几台高速摄像机记录下了这一切。
这是一次真实的撞击实验,目的是为了得出这款车型在出现意外时,是否能保住人的小命。
安装在假人身上的传感器所得出的数据,能帮助工程师们发现安全隐患,改进汽车的设计。
可以说以上就是一次仿真,一辆真车和两个假人有计划地撞墙,模拟了真实车祸情况。
仿真让实验变得可能,因为没有一个真人愿意坐在车里参与这场实验。
当真实情况很难在开发时再现时,仿真就可以帮助开发者完成必要的实验。
这就如同单片机开发中,我们在自己的实验板上去开发一款产品一样。
当我们设计好了一个产品的功能,我们要在实验板上模拟用户的操作,看看操作是否正常,产品的反应速度和稳定性如何。
这些都是在仿真--模仿用户使用的真实情况。
有朋友会问了:如果这就是仿真,那还有什么好讲的呢?嗯,如上所说的仿真只是广义上的仿真,凡是在实验室里用实验板或工程样机模拟用户使用的过程,都可以算是仿真。
STM32学习:IAP简单的IAP例⼦章节概述:以⼀个最简单的例⼦⽰范IAP程序(没有⽂件通讯,没有跳转判断),需要借助IDE进⾏分区数据的划分以及下载。
准备IDE:keil-MDK 5MCU:STM32F103ZET6为例(Flash地址为0x08000000—0x0807ffff,共512KB)。
BSP:STM32-HAL启动⽅式:FLASH启动前32KB存放BootLoader程序(0x08000000 ~ 0x08007fff)剩余的空间存放APP程序(0x08008000 ~ 0x0807ffff)假定跳转的APP程序的实际物理地址为:0x08008000分别新建2个⼯程,名字可以为:bootLoader与app。
从Bootloader跳转到APPBootloader为了区分执⾏分区的不同,添加串⼝打印功能。
(略)例如:printf("Hello Bootloader\r\n");添加下⾯的代码以实现跳转功能:节选⾃CubeMX的例程:STM32Cube\Repository\xxx\Projects\Applications\IAP#define NVIC_VectTab_RAM ((u32)0x20000000)#define NVIC_VectTab_FLASH ((u32)0x08000000)#define PHYSICAL_ADDRESS_Flash (0x08000000) // 程序烧写的物理地址#define APPLICATION_POSADDR (0x0000C000) // APP 偏移量#define APPLICATION_ADDRESS ((PHYSICAL_ADDRESS_Flash) | (APPLICATION_POSADDR)) // 最终跳转的地址,实际上就是0x08008000typedef void (*pFunction)(void);pFunction JumpToApplication;uint32_t JumpAddress;void NVIC_SetVectorTable(uint32_t base, uint32_t offset){/* close interruption*/__set_FAULTMASK(1);/* set vector table*///NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0xffset);SCB->VTOR = base | offset;/* open interruption*/__set_FAULTMASK(0);}int main(void){// 在BootLoader程序的中断向量表指向设置中应有这么⼀句:NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0); //设置中断向量表指向/* Test if user code is programmed starting from address "APPLICATION_ADDRESS" */if (((*(__IO uint32_t*)APPLICATION_ADDRESS) & 0x2FFE0000 ) == 0x20000000) //①{/* Jump to user application */JumpAddress = *(__IO uint32_t*) (APPLICATION_ADDRESS + 4);// ②JumpToApplication = (pFunction) JumpAddress;//③/* Initialize user application's Stack Pointer */__set_MSP(*(__IO uint32_t*) APPLICATION_ADDRESS); // ④JumpToApplication(); // ⑤}while (1){}}解析:①因为⽤户程序开始位置(0x08008000处)的前4个字节存放的是堆栈的地址,堆栈地址必定是指向RAM空间的,⽽STM32的RAM空间起始地址为0x20000000,所以要进⾏判断。
keil的mdk5使用手册Keil的MDK5(Microcontroller Development Kit 5)是一款为嵌入式开发人员提供的强大工具,它集成了开发所需的各种组件,包括编译器、调试器、仿真器等。
使用MDK5,开发者可以更高效地进行嵌入式系统的设计和开发。
首先,要使用MDK5,您需要先安装它。
安装过程相对简单,只需要按照安装向导的指示进行即可。
安装完成后,您可以通过Keil软件来创建一个新的项目。
在创建项目时,您需要选择您的目标硬件平台和微控制器型号。
接下来,您需要配置您的项目。
在项目配置中,您可以设置编译器的各种选项,例如优化级别、代码生成方式等。
此外,您还可以配置调试和仿真选项,例如选择使用的调试器、仿真器等。
在编写代码方面,MDK5支持多种编程语言,包括C和C++。
您可以使用Keil的代码编辑器来编写和编辑代码。
在编写代码时,您可以使用MDK5提供的各种库和函数,例如标准C库、微控制器特有库等。
编译和调试是嵌入式开发中非常重要的环节。
使用MDK5,您可以轻松地进行编译和调试。
您可以使用Keil的编译器将您的代码编译成可在微控制器上运行的二进制文件。
然后,您可以使用Keil的调试器来调试您的程序。
调试器提供了各种有用的功能,例如设置断点、单步执行、查看变量值等。
除了基本的编译和调试功能外,MDK5还提供了其他有用的工具和功能。
例如,您可以使用仿真器来模拟微控制器的行为。
此外,MDK5还支持多种外部设备,例如串行通信接口、模数转换器等。
这些设备可以通过Keil的设备驱动程序进行配置和使用。
总的来说,MDK5是一款功能强大、易于使用的嵌入式开发工具。
通过使用MDK5,您可以更高效地进行嵌入式系统的设计和开发。
无论您是初学者还是经验丰富的开发者,MDK5都能为您提供全面的支持和帮助。
stciap升级原理
STC单片机的IAP(In-Application Programming)升级原理主要基于IAP功能,允许用户直接在应用程序中对程序进行编程。
STC对整个单片机的FLASH进行分区,以便进行IAP升级。
在IAP准备阶段,STC单片机在上电时检测是否有连续的‘d’字符。
如果检测到,则认为进入ISP(In-System Programming)准备阶段。
根据STC定义的协议,单片机接收数据帧,最后完成程序的擦除、写入。
如果在ISP准备阶段未收到数据帧,则超时退出ISP,执行用户代码区。
使用IAP功能实现程序的远程更新,需要两个程序:一个是boot程序,用来引导启动、接收数据、flash擦除与写入;另一个是app程序,即要运行的程序,也是要升级的程序。
请注意,IAP升级并不是所有芯片都支持,要看芯片是否支持IAP功能。
底层代码和上层应用程序都没有开源,为此宏晶科技推出了IAP系列单片机,即整颗MCU的Flash空间,用户均可在自己的程序中进行改写,从而使得有用户需要开发字节的ISP程序的想法得以实现。
以上内容仅供参考,建议查阅STC官方文档或咨询STC技术支持以获取最准确的信息。
STM32 IAP在线升级STM32很强大的一个功能是支持IAP在线升级,IAP(In-Application Programming),即在“应用程序中编程 ", 通俗的来将是程序自己可以往程序存储器里写数据或修改程序。
有了IAP功能,即使在产品发布之后也可以方便的通过预留的通信端口(如串口、USB、IIC 等)对产品中的程序固件进行更新升级,而无需通过传统的JTAG方式做烧录更新。
IAP功能的固件一般包含两个部分:Boot和 UserApp。
其中Boot部分必须通过JATG或ISP进行烧录,APP部分可以在烧录BOOT后通过IAP升级烧入或者与BOOT合并到一起后通过JATG或ISP进行烧录。
MCU上电后,首先运行BOOT,BOOT起来后,做如下操作:1.对APP部分做校验,如果校验失败,认为APP出现异常,自动切换到升级流程(流程3),反之,跳转到APP执行(流程4);2.检查升级标志,看是否需要升级,如果需要升级,进入升级流程(流程3),反之,跳转到APP执行(流程4);3.执行升级流程,升级完成后重置升级标志并软件复位;4.跳转到APP执行,APP在需要升级时,写入升级标志并软件复位。
需要注意的是:如果BOOT程序被破坏,产品就只能通过JATG或ISP进行烧录了,这一点是不能容忍的,解决的方法是我们可以对BOOT区域设置成写保护。
以禁止对BOOT区域进行编程或擦除操作。
在实现IAP之前,先了解一下STM32的存储器架构和启动过程:STM32的内部闪存地址起始于0x8000000,一般情况下,程序文件就从此地址开始写入。
此外STM32是基于Cortex-M3内核的微控制器,其内部通过一张“中断向量表”来响应中断,程序启动后,将首先从“中断向量表”取出复位中断向量执行复位中断程序完成启动。
而这张“中断向量表”的起始地址是0x8000004,当中断来临,STM32的内部硬件机制亦会自动将PC 指针定位到“中断向量表”处,并根据中断源取出对应的中断向量执行中断服务程序。
STM32串⼝IAP在线升级IAP即在线应⽤编程,平时我们写好的程序都是通过下载器去下载的,但是对于组装好的产品在想更新底层硬件代码是很⿇烦的事情,如果在公司情况还没那么糟糕,要是发出去的产品出现bug,你不可能要⽤户给你下载程序的。
IAP这种技术,我们就可以像软件⼀样,可以实现远程更新了。
我们需要做的就是,写单⽚机FLASH的读写接⼝,程序可以通过上位机进⾏下发,然后单⽚机程序调⽤FLASH写函数,把下发的代码写到对于FLASH进⾏覆盖,即实现更新。
当然这只是⼀个⼤概思路,具体实现还是要注意很多细节的东西。
⽹上也有好多关于这⽅⾯的教程,但是能⽤到项⽬中的却很少,我写这边⽂章就是想和⼤家分享我在实际项⽬中应⽤。
刚好项⽬中⽤到了在线升级功能,趁着还有设计思路,就以我实际开发过程来写吧,这⾥对新⼈来说也可以当作⼀篇教程来学习。
⼀、FLASH读写接⼝的实现这⾥⼤家可以参考原⼦哥的FLASH模拟EEPROM实验来写。
因为我们做的是程序更新,数据流很⼤,需要做⼀些优化,以加快写⼊速度。
⾸先我们来了解⼀下STM32F1的FLASH,如下图,我们要看的只有主存储区,可以看到单⽚机内部FLASH是按2K⼀页来区分的,⽽且对其读写是有如下⼏点要求:1. 每次写⼊必须为2个字节。
2. 写⼊地址为2的倍数。
3. 写⼊之前必须是被擦除的(即其值为0xFFFF),也可以理解为,写⼊数据只能把位写0,不能置1。
4. 写⼊速度≤24MHz。
5. 擦除⽅式:页擦除和整⽚擦除(这个要注意,如果你是做数据保存,就必须先把这⼀页的数据读取到缓存中,然后修改缓存⾥的值,再整页写⼊)。
FLASH写⼊过程如下:1. 解锁2. 读页数据到缓存3. 页擦除4. 修改缓存数据5. 把缓存数据页写⼊6. 上锁⾸先我们得有⼀些基本的读写函数,写函数官⽅库已经为我们提供,我们要写的就是读函数,代码如下://读1个字节{return *(vu8 *)Addr;}//读2个字节uint16_t FLASH_ReadHalfWord(uint32_t Addr){return *(vu16 *)Addr;}//读N个字节void FLASH_ReadNByte(uint32_t Addr,uint8_t *pBuff,uint32_t Len){uint32_t i;for(i = 0;i < Len;i++){pBuff[i] = FLASH_ReadByte(Addr);Addr += 1;}}然后就是在基本函数的基础上⾯扩展我们需要的函数,因为升级过程中,我们需要保存⼀些标志,需要⽤到读某⼀页的函数。
基于IAP和Keil MDK的远程升级设计写在前面:三个周之前,我突然想写一个远程升级的程序。
那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知。
我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题。
三个周之后,我用自己设计的方法实验了50多次,无一例升级失败。
三个周来,遇到了很多的不解、困惑,甚至是想放弃,但我现在想说的是:很多未知的困难会挡在我们面前,我们会感觉毫无头绪甚至觉得毫无出路忍不住要放弃,但多坚持一下,那些困难不但能烟消云散还能带给我们进步。
本设计是基于LPC2114和Keil MDK(V4.10),但所有支持IAP的处理器都可借鉴本方案,重要的是思想,而不是用什么。
0 引言在应用编程(IAP)技术为系统在线升级和远程升级提供了良好的解决方案,也为数据存储和现场固件的升级都带来了极大的灵活性。
通常可利用芯片的串行口接到计算机的RS232口、通过现有的Internet或、无线网络或者其他通信方式很方便地实现在线以及远程升级和维护。
本文以NXP的LPC2114 ARM微处理器为平台,以Keil MDK为开发工具,阐述IAP的原理、Flash的划分、分散加载机制、中断重映射以及在线升级的实现方案及其优化。
本方案使用多种校验技术,最大限度的保障传输数据的正确性;使用bootloader机制,即使因意外事件(断电,编程Flash失败等)造成升级失败后,程序也能返回到升级前的状态。
1 LPC2114的Flash规划1.1 扇区描述LPC2114共有128KB片内Flash,共分为16个扇区,分别为0扇区~15扇区,每个扇区为8KB存储空间。
其中第15扇区出厂时被固化为Boot Block区,控制复位后的初始化操作,并提供实现Flash 编程的方法。
所以用户可用的Flash空间只有120KB。
IAP程序固化于Boot Block中,IAP操作是以扇区为单位,并占用片内RAM的高32字节。
STM32实现IAP功能的学习笔记--转载STM32实现IAP功能的学习笔记最近因项⽬需求要实现STM32的在线升级即IAP功能,先将这⼏天的学习体会和IAP的具体实现总结出来,分享给⼤家,希望对同样实现IAP 的童鞋有所帮助,⽂中最后会上传名为STM32_Update.zip的压缩⽂件⾥⾯包含了STM32_App、STM32_MyBoot_V1.0和升级软件STM32_UpdateSoftware的源码⽂件供⼤家参考。
所有程序都经过测试,可以直接在原⼦哥的上跑,上位机的升级软件⼤家可以直接打开STM32_Update\STM32_UpdateSoftware\Release\STM32_UpdateSoftware.exe来升级,如果需要查看源码请⽤VS2010打开⼯程⽂件。
最终要实现的是:单⽚机每次上电会先运⾏Boot程序,检查标志位如果标志位为FLAG_TO_APP则直接跳转到App程序运⾏,如果标志位为FLAG_TO_BOOT,则运⾏Boot程序准备升级。
在运⾏App程序时,当接收到升级的指令后会在FLASH中的某处空间写下升级的标志位FLAG_TO_BOOT,并且加载Boot程序,Boot程序会接受新的程序⽂件并且存储在相应的FLASH空间⾥,完成升级后会在标志位的空间写下FLAG_TO_APP,并且运⾏新的程序。
帖⼦包含如下⼏个⽅⾯:1. 什么是IAP?2. STM32的启动模式?3. STM32的FLASH分布?4. STM32程序的运⾏过程?5. BootLoader程序的编写(如何实现程序的动态加载)?6. App程序的编写?7. bin⽂件的转换?8. 上位机串⼝升级软件的简介-------------------------------------------------------------------------------------------------1. 什么是IAP?IAP的知识⽹上的各种资料也说的⽐较明⽩,在此简单介绍⼀下。
今天调了一天的STM32 IAP程序,,改了很多地方,就是一直不对~~到网上查了很多人的版本,下载下载发现也都是不对,用IAP下载的程序一运行就出错。
真是极度绝望。
没办法,又去网上查,后来到21IC的网络上发现有个网友写错了测试的例程,我一看自己的也写错,难怪会一直错误,原来不是IAP程序的问题,是测试程序的自身问题,真是忽略了这一点,由于我直接那来就是原先的测试程序,单独下进去没问题,但是用IAP 方式时下载是需要设置中断向量的偏置给忘记了和KEIL的配置,就因为这个搞了我将近一天的时间。
真是血的教训,发出来跟网友分享下,让大家引以为鉴~~我的IAP程序把下载的程序设置的起始地点是:0x8003000,(根据IAP程序的大小而定,如果IAP大小为3320,则可以把起始点设置为0x8003400)所以对APP的程序需要更改如下:int main(void){SysClock_Init();delay_init(8); //延时初始化GPIO_Configuration(); //部分端口初始化配置Usart_Init(115200); //串口1初始化Adc_Init(); //ADC初始化TWI_Initialize(); //I2C引脚初始化Ds1302_Init();LCD_Init();//设置中断向量表的位置在0x8003000NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x3000);while(1){KEIL也需要配置如下:注意看IROM1的起始地址是:0x8003000上面的偏移量这个地址是要跟IAP程序里面的地址对应的;下面是IAP程序里面的定义common.h:另外我把ST官方的例程翻译了以下,看着英文不爽!!!谢了一个自己的测试例程代码~~ 大家需要的可以来下载,亲自测试过的,好用~~iu b关于使用IAP升级步骤,由上面的步骤,我们已经将底层程序写好。
一种微控制器的远程IAP功能实现方法摘要:针对在工业现场设备批量固件升级的需求,介绍了一种通过网络远程升级设备微控制器固件的方法。
阐述了各主要环节的实现原理。
并在GD32F4系列微控制器上实现了IAP升级功能。
关键词:固件升级; IAP ;微控制器;中图分类号: TP316.2 文献标识码:B一、引言微控制器(MCU)的固件升级一般有ICP(In Circuit Programing)、ISP(In System Programing)和IAP(In Application Programming)三种。
ICP是通过MCU的JTAG接口或者SWD接口进行程序烧录,一般需要使用兼容微控制器的仿真器和配套软件完成,一般只用在开发初期或MCU芯片内无引导代码场合。
ISP和IAP则需要MCU内部已经有引导代码,二者区别在于ISP需要使用串行编程接口等对片内FLASH上整个程序进行擦除写入,IAP则支持在程序运行时写入,需要自己根据需要开发引导程序,具有较大的灵活性,常规的接口均可以用于实现,易于使用和开发。
工业现场中同一规格的生产设备常常批量集中分布,布局位置和运行状态多种多样,但是一般都有一台或数台计算机通过局域网对设备运行状态进行监控和远程控制。
设备生命周期中不可避免的可能会对设备内部MCU中的固件进行替换以满足生产维护的需要或者适应新的生产需求。
IAP的特点非常适合这种场合。
本文介绍了一种通过局域网实现远程IAP功能的方法,测试平台为GD32F470系列MCU。
相比使用串口或CAN等接口,通过以太网进行固件烧录的方式速度更快,也更加便捷易用。
二、IAP功能实现的硬件平台GD32F470是国内厂商兆易创新生产的基于Cortex-M4内核构建的32位通用型MCU,主频高达240MHz。
含有一个以太网外设模块ENET,支持10/100Mbs传输速率,符合IEEE 802.3X的全双工流控通讯和半双工流控通讯。
嵌入式终端断点续传网络升级方案的实现摘要:本方案实现了一种以ST公司的STM32F103ZET为平台的嵌入式系统软件远程升级方案,此方案以IAP技术为主要基础,通过移动数据网络对MCU(指代STM32,下同)程序存储区进行实时更新,并支持断点续传,有效地保证了嵌入式终端能够快捷、安全、稳定地进行固件远程升级。
作为方案的技术支撑,本文还对STM32程序存储区的结构、BOOTLOADER的设计及从BOOTLOADER到用户程序的跳转过程等内容进行了详述。
关键词:嵌入式;STM32;远程升级;断点续传1.引言嵌入式终端因其灵活便利、性价比高、嵌入性强的特点,被广泛地应用在各个场所和行业,发挥着重要的作用。
如今随着物联网的兴起和迅速普及,作为其中不可或缺的一环,市场对嵌入式终端的要求也随之变得更加灵活和全面。
嵌入式终端实际应用过程中,无论是用户需求的变化,或是系统软件的修缮,均需要对终端固件进行升级。
而传统的升级方法,则是由工作人员到终端应用现场进行开箱或拆机,将终端通过UART、J-Link、USB等方式连接电脑后进行固件烧写。
但由于嵌入式终端安装环境存在复杂多样的特点,这种升级方法不但人力成本和物力成本高,效率低下,并且在某些应用环境下(如高空、有毒、辐射等)进行人工升级还会对工作人员的人身安全产生威胁。
通过移动数据网络(以下称为GPRS)对嵌入式终端固件进行远程无线升级,则不存在上述问题。
GPRS具有无需布线、实时在线、流量计费、成本低廉的特点,采用GPRS进行通信的的嵌入式终端,不仅能够缩减安装工作量,还大幅度降低了终端的维护成本,只要终端安装地点在GPRS基站的覆盖范围内,即具备远程升级固件的客观条件。
本文将以ST公司的STM32F1xx系列为平台,介绍以IAP技术为主要基础的嵌入式终端无线升级方案的实现。
本方案还针对偏远区域无线网络稳定性差、误码率高的问题,设计了严密的数据校验和可靠的断点续传机制,从而保证固件数据包能够完整无误地被终端接收,进而安全地进行IAP升级,保障终端的正常运行。
邮局订阅号:82-946360元/年技术创新单片机开发与应用《变频器与软启动器应用200例》您的论文得到两院院士关注KEILC51单片机仿真器的设计ImplementationofKeilC51MCUEmulatorbasedonSST89C54/58(陕西科技大学)陈晓莉张俊涛Chen,XiaoliZhang,Juntao摘要:SST89C54/58是美国SST公司推出的具有20KB/36KBFlash程序存储器的FlashFlex51系列单片机,通过对Flash的分区实现IAP的功能。
本文介绍SST89C54/58程序存储器的结构特点以及基于SST89C54/58的KEILC51单片机仿真器的设计。
关键词:单片机;存储;仿真器;设计中图分类号:TP368.1文献标识码:AAbstract:SST89C54/58isFlashFlex51familymicrocontrollerwith20KB/36KBFlashEEPROMbySiliconStorageTechnology,IAPisimplementedbasedonitsFLASHpartition.MainfeaturesofprogrammemoryorganizationofSST89C54/58arepresentedandoneofitsapplicationsasKeilC51emulatorisintroduced.Keywords:Microcontroller,Memory,Emulator,Design文章编号:1008-0570(2006)02-2-0019-021概述SST89C54/58(简称89C54/58)是美国SST(SiliconStorageTechnology)公司推出的多用途FlashFlex51系列单片机,片内集成了20KB/36KB的SuperFlashEEPROM程序存储器,分为BLOCK0(16KB/32KB)和BLOCK1(4KB)两块。
MSP430学习MSP430系列咩有自带IAP功能的特点,必须自行编写IAP程序来进行片内Flash的烧写,才能达到省级的目的。
系统构思:需要升级的二进制文件下载到相应的地址空间,然后让单片机系统自动执行IAP 升级。
MSP430F149是在片内flash中运行。
1.下载升级文件到相应的外扩flash中。
2.从片外flash中编写到片内flash中(从0x1100开始至0xffff)3.编写引导程序,讲程序拷贝到相应的RAM空间(0x0200)中,并将PC指向0x200。
用户指南:如何使用这些寄存器。
数据手册:看电气特性,引脚等等xcl文件。
该文件在安装目录的IAR Systems\Embedded Workbench 5.4 Evaluation\430\config中。
CTRL+K 快注释,屏蔽选中的代码;CTRL+SHIFT+K 取消快注释,取消屏蔽选中的代码;CTRL+SHITF+F 全局搜索,有可能是因为搜狗输入法占用了快捷键而不行!生成下载文本147与149空间对比4系列的可以直接驱动段氏的液晶,1系不可以。
硬件结构MSP:mix signal processor混合信号处理器。
MSP430F149:F表示储存器是flash,14代表ADC是12位,9代表储存容量60kDSP 或者ARM成本比较高,单片机也有自己的生存空间。
MSP430可以进行片内flash自编程。
三个时钟单元MCLK/ACK/SMCLK内部集成Hardware Multiplier硬件乘法器,运算会更快,51单片机则没有!所以做一次运算会花很多个时钟周期!四种低功耗模式!降低时钟,LPM0:active模式下,哪些模块需要打开,可以由用户确定!LPM1:MCLK(主系统时钟)关掉,CPU则停止工作,ACLK(辅助系统时钟)和SMCLK(子系统四中模式消耗的电流设置CPUOFF/SCG0/SCG1---进入不同的低功耗级别。
写在前面:三个周之前,我突然想写一个远程升级的程序。
那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知。
我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题。
三个周之后,我用自己设计的方法实验了50多次,无一例升级失败。
三个周来,遇到了很多的不解、困惑,甚至是想放弃,但我现在想说的是:很多未知的困难会挡在我们面前,我们会感觉毫无头绪甚至觉得毫无出路忍不住要放弃,但多坚持一下,那些困难不但能烟消云散还能带给我们进步。
本设计是基于LPC2114和Keil MDK(V4.10),但所有支持IAP的处理器都可借鉴本方案,重要的是思想,而不是用什么。
0 引言在应用编程(IAP)技术为系统在线升级和远程升级提供了良好的解决方案,也为数据存储和现场固件的升级都带来了极大的灵活性。
通常可利用芯片的串行口接到计算机的RS232口、通过现有的Internet 或、无线网络或者其他通信方式很方便地实现在线以及远程升级和维护。
本文以NXP的LPC2114 ARM微处理器为平台,以Keil MDK为开发工具,阐述IAP的原理、Flash 的划分、分散加载机制、中断重映射以及在线升级的实现方案及其优化。
本方案使用多种校验技术,最大限度的保障传输数据的正确性;使用bootloader机制,即使因意外事件(断电,编程Flash失败等)造成升级失败后,程序也能返回到升级前的状态。
1 LPC2114的Flash规划1.1 扇区描述LPC2114共有128KB片内Flash,共分为16个扇区,分别为0扇区~15扇区,每个扇区为8KB存储空间。
其中第15扇区出厂时被固化为Boot Block区,控制复位后的初始化操作,并提供实现Flash 编程的方法。
所以用户可用的Flash空间只有120KB。
IAP程序固化于Boot Block中,IAP操作是以扇区为单位,并占用片内RAM的高32字节。
下表列出LPC2114器件所包含的扇区数和存储器地址.表1.1 LPC2114 Flash 器件中的扇区2.3 IAP 编程函数接口IAP 功能可用下面的C 代码来调用。
定义 IAP 程序的入口地址。
由于IAP 地址的第0 位是1,因此,当程序计数器转移到该地址时会引起T humb 指令集的变化。
#define IAP_LOCATION 0x7ffffff1定义数据结构或指针,将IAP 命令表和结果表传递给IAP 函数unsigned long command[5];unsigned long result[2];定义函数类型指针,函数包含2 个参数,无返回值。
注意:IAP 将函数结果和R1 中的表格基址一同返回。
typedef void (*IAP) (unsigned int [ ] , unsigned int [ ]);IAP iap_entry;设置函数指针iap_entry=(IAP) IAP_LOCATION;使用下面的语句来调用IAP。
iap_entry (command , result);Flash 存储器在写或擦除操作过程中不可被访问。
执行Flash 写/擦除操作的IAP 命令使用片内RAM 顶端的32 个字节空间。
如果应用程序中允许IAP 编程,那么用户程序不应使用该空间。
3 LPC2114升级实现过程由于在升级程序软件设计中,分散加载机制、中断向量的重映射、软中断等的实现还与所使用的编译器紧密相关,因此,本文结合Keil MDK(V4.10)编译工具,来详细阐述升级程序的实现过程。
3.1 总体思路分站上电后,首先运行位于Flash 0x000~0x3FF中的跳转程序。
跳转程序会读取位于14扇区的当前程序运行标志,如果该扇区的最低四个字节为0x00010000,表示当前程序运行在高区,跳转程序会跳转到Flash的0x00010000处执行用户程序;如果该标志区的最低四个字节为0x00008000,表示当前程序运行在低区,跳转程序会跳转到Flash的0x00002000处执行用户程序。
用户程序正常执行后,会按照设计进行正常的程序采集、数据处理传送。
当接收到升级命令后,用户程序会跳转到Flash 的0x00000400处的Bootloader处进行升级的一些操作。
当升级成功后,Bootloader程序更新当前程序运行区标志,程序跳转到新程序处运行,如果升级不成功,返回升级前的程序。
流程图如下所示:跳转程序是分站上电后最先运行的程序,根据当前程序运行区标志,跳转到相应的用户程序区执行。
本段程序占用Flash的最低1K字节空间,与Bootloader同在第0扇区。
跳转程序的启动代码仅初始化堆栈,不使用PLL和存储加速功能。
代码1描述了跳转程序的主要启动代码。
当跳转程序确定要跳转到高区用户程序或者低区用户程序后,使用函数指针跳转到0x00010000处(高区用户函数入口地址)或0x00002000处(低区用户函数入口地址)。
定义函数指针:void (*UserProgram)() ;指定入口地址:UserProgram = (void (*)()) (0x00010000);UserProgram = (void (*)()) (0x00002000);实现跳转:(*UserProgram)() ;要将用户代码精确定位到Flash的0x00010000处(高区用户函数入口地址)或0x00002000处(低区用户函数入口地址),需要使用编译器的分散加载机制,将在Bootloader中详细描述实现过程。
另外,跳转程序还在烧录代码的同时初始化当前程序运行区标志,即对Flash的0x0001C000地址处写入0x00008000,表示当前用户程序在低区。
主要使用了编译器的__at关键字:精确定位变量。
需要注意的是,使用该关键字必须包含头文件absacc.h。
const uint32 x __at(0x0001C000)=0x00008000; //初始化用户程序标志区,默认运行低区3.3 升级程序Bootloader的设计升级程序的好坏,在很大程度上取决于Bootloader设计的好坏。
一个优秀的IAP升级Bootloader,必须做好升级中出现故障等异常的处理。
保证系统不会崩溃,即使升级失败,也能返回升级前的程序。
Ø有升级指令,进行初始化工作(串口、定时器、看门狗)Ø接收升级数据包,检测帧头、长度、帧号、数据区校验,最大程度的保证升级数据的完整性、正确性。
Ø实时检测接收状态,10 S内没有接收到数据或接收到的数据包都是错的,则退出升级,返回原程序。
Ø接收的数据按照512字节一组写入Flash,写入后再读出与原数据进行对比校验,校验成功后,本次编程Flash成功。
允许连续3次编程Flash,三次都不成功,退出升级程序,执行原程序。
Ø升级成功后,更新当前程序运行区标志,跳转到新程序,同时原程序保存。
本设计的Bootload位于Flash的0x400开始的扇区0存储区内,使用分散加载机制,将程序的入口地址定位到0x00000400处。
当用户程序接收到升级指令后,就会使用函数指针跳转到这个入口处。
3.3.1 使用IAP图3-1 描述了使用IAP编程Flash所必须的步骤。
3.3.1.2 选择扇区在任何擦除和编程Flash之前,必须选中扇区,可以选中一个或多个。
3.3.1.3 擦除扇区在编程Flash前必须执行擦除操作,如果某个扇区已经擦除,就不需要再次擦除。
可以一次擦除一个或多个扇区。
3.3.1.4 编程扇区通过这个过程,数据可以从RAM中编程到片内Flash中。
注:1. 数据只能从片内SRAM编程到片内Flash。
2. 片内Flash的地址必须512字节对齐。
3. 片内RAM应位于局部总线,即USB或以太网的SRAM不可以使用。
4. 每一次编程字节应该是512、1024、4096、8192中的一个。
3.3.1.5 比较数据通过这个函数,可以检查写入Flash中的数据和RAM中的是否相同。
注意源地址、目标地址和字节数必须是4的倍数。
可使用Keil MDK提供的关键字__align(n) 来指定n字节对齐。
3.3.2 IAP编程期间的中断管理LPC2114片上Flash在擦除/编程期间绝不可被中断打断。
但Bootloader中定时和串口接收又使用了中断,因此必须在擦除/编程之前禁止总中断,待操作完成后再使能总中断。
Bootloader运行在用户模式下,不具有禁止/使能中断的权力,所以在本设计中使用软中断禁止/使能总中断。
Keil MDK提供了关键字__svc来触发软中断。
软中断函数声明:__svc(0x00) void EnableIrq(void); //使能中断,软中断0__svc(0x01) void DisableIrq(void); //禁止中断,软中断1软中断函数代码:更改启动代码,挂接软中断入口:在程序中,如果想禁止中断,只需使用DisableIrq();若是能中断,只需使用EnableIrq()。
3.3.3 使用分散加载机制精确定位入口地址应用程序接收到升级指令后,会跳转到0x00000400处执行Bootloader升级程序。
因此Bootloader 程序的入口地址必须精确定位到0x00000400处。
这可以使用Keil MDK提供的分散加载机制来完成。
分散加载代码见代码3-8.这段代码显示出Bootloader程序从0x00000400处开始执行,最多占用0x1C00字节的Flash空间。
另外,该程序的RAM从0x40000040开始,长度为0x3FA0个字节。
这样RAM的低64字节保留给中断向量映射使用,高32字节保留给IAP编程使用。
3.3.4 中断向量的重映射Bootloader的起始地址位于0x00000400,中断向量也从这一地址开始存储。
但默认情况下ARM发生异常时,会跳转到0x00000000处的64字节中断向量区域执行相应操作,所以为了使Bootloader 能相应中断,必须将位于0x00000400开始的64字节中断向量表重映射到RAM的低区。
LPC2114使用向寄存器MEMMAP写入0x02来完成这一过程。
代码3-9 描述了中断向量重映射的过程。
4 通讯协议与上位机软件4.1 Intel的hex格式Intel hex文件是记录文本行的ASCII文本文件,在Intel HEX文件中,每一行是一个HEX记录,由十六进制数组成的机器码或者数据常量。
一个数据记录以一个回车和一个换行结束。
一个Intel HEX文件可以包含任意多的十六进制记录,每条记录有五个域,下面是一个记录的格式.: LL AAAA TT [DD...] CC每一组字母是独立的一域,每一个字母是一个十六进制数字,每一域至少由两个十六进制数字组成,下面是字节的描述.:冒号是每一条Intel HEX记录的开始LL 是这条记录的长度域,他表示数据(dd)的字节数目.AAAA 是地址域,他表示数据的起始地址TT 这个域表示这条HEX记录的类型,他有可能是下面这几种类型00 ----数据记录01 ----文件结束记录02 ----扩展段地址记录04 ----扩展线性地址记录DD 是数据域,表示一个字节的数据,一个记录可能有多个数据字节,字节数目可以查看LL域的说明。