完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
我们在开发与生产过程中烧录程序主要是用J-link、ST-link等设备通过串口进行烧录。一款设备在出厂后由于各种原因不方便被用户拆壳,但程序有时需要升级该怎么?这个时候就需要用到我们今天讨论的话题——IAP在线升级功能了。
一. 首先是IAP功能实现的原理,简单来说IAP其实就是对FLash的操作,我们只要懂得对FLash的读、写、跳转与重映射中断向量表就可以满足编写IAP功能程序需要了。完整的IPA功能需要两部分代码:Bootloader+APP(为了方便书写下面的BootLoader我就全部用BOOT代替了)。其中APP程序就是我们用来实现设备各种功能的程序,而BOOT的作用就是在Flash中对APP程序的读、写与跳转功能了。 二. 接下来我们来讨论一下实现IAP功能的逻辑与程序的编写。 1.首先我们要确定BOOT与APP程序存储在Flash的什么位置,以STM32L4为例。首先我们要留出足够的空间存放BOOT的程序与各种标志,并且设备上电后要先进入BOOT中进行"跳转到APP/更新APP"的判断,所以一般BOOT要在中断向量表默认的起始地址0x08000000,APP地址为0x08001000(假设BOOT代码大小为3K,留出1K大小的FLash空间存储各种标志)。 2.检测更新标志。在BOOT主循环中需要检测是否有更新APP标志SET_FLAG_DATA,如果检测到标志就更新APP;如果没有检测到更新APP标志SET_FLAG_DATA,则直接进行第6步跳转APP程序。 3.擦除Flash。擦除APP程序在Flash中存储的位置(注意:只有擦除后才能写入,所以一般是擦除APP存储的位置到Flash结束的位置),并且配置页擦除中Flash页的大小FLASH_PAGE_SIZE,不同型号的开发板每页的发小不一样,本文中所用开发板Flash页的大小为128字节。 4.写Flash。需要把APP的程序写入到Flash中(本文写在地址0x08010000—0x08020000之间)如何获取APP程序本文就不加以赘述,下面看代码。 5.如果Flash写入成功就擦除更新APP标志SET_FLAG_DATA,如果写入失败就从第2步开始在做一遍。下面是擦除更新标志的程序: 6.接下来就可以跳转APP程序了,具体程序如下: 7.这一步开始操作需要在APP程序的工程中进行,首先是设备自身的功能这里就直接跳过。在这里我们首先要设置接到上位机命令后在FLASH_UPDE_ADDR(更新标志所在地址)位置写入更新APP标志SET_FLAG_DATA,并重启设备或是跳转到BOOT所在地址:0x08000000。 注意:APP的中断向量表要重映射到APP程序所在的起始地址,本文为0x08010000。 8.最后分别把BOOT程序和APP程序分别烧录到设备的0x08000000与0x08010000地址就完成了。 注:另外有的朋友用标准库实现IAP功能,如果开发板是Cortex M0内核的话可能会发现不能像Cortex-m3/m4内核的单片机那样通过设置SCB->VTOR 寄存器的值来实现中断向量表的重映射。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:43 , Processed in 1.250505 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号