STM32 ISP 远程升级
一种基于Mqtt协议的STM32的远程升级方法
一种基于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远程升级(原创)
⼀:简介
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区,升级完成。
基于 STM32处理器的 WSN 节点固件在线系统升级方法
基于 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)是什么
单片机程序烧录的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,出厂后无法修改。
详解STM32 ISP设置及使用说明
详解STM32 ISP设置及使用说明(原创)1. STM32的BOOT概述STM32三种启动模式对应的存储介质均是芯片内置的,它们是:用户闪存:BOOT1=x BOOT0=0芯片内置的Flash,即主存储器FlashSRAM:BOOT1=1 BOOT0=1芯片内置的SRAM 区,就是内存啦。
系统存储器:BOOT1=0 BOOT0=1芯片内部一块特定的区域,叫做系统存储器。
芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。
这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM 区。
在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。
BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。
BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。
要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。
多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。
如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的其他电路,或用此方法读写板上的Flash 或EEPROM 等。
还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清除,以防止恶意的软件拷贝。
一般BOOT0 和BOOT1 跳线都跳到0(GND),即正常的从片内Flash运行,只是在ISP下载的情况下,需要设置BOOT0=1,BOOT1=0 ,下载完成后,把BOOT0 的跳线接回0,这样系统可以正常运行了。
对于一般的应用来说,直接把BOOT0 和BOOT1 引脚接地即可,不用设置跳线,使用IAR 调试程序时可以选择RAM 调试还是Flash 调试,与BOOT0 和BOOT1 的配置无关。
编写适用于STM32的ISP下载器程序
前一阵公司外购了一些控制器,配合公司的开关一起发给用户。
发货前领导认为控制器开机界面会出现我们进货厂家的LOGO不好,应该改成我们公司的名称。
于是与控制器厂家协调,让他们把开机欢迎界面改动一下。
没几天对方发过来一个ISP下载器,我们用它把控制器的程序升级了一下,就改过来了。
闲来无事,感觉这个ISP下载器很有意思。
之前我们升级程序,因为还没有着手开发远程自动升级功能,必须到现场去升级。
而且用的STM32F103的处理器本身不具备作为主机使用USB的功能,升级的时候使用串口。
所以当设备安装在现场的话,就需要带着笔记本,USB 转串口线去现场,比较麻烦。
而且,笔记本一来体积大,本来出去带着工具什么的东西就很麻烦,再带着本就更头疼;二来在现场也不好用,有转接口不好使的问题,也有其它原因,比如可能需要爬杆,在几米高的杆上抱着本给设备升级是很恐怖的事情。
鉴于此,感觉这个ISP下载器还是比较好的一款东西。
当然,对方厂家给我们发过来的这款下载器是针对他们用的处理器的,跟我们的不合适。
在网上搜索一番,发现还真能找到STM系列的ISP下载器,价格在1200元左右。
比起笔记本来说倒是很合算。
准备买它几个。
当然准备买,那是领导的打算。
我觉得应该可以自己做一下,反正我也有不少空闲时间。
于是便行动起来。
首先,我先在网上找了一款免费的串口监听工具“串口监控精灵”下载安装好。
然后将我们的控制器与PC用串口连接好。
打开监控精灵,然后打开“串口调试助手”,向终端发送命令。
发现监控精灵可以很好的将串口间的上下通信显示出来,并且会给出对串口进行配置的显示。
这样,在ISP模式下给控制器上电,在PC上打开STM的flashloader,配置好,下发一个源程序,分析监控精灵的数据:序号 , 时间 , 进程(PID) , IO类型 , COM口 , 数据长度 , 数据 ,1,14:15:38,hypertrm.exe(3708),IRP_MJ_CREATE,COM3,0,,2,14:15:38,hypertrm.exe(3708),IOCTL_SET_QUEUE_SIZE ,COM3,8,QueueSize.InSize: 8192, QueueSize.OutSize: 8192,3,14:15:38,hypertrm.exe(3708),IOCTL_SET_BAUD_RATE ,COM3,4,115200,4,14:15:38,hypertrm.exe(3708),IOCTL_SET_RTS ,COM3,0,,5,14:15:38,hypertrm.exe(3708),IOCTL_SET_DTR ,COM3,0,,6,14:15:38,hypertrm.exe(3708),IOCTL_SET_LINE_CONTROL ,COM3,3,WordLength: 8StopBits: 1Parity:0(None),7,14:15:38,hypertrm.exe(3708),IOCTL_SET_CHARS ,COM3,6,Chars Eof: 0, Error: 0, break: 0, Event: 0, Xon: 17, Xoff: 19,8,14:15:38,hypertrm.exe(3708),IOCTL_SET_HANDFLOW ,COM3,16,DCB.fAbortOnError=TRUEDCB.fTXContinueOnXoff=TRUEDCB.fRtsControl=RTS_CONTROL_ENABLEDCB.fDtrControl=DTR_CONTROL_ENABLEDCB.fDsrSensitivity=FALSEDCB->XonLim: 80DCB->XoffLim: 200,10,14:16:08,hypertrm.exe(3708),IRP_MJ_CLOSE,COM3,0,,12,14:16:30,STMicroelectronics flashloader.exe(3872),IOCTL_SET_QUEUE_SIZE ,COM3,8,QueueSize.InSize: 2048, QueueSize.OutSize: 2048,13,14:16:30,STMicroelectronics flashloader.exe(3872),IOCTL_SET_BAUD_RATE ,COM3,4,115200,14,14:16:30,STMicroelectronics flashloader.exe(3872),IOCTL_CLR_RTS ,COM3,0,,15,14:16:30,STMicroelectronics flashloader.exe(3872),IOCTL_CLR_DTR ,COM3,0,,16,14:16:30,STMicroelectronics flashloader.exe(3872),IOCTL_SET_LINE_CONTROL ,COM3,3,WordLength: 8StopBits: 1Parity:0(None),17,14:16:30,STMicroelectronics flashloader.exe(3872),IOCTL_SET_CHARS ,COM3,6,Chars Eof: 0, Error: 0, break: 0, Event: 0, Xon: 17, Xoff: 19,18,14:16:30,STMicroelectronics flashloader.exe(3872),IOCTL_SET_HANDFLOW ,COM3,16,DCB.fAbortOnError=TRUEDCB.fTXContinueOnXoff=TRUEDCB.fRtsControl=RTS_CONTROL_DISABLEDCB.fDtrControl=DTR_CONTROL_DISABLEDCB.fDsrSensitivity=FALSEDCB->XonLim: 2048DCB->XoffLim: 512,19,14:16:30,STMicroelectronics flash loader.exe(3872),IRP_MJ_WRITE,COM3,1, 7F | •,21,14:16:30,STMicroelectronics flash loader.exe(3872),IRP_MJ_CLOSE,COM3,0,, 22,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_CREATE,COM3,0,, 23,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_QUEUE_SIZE ,COM3,8,QueueSize.InSize: 2048, QueueSize.OutSize: 2048,24,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_BAUD_RATE ,COM3,4,115200,25,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_CLR_RTS ,COM3,0,,26,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_CLR_DTR ,COM3,0,,27,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_LINE_CONTROL ,COM3,3,WordLength: 8StopBits: 1Parity:0(None),28,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_CHARS ,COM3,6,Chars Eof: 0, Error: 0, break: 0, Event: 0, Xon: 17, Xoff: 19,29,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_HANDFLOW ,COM3,16,DCB.fRtsControl=RTS_CONTROL_DISABLEDCB.fDtrControl=DTR_CONTROL_DISABLEDCB.fDsrSensitivity=FALSEDCB->XonLim: 2048DCB->XoffLim: 512,30,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,1, 7F | •,31,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,32,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_BAUD_RATE ,COM3,4,115200,33,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_CLR_RTS ,COM3,0,,34,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_CLR_DTR ,COM3,0,,35,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_LINE_CONTROL ,COM3,3,WordLength: 8StopBits: 1Parity:2(E),36,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_CHARS ,COM3,6,Chars Eof: 0, Error: 0, break: 0, Event: 0, Xon: 17, Xoff: 19,37,14:17:34,STMicroelectronics flashloader.exe(2848),IOCTL_SET_HANDFLOW ,COM3,16,DCB.fRtsControl=RTS_CONTROL_DISABLEDCB.fDtrControl=DTR_CONTROL_DISABLEDCB.fDsrSensitivity=FALSEDCB->XonLim: 2048DCB->XoffLim: 512,38,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 00 FF | \#0?,79 | y,40,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 0B | \#11,41,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 22 | ",42,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,11, 00 01 02 11 21 31 43 63 73 82 92 | \#0\#1\#2\#17!1Ccs??,43,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,44,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 02 FD | \#2y,45,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,46,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 01 | \#1,47,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, 04 14 | \#4,48,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,49,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 02 FD | \#2y,50,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,51,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 01 | \#1,52,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, 04 14 | \#4,53,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,54,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 11 EE | \#17?,55,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,56,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 1F FF F7 E0 F7 | ?÷à÷,57,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,58,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 01 FE | \#1t,59,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,60,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, 00 02 | \#0\#2,11 EE | \#17?,62,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,63,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 1F FF F7 E2 F5 | ?÷a?,64,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,65,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 01 FE | \#1t,66,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,67,14:17:34,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, FF FF | ??,68,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 02 FD | \#2y,69,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,70,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 01 | \#1,71,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, 04 14 | \#4,72,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,73,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 02 FD | \#2y,74,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,75,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 01 | \#1,76,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, 04 14 | \#4,77,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,78,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 11 EE | \#17?,79,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,80,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 1F FF F7 E0 F7 | ?÷à÷,81,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,82,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 01 FE | \#1t,79 | y,84,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, 00 02 | \#0\#2,85,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 11 EE | \#17?,86,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,87,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 1F FF F7 E2 F5 | ?÷a?,88,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,89,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 01 FE | \#1t,90,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,91,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,2, FF FF | ??,92,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 00 FF | \#0?,93,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,94,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 0B | \#11,95,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 22 | ",96,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,11, 00 01 02 11 21 31 43 63 73 82 92 | \#0\#1\#2\#17!1Ccs??,97,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,98,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 11 EE | \#17?,99,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,100,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 1F FF F8 08 10 | ??\#8\#16,101,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,102,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 03 FC | \#3ü,103,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,104,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,4, FF FF FF FF | ????,11 EE | \#17?,106,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,107,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 1F FF F8 0C 14 | ??\#12,108,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,109,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 03 FC | \#3ü,110,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,111,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,4, FF FF FF FF | ????,112,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 11 EE | \#17?,113,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,114,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 1F FF F8 00 18 | ??\#0,115,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,116,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 03 FC | \#3ü,117,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,118,14:17:40,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,4, A5 5A FF FF | ¥Z??,119,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 43 BC | C?,120,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,121,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, FF 00 | ?\#0,122,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,123,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2, 31 CE | 1?,124,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,125,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5, 08 00 00 00 08 | \#8\#0\#0\#0\#8,126,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1, 79 | y,FB | ?,128,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,252, 80 0D 00 20 FD 1E 00 08 E9 1E 00 08 EB 1E 00 08 ED 1E 00 08 EF 1E 00 08 F1 1E 00 08 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 F3 1E 00 08 F5 1E 00 08 00 00 00 00 F7 1E 00 08 F9 1E 00 08 3D 1F 00 08 41 1F 00 08 45 1F 00 08 49 1F 00 08 4D 1F 00 08 51 1F 00 08 55 1F 00 08 59 1F 00 08 5D 1F 00 08 61 1F 00 08 65 1F 00 08 69 1F 00 08 6D 1F 00 08 71 1F 00 08 75 1F 00 08 79 1F 00 08 7D 1F 00 08 81 1F 00 08 85 1F 00 08 89 1F 00 08 8D 1F 00 08 91 1F 00 08 95 1F 00 08 99 1F 00 08 9D 1F 00 08 A1 1F 00 08 A5 1F 00 08 A9 1F 00 08 AD 1F 00 08 B1 1F 00 08 B5 1F 00 08 B9 1F 00 08 BD 1F 00 08 C1 1F 00 08 C5 1F 00 08 C9 1F 00 08 CD 1F 00 08 D1 1F 00 08 D5 1F 00 08 D9 1F 00 08 DD 1F 00 08 E1 1F 00 08 E5 1F 00 08 E9 1F 00 08 ED 1F 00 08 F1 1F 00 08 F5 1F 00 08 | ?\#13\#0 y\#0\#8é\#0\#8?\#0\#8í\#0\#8?\#0\#8?\#0\#8\#0\#0\#0\#0\#0\#0\#0\#0\#0\#0\#0\#0\#0\#0\#0\#0ó\#0\#8?\#0\#8\#0\#0\#0\#0÷\#0\#8ù\#0\#8=\#0\#8A\#0\#8E\#0\#8I\#0\#8M\#0\#8Q\#0\#8U\#0\#8Y\#0\#8]\#0\#8a\#0\#8e\# 0\#8i\#0\#8m\#0\#8q\#0\#8u\#0\#8y\#0\#8}\#0\#8?\#0\#8?\#0\#8?\#0\#8?\#0\#8?\#0\ #8?\#0\#8?\#0\#8?\#0\#8?\#0\#8¥\#0\#8?\#0\#8-\#0\#8±\#0\#8μ\#0\#81\#0\#8?\#0\#8á\#0\#8?\#0\#8é\#0\#8í\#0\#8?\#0\#8?\#0\#8ù\#0\#8Y\#0\#8á\#0\#8?\#0\#8é\#0\#8í\#0\#8?\#0\#8?\#0\#8,129,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,1,7C | |,130,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1,79 | y,131,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,2,31 CE | 1?,132,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1,79 | y,133,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,5,08 00 00 FC F4 | \#8\#0\#0ü?,134,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_READ,COM3,1,79 | y,135,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,1,FB | ?,136,14:18:20,STMicroelectronics flash loader.exe(2848),IRP_MJ_WRITE,COM3,252, F9 1F 00 08 FD 1F 00 08 01 20 00 08 05 20 00 08 09 20 00 08 0D 20 00 08 11 20 00 08 15 20 00 08 19 20 00 08 1D 20 00 08 21 20 00 08 25 20 00 08 29 20 00 08 DF F8 40 03 01 68 01 F4 E0 61 DF F8 3C 23 11 43 01 60 BF F3 4F 8F FE E7 F0 B4 DF F8 30 23 00 23 1C 46 1D 46 01 E0 64 1C 6D 1C 0A 2D 13 D2 B1 FB F2 F6 06 F1 30 07 1F 54 5B 1C 02 FB 16 11 0A 26 B2 FB F6 F2 1E 18 16 F8 01 6C 30 2E EB D1 00 2C E9 D1 00 23 E8 E7 F0 BC 70 47 30 B4 0A 46 00 21 0B 46 04 78 30 2C 37 D1 44 78 78 2C 01 D0 58 2C 32 D1 84 78 00 2C 01 D1 08 46 5A E0 02 24 03 E0 57 3D 05 EB 03 13 64 1C 0B 2C 04 D2 25 5C 00 2D 05 D1 13 60 01 21 0B 2C 4A D3 00 21 48 E0 41 3D ED B2 06 2D 09 D3 25 5C 61 3D ED B2 06 2D 04 D3 25 5C 30 3D ED B2 0A 2D ED D2 25 5C 30 3D EDB2 0A 2D 25 5C 01 D2 30 3D | ù\#0\#8y\#0\#8\#1 \#0\#8\#5 \#0\#8\#9 \#0\#8\#13 \#0\#8\#17 \#0\#8 \#0\#8 \#0\#8 \#0\#8! \#0\#8% \#0\#8) \#0\#8??@\#3\#1h\#1?àa??第二篇前一篇本意是把400行左右的监控代码全部粘贴完的,但是发完博文后发现仅仅能显示一百三十来行的内容,想如果把四百行都粘贴完,恐怕仅这些数据就得几篇节。
基于YModem的STM32串口IAP的设计
基于YModem的STM32串口IAP的设计摘要:针对STM32应用程序在线升级的问题,提出基于YModem的串口IAP方案,以实现简单、高效、可靠的MCU程序在线升级。
本文给出了基于YModem的串口IAP方案的原理解释及实现的技术细节。
方案成功应用在多个实际的项目中,缩短Bug修复时间,能实现远程升级,取得较大的经济和社会效益。
关键词:STM32串口BOOTLOADER YModem协议IAP随着集成电路技术的发展以及电子产品越来越智能化,MCU的应用越来越广泛。
而在MCU使用过程中,应用程序的升级是一个难点。
目前,对于程序升级主要存在两种技术:在系统编程ISP以及在应用编程IAP。
ISP在系统编程,指的是一种在系统中直接进行烧录的编程技术。
IAP在应用编程,指的是MCU可以在系统运行中获取新的代码并对自己重新编程的技术。
ISP一般需要少量的外部电路辅助实现,需要硬件事先留出相关接口且到现场升级;而IAP只需要依托系统现成的通信链路,无需额外的硬件,更为灵活,而且可以实现远程升级,因此IAP技术越来越受到欢迎和重视。
本文介绍一种基于YModem的STM32串口IAP的设计,从而实现简洁、高效、可靠地对MCU进行在应用编程。
一、STM32的IAP原理要实现STM32的在应用编程(IAP),需要把原来的一个程序拆分为两个程序,一个是负责对应用程序进行在应用编程的BOOTLOADER程序;另一个则是实现真正功能的应用程序APP。
因此,需要把Flash划分为BOOTLOADER区域和APP区域,如图1.1所示。
1.具体说来,BOOTLOADER程序需要实现两个功能:(1)在接收到升级命令时,与上位机进行通信,把新的APP程序接收并烧写到APP所在的Flash区域。
(2)在程序烧写完成后或无需升级时,自动跳转到APP程序来执行。
图1.1 IAP程序空间划分当系统复位时,中断向量表指向0x00000000,会从0x00000004处取出复位起始地址,并跳转到中断服务程序中执行,即执行BOOTLOADER中的复位中断程序。
STM32平台串口升级说明(超级终端版)
STM32平台IAP升级说明使用电脑超级终端进行升级;
1、建立一个连接,任意取一个名字,选择一个图标
2、选择你的电脑所使用的串口号
3、串口设置:
波特率:115200bps;
数据位:8;
停止位:1;
流控:无;
设置后确认连接
2、断电重启设备,按照串口打印提示操作:上电5秒钟之内长按下PC机键盘的“u”如下图所示
设备进入到升级的main menu;
后面的Invalid Number ! ==> The number should be either 1 or 2是由于进入到main menu后默认只能输入“1”或“2”而此时依然按着“u”打印出来的输入错误信息。
(对升级无影响)
3、输入“1”进入升级模式,输入“2”退出升级,跳到应用程序;
输入1后串口打印等待接收升级文件,按“a”退出。
等待中不断打印“c”表示正在等待。
4、点击发送按钮,协议项选择Ymodem;
点击打开
点击“发送”后开始升级;
5、升级过程中会打印升级进度,升级成功后会提示升级成功。
设备自动重启。
5秒钟内无
操作自动进入刚下载好的用户应用程序。
6、升级后的程序版本号
启,如果一次操作失败,请多操作几次!。
STM32 IAP在线升级
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在线升级
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;}}然后就是在基本函数的基础上⾯扩展我们需要的函数,因为升级过程中,我们需要保存⼀些标志,需要⽤到读某⼀页的函数。
基于STM32的远程升级系统的设计_温世坚
0引言越来越多的电子产品采用意法半导体芯片STM32系列(简称STM32)作为其核心控制单元,随之便产生了产品的软件升级问题。
由于电子产品具有区域分散性,不利于企业进行集中式升级。
所以如果需要升级主机硬件上的芯片程序,以前的办法是直接把硬件主机打包快递到企业总部,然后再修改刷新程序,并测试完了再发回去。
这种方式费时费力,而且难免忙中出错。
为进一步提高工作效率,降低由此而产生的快递费、人工费等额外的支出,减少时间损失,特开发基于STM32芯片的远程升级系统。
该系统有效利用了因特网的方便快捷,避免了传统物流模式的各种缺点,并且可以保护企业的知识产权,防止程序源文件泄露。
本系统属于服务器/客户端模式,用户界面均采用VB.NET设计。
服务器端后台运行的是MYSQL数据库,客户端则只需要匹配一条专用串口下载线。
维护人员只在能上网的电脑上使用这条下载线,就能通过客户端登陆到服务器,进行STM32芯片的软件升级操作。
1工作原理客户端通过因特网,从服务器端获取程序源文件的数据,然后使用串口下载线擦除STM32芯片的基于STM32的远程升级系统的设计DesignofRemote-UpdateSystemBasedonSTM32温世坚张伟波WenShijianZhangWeibo(广州市雄兵汽车电器有限公司,广东广州511338)(SpacekeyAutoElectronicsCo.,Ltd.,GuangdongGuangzhou511338)摘要:本文介绍了一种基于STM32芯片的远程升级系统的设计方案。
简述了从数据下载线、客户端、服务器到数据库MYSQL设计的全部过程,并提供了客户端、服务器的通信细节分析,提供了升级操作的可靠性和便利性。
关键词:远程升级;STM32;ISP;MYSQL;VB.NET中图分类号:TP391文献标识码:A文章编号:1671-4792(2013)05-0097-04Abstract:Thispaperintroducesadesignschemeofremote-updatesystembasedonSTM32chip.Thedesignprocessincludesthewholeprogressofthedownloadcable,theclient,theserverandthedatabaseMYSQL.Andthepaperprovidessomeanalysisofcommunicationdetailsbetweenclientandservertoensurethereliabilityandconvenienceofupgradingoperation.Keywords:Remote-Update;STM32;ISP;MYSQL;VB.NET基于STM32的远程升级系统的设计97科技广场2013.5FLASH,并把已获取的数据写入到FLASH,即可实现远程更新。
4G网络和STM32的远程系统升级
• 87•随着4G 网络的普及,使野外实时监测设备得以方便的实现,但是安装野外的设备存在着两个问题:(1)设备一般安装的比较偏远;(2)设备一般成分布式排布,每台设备间相距比较远;这样使设备的系统升级极不方便。
文章提出了通过4G 网络实现以STM32为微控制器的设备的远程系统升级方案。
从而实现远程对野外设备的系统升级,大大的提高了生产效率,并且可以及时对设备运行过程中发现的bug 进行修复。
在铁轨断轨监测,水源水质监测,输油管道结构健康监测等监测系统中,都需要在野外安装设备,并且存在仪器多,分布广等现象,同时个别监测系统,还会存在着分布式设备之间彼此需要协调交互工作。
当出现各种原因,需要对仪器设备固件进行升级时,需要工作人员到现场进行升级,将会严重影响工作效率,并且需要消耗大量的人力物力。
本文提出的基于4G 网络和STM32的远程升级方案,能有效的解决人员到现场升级设备,并且能够更快更便捷的实现系统的升级,极大的减少了生产成本。
1 远程升级系统的硬件组成远程升级仪器是基于STM32微控制器,整个仪器的硬件组成包括太阳能供电,电源管理系统,GPRS_4G 通信部分,EEPROM 外部存储器和其他用户功能模块。
图1所示为升级功能部分的的主要硬件组成。
图1 升级功能模块硬件框图STM32通过串口和GPRS_4G 模块进行连接。
GPRS_4G 通信模块可以实现串口到网络的双向数据透明传输,可以通过此模块实现发送数据到网络上指定的服务器。
模块也可以接收来自服务器的数据,并将信息通过串口发送至STM32,如图2所示。
EEPROM(Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。
是一种掉电后数据不丢失的存储芯片。
做为外部的一个独立存储器,可以在程序升级前后保存系统配置数据,保证系统升级前后数据的一致性。
同时也可以为升级提供一些辅助标志功能。
STM32三种启动模式以及IAP在线升级
一.Duanxx的STM32学习:启动模式,BOOT0和BOOT1详解Reference from:/daunxx/article/details/40148945在画STM32的电路图的时候,关于STM32的启动方式纠结了一下,现有的参考设计都是在STM32的启动选择引脚BOOT0和BOOT1上使用了跳帽,用以人工选择STM32的启动方式,但是在实际应用中这种设计就显得冗余,所以这里顺带研究了一下STM32的启动方式。
STM32一共有三种启动模式,在ST官网上下载的RM0008中,我找到了启动相关的配置说明:对应的中文翻译如下:所谓启动,一般来说就是指我们下好程序后,重启芯片时,SYSCLK 的第4个上升沿,BOOT引脚的值将被锁存。
用户可以通过设置BOOT1和BOOT0引脚的状态,来选择在复位后的启动模式。
∙Main Flash memory是STM32内置的Flash,一般我们使用JTAG或者SWD模式下载程序时,就是下载到这个里面,重启后也直接从这启动程序。
∙System memory从系统存储器启动,这种模式启动的程序功能是由厂家设置的。
一般来说,这种启动方式用的比较少。
系统存储器是芯片内部一块特定的区域,STM32在出厂时,由ST在这个区域内部预置了一段BootLoader,也就是我们常说的ISP程序,这是一块ROM,出厂后无法修改。
一般来说,我们选用这种启动模式时,是为了从串口下载程序,因为在厂家提供的BootLoader中,提供了串口下载程序的固件,可以通过这个BootLoader将程序下载到系统的Flash中。
但是这个下载方式需要以下步骤:Step1:将BOOT0设置为1,BOOT1设置为0,然后按下复位键,这样才能从系统存储器启动BootLoaderStep2:最后在BootLoader的帮助下,通过串口下载程序到Flash中Step3:程序下载完成后,又有需要将BOOT0设置为GND,手动复位,这样,STM32才可以从Flash中启动可以看到,利用串口下载程序还是比较的麻烦,需要跳帽跳来跳去的,非常的不注重用户体验。
详解STM32 ISP设置及使用说明
详解STM32 ISP设置及使用说明(原创)1. STM32的BOOT概述STM32三种启动模式对应的存储介质均是芯片内置的,它们是:用户闪存:BOOT1=x BOOT0=0芯片内置的Flash,即主存储器FlashSRAM:BOOT1=1 BOOT0=1芯片内置的SRAM 区,就是内存啦。
系统存储器:BOOT1=0 BOOT0=1芯片内部一块特定的区域,叫做系统存储器。
芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。
这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM 区。
在每个STM32的芯片上都有两个管脚BOOT0和BOOT1,这两个管脚在芯片复位时的电平状态决定了芯片复位后从哪个区域开始执行程序,见下表:BOOT1=x BOOT0=0 从用户闪存启动,这是正常的工作模式。
BOOT1=0 BOOT0=1 从系统存储器启动,这种模式启动的程序功能由厂家设置。
BOOT1=1 BOOT0=1 从内置SRAM 启动,这种模式可以用于调试。
要注意的是,一般不使用内置SRAM 启动(BOOT1=1 BOOT0=1),因为SRAM 掉电后数据就丢失。
多数情况下SRAM 只是在调试时使用,也可以做其他一些用途。
如做故障的局部诊断,写一段小程序加载到SRAM 中诊断板上的其他电路,或用此方法读写板上的Flash 或EEPROM 等。
还可以通过这种方法解除内部Flash 的读写保护,当然解除读写保护的同时Flash 的内容也被自动清除,以防止恶意的软件拷贝。
一般BOOT0 和BOOT1 跳线都跳到0(GND),即正常的从片内Flash运行,只是在ISP下载的情况下,需要设置BOOT0=1,BOOT1=0 ,下载完成后,把BOOT0 的跳线接回0,这样系统可以正常运行了。
对于一般的应用来说,直接把BOOT0 和BOOT1 引脚接地即可,不用设置跳线,使用IAR 调试程序时可以选择RAM 调试还是Flash 调试,与BOOT0 和BOOT1 的配置无关。
单片机ISP、IAP和ICP几种烧录方式的区别
单片机ISP、IAP和ICP几种烧录方式的区别单片机ISP、IAP和ICP几种烧录方式的区别玩单片机的都应该听说过这几个词。
一直搞不太清楚他们之间的区别。
今天查了资料后总结整理如下。
ISP:In System Programing,在系统编程IAP:In applicating Programing,在应用编程ICP:In Circuit Programing,在电路编程ISP是指可以在板级上进行编程,也就是不用拆芯片下来,写的是整个程序,一般是通过ISP接口线来写。
IAP虽然同样也是在板级上进行编程,但是是自已对自已进行编程,在应用中进行编程,也即可以只是更改某一部分而不影响系统的其它部分,另外接口程序是自已写的,这样可以进行远程升级而不影响应用。
打个比喻吧:1、ISP是把房子拆了再重造一间,那么在造好之前当然是不能住人的啦!2、IAP是在造好的房子里边进行一些装修,当然人可以继续住啦!ICP是在电路编程,是LPC芯片的编程方式,相当于ATMEL的ISP,而LPC的ISP就相当于ATMEL的IAP了。
ISP于IAP的区别ISP:in system programming, 在系统编程IAP: in applicatin programming 在应用编程但两者的操作方式,结果和应用场合有什么区别什么是ISP:用写入器将COD e烧入,不过,芯片可以在目标板上,不用取出来,在设计目标板的时候就将接口设计在上面,所以叫"在系统编程",即不用脱离系统;什么是IAP:在应用编程,有芯片本身(或通过外围的芯片)可以通过一系列操作将code写入,比如一款支持Iap的单片机,内分3个程序区,1作引导程序区,2作运行程序区,3作下载区,芯片通过串口接收到下载命令,进入引导区运行引导程序,在引导程序下将new code内容下载到下载区,下载完毕并校验通过后再将下载区内容复制到2区,运行复位程序,则Iap完成;应用场合:1,ISP 程序升级需要到现场解决,不过好一点的是不必拆机器了;2,IAP 如果有网管系统的话,用网管下载一切搞定,人不用跑来跑去, 这可能是他们的优点或应用吧在线编程目前有两种实现方法:在系统编程(ISP)和在应用编程(IAP)。
STM32 ISP升级另类方法
STM32芯片自带固化的ISP程序,在芯片上电的时候会检查BOOT0 BOOT1电平状态,如果BOOT0=1BOOT1=0则会进入自带的ISP程序,基本可以满足程序升级需要。
但是如何进入这个模式,是一个问题,网上有人使用串口的握手信号来控制,但是这样会超过3条线(RX TX GND)。
昨天测试了一个方法,上位机发出一个指令,STM32用户自己的程序解析后,利用自己的IO口,控制一个简单的延时电路来拉高BOOT0,然后芯片重新启动,则进入ISP。
刷新完成后,跳入用户程序运行,控制权交回用户程序。
程序中设置PB8为ISP_DRV ,推挽输出;输出一定时间后,充满电容后,可以使用NVIC_SystemReset() 重新启动(3.12库)。
即可进入ISP模式。
另外,需要在程序中设置如下向量表地址,才可以在勾选ISP程序的jump to user application after flash 后,进入用户程序。
/* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);测试了若干次没有发现异常。
何须如此麻烦,直接跳转到SystemMemory不就行了,一个函数解决所有问题。
这是我写的一个函数,没有测试过,不过估计问题不大,有兴趣的同志可以帮忙测试一下。
void EnterSyetemMemoryISP(void){typedef void (*APP_FUNC_DEF)(void);vu32 *appaddress = (vu32 *)(0x1FFFF000); //SystemMemory 的起始地址。
APP_FUNC_DEF pappfunc;u32 appresetaddr;appresetaddr = *(appaddress + 1);pappfunc = (APP_FUNC_DEF) appresetaddr;//从起始地址读取堆栈指针__MSR_MSP(*appaddress);//进入ISPpappfunc();}。
STM32F108C8W5200基于HTTP的远程配置和固件更新
基于 HTTP的远程配置和固件更新STM32F108C8 + W52002013/11/28 | Filedunder:TCP/IP芯片 and taggedwith: HTTP, W5200,wiznet, 升级, 固件更新, 远程配置 143 Views(已在《无线电》杂志第10期刊登)对于HTTP的思考你也许会问,既然通过一个上位机程序可以完成这个任务,为什么还要通过浏览器实现呢?其实这两个方法各有优缺点,用上位机程序,用户可以自己定制协议,但是用户不仅需要安装该上位机程序,而且还要考虑面对不同的操作系统下的兼容情况。
然而通过网页更新的话,只需要设备内嵌一个HT TP 服务器,便省去了编写上位机程序的负担,并无须考虑去兼容不同的操作系统。
当然,上位机程序可以实现UD P广播寻址终端,无需知道终端IP地址即可找到同一网段下的多个终端。
而使用网页的话就只能是预先知道终端IP地址并逐一配置。
其实,对于通过网页配置相信大家并不陌生,家里有无线路由器的朋友估计都有实践经验。
通过浏览器键入路由器的默认IP,然后根据网页提示就可以一步步地实现设备信息配置,诸如WiFi密码、SSID等。
今天,我们就是来探究一下这个应用的原理,在单片机里实现一个HT TP服务器,通过这个HT TP服务器来配置设备信息,并实现了设备固件更新。
当然,我这里的这个HTTP服务器没有家里的路由器那样的功能强大,在这里也只是抛砖引玉,希望大家能够从中获取启发,设计出更出色的产品。
方便起见,我们仍旧延续上一篇文章的平台——基于Cort ex-M3的W5200评估板(STM32F108C8 + W5200)。
图1 W5200评估板该评估板单片机的系统资源:64KB的闪存和20K B的SRA M。
STM32F103串口-IAP程序升级
STM32F103串⼝-IAP程序升级03 串⼝-IAP程序升级通常情况下我们给STM32系列的单⽚机烧录程序⽂件的时候,使⽤SWD、J-link或者通过设置BOOT引脚后,使⽤串⼝进⾏程序下载,这样的⽅式直接⼀次性将程序⽂件下载到单⽚机的flash中,⽐较适合绝⼤部分的应⽤。
但是有些应⽤中产品装配完成后,下载⼝不便引出的情况下,或者是某些设备需要具有远程更新程序情况下,使⽤串⼝IAP的⽅式将会更加便捷。
⼀般我们常见的51单⽚机内部的flash空间,只能使⽤下载器进⾏烧录程序。
芯⽚⾃⾝⽆法擦写内部flash空间。
这样的情况下,如果我们后期需要升级芯⽚中的程序时,只能到现场使⽤下载器重新烧录程序,这样⽐较繁琐。
但是STM32单⽚机内部的flash可以在程序中让单⽚机⾃⾝去擦写编程,同时官⽅也提供了相应的操作函数固件库。
这样就可以实现单⽚机程序的远程升级,通过芯⽚外设的某种通信接⼝(⼀般常⽤串⼝),将程序⽂件发送给芯⽚,让芯⽚⾃⾝把程序⽂件写⼊内部flash,实现程序的远程升级操作。
如果要实现让单⽚机⾃⾝去升级程序,就必须要将内部flash空间进⾏划分,分不同的区域写⼊不同⼯程的程序代码,才能实现该功能。
⼀般情况下,我们将单⽚机的内部flash空间划分为两⼤区域,为了⽅便理解,我们叫做bootloader区域和app区域(这⾥的bootloader和app为⾃定义名称,也可叫做其他名称)。
分为两⼤区域的原因是,我们要给⼀块芯⽚(单⽚机)写⼊两个不同的⼯程⽂件,这个两个⼯程分别是“程序升级⼯程(bootloader)”和“应⽤程序⼯程(app)”。
两个⼯程的区别是:“程序升级⼯程”存放在flash的bootloader区域。
它的作⽤:接收新版本的程序⽂件,将收到的⽂件写⼊内部flash的app区域中。
这个⼯程的任务⽐较单⼀,所以它只占⽤较⼩的⼀部分flash空间”。
“应⽤程序⼯程”存放在flash的app区域。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32芯片自带固化的ISP程序,在芯片上电的时候会检查BOOT0 BOOT1电平状态,如果
BOOT0=1
BOOT1=0
则会进入自带的ISP程序,基本可以满足程序升级需要。
但是如何进入这个模式,是一个问题,网上有人使用串口的握手信号来控制,但是这样会超过3条线(
RX TX GND)。
昨天测试了一个方法,上位机发出一个指令,STM32用户自己的程序解析后,利用自己的IO口,控制一个简单的延时电路来拉高BOOT0,然后芯片重新启动,则进入ISP。
刷新完成后,跳入用户程序运行,控制权交回用户程序。
程序中设置PB8为 ISP_DRV ,推挽输出;输出一定时间后,充满电容后,可以使用NVIC_SystemReset() 重新启动(3.12库)。
即可进入ISP模式。
另外,需要在程序中设置如下向量表地址,才可以在勾选ISP程序的 jump to user application after flash后,进入用户程序。
/* Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
测试了若干次没有发现异常。
何须如此麻烦,直接跳转到SystemMemory不就行了,一个函数解决所有问题。
这是我写的一个函数,没有测试过,不过估计问题不大,有兴趣的同志可以帮忙测试一下。
void EnterSyetemMemoryISP(void)
{
typedef void (*APP_FUNC_DEF)(void);
vu32 *appaddress = (vu32 *)(0x1FFFF000); //SystemMemory 的起始地址。
APP_FUNC_DEF pappfunc;
u32 appresetaddr;
appresetaddr = *(appaddress + 1);
pappfunc = (APP_FUNC_DEF) appresetaddr;
//从起始地址读取堆栈指针 __MSR_MSP(*appaddress); //进入ISP
pappfunc(); }。