查看: 12708|回复: 14

[分享] 分享一个LPC1788 IAP下载(另附上一个自己写的IAP下载工具)

[复制链接]
  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
    发表于 2016-12-9 21:05:42 | 显示全部楼层 |阅读模式
    写完这个就准备收手,接着开始看linux了,毕竟,哎!不说了,直接进正题吧!
    IAP即在应用编程。是用户为程序在运行过程中对芯片flash的部分区域进行烧写,实现产品在发布后可以很方便地通过预留的通信接口对产品中的固件程序进行更新升级。通常实现IAP功能时,芯片需要在程序设计时编写两个项目代码,一个程序不执行正常的功能操作,而只是通过某种通信方式接受新程序,并在接收完数据后执行对新程序的更新,第二个代码才是真正的功能代码。这两部分项目代码都同时烧录在用户flash中,芯片上电后首先执行第一个程序,这段程序类似于windows中的BIOS引导,在刚上电时执行某些操作进而指向新固件数据接收操作,接收完数据后程序自动跳转到新固件的地址。我们一般把第一个程序称为Bootloader或IAP程序,第二个程序称为APP,这两段程序都存在MCU的flash中的不同地址中,默认情况下是IAP程序在flash 的起始处,APP程序自己根据程序APP程序大小来确定,同时如果MCU的flash足够大也可以设计多个APP在不同的flash地址段。
    了解了上面的定义,接下来我们来看看LPC1788的ROM和SRAM分布
    1.png 我所用的LPC1788 512kB flash96kB SRAM,所以容量很足嘛,再来看看flash的扇区划分:
    2.png 可以看出前16个扇区每个扇区4kB,后14个扇区每个扇区32kB,每个扇区很大嘛,可以写好多APP了。还有一点非常有意思,1788并没有寄存器来让我们操作flash,它内置了iapflash算法:
    3.png 我们可以通过开放的命令来操作flash 4.png
    具体的命令介绍,自己看数据手册的flashmemory。
    再来看看我们MCU刚上电时的程序运行情况,这里不想在画图了,就借助stm32的流程图来说一下,这个是程序正常启动的流程:
    5.png 我们上面也说过1788flash起始地址是0x00000000,一般情况下,程序文件就从此地址开始写入执行,再来对比一下我们程序的启动文件:

    6.png 这是中断向量表,和正常的程序启动刚好对的上。再来看一下加入IAP程序之后的程序流程:
    7.png 我们默认IAP程序的其实地址在0x00000000, 当然也可以修改的,一般情况下IAP程序起始地址为mcuflash起始地址,芯片在上电复位后先从0x00000004处取出复位中断向量表的地址,并跳转到复位向量中断服务程序,在复位中断程序执行完之后,会跳转到程序的main函数,这个在启动文件中也可以看出来:
    8.png 这里我的程序在复位中断服务函数处理中先跳转到SystemInit()函数接着在跳转到__main中,这里__mainC++的一个连接库,__main中包含main,所以这里直接写main也是可以的,具体细节自己百度吧,这里的systemInit从名称也可以看到是系统时钟初始化,这也是为什么有些mcumain函数中没有初始化系统时钟的原因,因为在之前就已经初始化了。
    好了再说一下中断向量表,这是M3权威指南中介绍的:
    9.png 这里的地址根据不同的mcu而不同。

    好了简单介绍了1788的内存分布,接着干嘛呐?说一下我们下载的数据吧,标准的IAP下载的是bin文件的数据,我们一般使用keil时生成的是hex文件。其实bin文件和hex文件是差不多的,hex文件包含了数据的地址信息,而bin文件只包含了数据并没有包含数据的地址信息: 10.png 右边是hex文件内容, 左边是其对应的bin文件内容,具体的hex文件格式有必要自己查看资料了解一下,我们IAP下载时下载的就是bin文件的内容。其实这里有一个问题,如果不注意到可能不会发现,这个问题留到最后面说。
    好了,理论的就说这些,下面开始进入程序实现,首先要让keil生成bin文件:
    11.png
    这里划线部分:

    D:\Keil\Keil_v4\ARM\ARMCC\bin\fromelf.exe--bin --output ./Output/LPC1788_Blinky.bin ./Output/LPC1788_Blinky.axf
    前面到.exekeil安装目录下的fromelf.exe执行程序目录,后面的为要输出的bin文件和axf文件,这里注意Output后面的路径要与这里一样: 12.png 接着编译一下就OK了。
    接着先说一下IAP程序:这里IAP程序和正常程序一样只是在芯片刚上电时检测是否需要更新程序,上电瞬间检测是否有按键按下,有则需要更新程序,没有则执行老的程序,我这里IAP程序不是标准的,可以通过选择来让程序执行那段程序,老的程序: 13.png
    这里重点是新程序的接收,当上电检测到按键后进入更新程序段,接着在通过按键选择:
    14.png 接收数据,或跳转到新程序: 15.png 这里我把APP程序放在flash的第16个扇区即起始地址为:0x00010000
    说一下这里的这句: 111.png 这里是判断栈地址是否在1788SRAM64kB区域内,因为刚上电时MSP指针指向的是栈地址,而1788的栈地址在0x10000000-0x1000FFFF这段区间,所以用上面的判断APP区是否有程序。还有一个APP程序文件数据的接收问题,这个我没留着下面说,再来说说APP程序。APP程序也和正常的程序一样写,这里只要注意一下几点就可以了:
    1. 在keil的Target选项中把IROM地址设置好,我的APP要运行在0x00010000起始处,所以我的设置如下:
    16.png 这个要和IAP程序中设置的APP程序起始地址一样。同时在main函数的开始处进行中断向量表偏移设置: 17.png APP程序设置好了编译一下,发现可能编译后并不能生成.bin文件,很奇怪,后来在网上看到需要在Target选项中的Asm定义NO_CRP,这个NO_CRP是NXP特有的一段flash加密程序,在启动文件中有如下对应: 18.png 具体的还是百度吧!
    好了最后说一下IAP中接收APP程序文件的事,标准的IAP下载中有很多协议用来接收bin文件数据,最典型的是Xmodem、Ymodem、Zmodem,我这里用的是1K-Xmodem,也有人叫做Ymodem,他的接收是这样的,首先mcu先发送一个字符‘C’,告诉上位机mcu使用CRC16来校验接收到的数据,然后上位机接收到字符‘C’后开始下发1KB数据+3Byte报头+2Byte CRC校验,mcu接收到数据包后进行数据校验如果校验正确则把1KB数据写到APP的起始地址也就是上面我们的0x00010000处,并回复上位机ACK表示数据接收完成并校验正确,然后上位机接收到ACK再发下一包数据,如果mcu接收校验错误则回复NAK,上位机接收到NAK后重发上一包数据…,最后上位机发送数据结束后发送一个EOT表示数据包发送结束完成。具体细节看程序吧!下面附上我用Qt写的IAP上位机:
    19.png and 20.png
    这个是IAP程序:
    LPC1788_IAP.rar (6.29 MB, 下载次数: 1523)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-12-9 21:07:55 | 显示全部楼层
    对了,之前说过一个问题,关于bin文件的数据问题:
    我们知道一段程序中text段、constdata段和conststring段数据是放到mcu内存中的程序存储区即ROM中,而data段和bss段是放在MCU内存中的静态存储区中即SRAM,那么在IAP下载时就会有一个疑问了:IAP下载的是bin文件,而bin文件是有hex文件转过来的,在我们打开hex文件时根据地址可以看到hex文件中并没有包含SRAM中的地址及数据啊!那么程序中的bss段或data段是不是没有被拷贝到内存中哪?

    答案显然不是这样的:keil中生成的hex或bin文件中其实有包含data段数据在ROM中的: data段数据其实保存在代码段的最后面,当IAP下载后再有编译器把这段data段数据搬到内存上的,其中我们是看不到用户代码的体现。而bss段因为是未初始化的全局变量和未初始化的局部变量,所以这里没有数据搬运,只是压栈在这里,并预留了变量的空间在这里。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-10-24 08:34
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    9

    主题

    104

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    337
    最后登录
    2021-2-26
     楼主| 发表于 2016-12-9 21:20:00 | 显示全部楼层
    最后本打算上传几张调试图片来着,竟然不合法,算了吧
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2017-10-15 13:16
  • 签到天数: 191 天

    连续签到: 1 天

    [LV.7]常住居民III

    11

    主题

    664

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1722
    最后登录
    2017-10-15
    发表于 2016-12-10 00:26:22 | 显示全部楼层
    谢谢分享                  
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-5-29 08:54
  • 签到天数: 2992 天

    连续签到: 8 天

    [LV.Master]伴坛终老

    45

    主题

    5548

    帖子

    22

    金牌会员

    Rank: 6Rank: 6

    积分
    12035
    最后登录
    2025-5-29
    发表于 2016-12-10 00:52:35 | 显示全部楼层
    谢谢分享。
    签到签到
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2025-1-21 08:52
  • 签到天数: 861 天

    连续签到: 1 天

    [LV.10]以坛为家III

    75

    主题

    2523

    帖子

    24

    金牌会员

    Rank: 6Rank: 6

    积分
    5867
    最后登录
    2025-1-22
    发表于 2016-12-10 14:26:07 | 显示全部楼层
    谢谢分享,这个必须顶
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-1-18 20:00
  • 签到天数: 45 天

    连续签到: 1 天

    [LV.5]常住居民I

    17

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    533
    最后登录
    2024-11-23
    发表于 2016-12-10 15:23:16 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    该用户从未签到

    1

    主题

    4

    帖子

    0

    新手上路

    Rank: 1

    积分
    33
    最后登录
    2018-1-21
    发表于 2018-1-9 14:48:18 | 显示全部楼层
    这个帖子过去这么长时间了,不知道还有没有人看到在这里交流,我昨天烧写LPC1778 改了图片上的几个地方;现在mcu启动不起来,jlink烧写器都识别不到芯片了,有没有人遇到过相同的问题,最后是怎么解决的,希望有人告知,谢谢!
    romaddress.png
    sct.png
    down.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2021-4-7 09:48
  • 签到天数: 446 天

    连续签到: 1 天

    [LV.9]以坛为家II

    3

    主题

    982

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    1865
    最后登录
    2021-4-7
    发表于 2018-2-6 09:28:45 | 显示全部楼层
    厉害,赞一个
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-11-29 15:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    3

    主题

    19

    帖子

    1

    注册会员

    Rank: 2

    积分
    72
    最后登录
    2023-1-10
    发表于 2019-5-21 11:17:50 | 显示全部楼层
    感谢楼主,每个点都讲的很清楚!其中我也踩过很多坑,早点看到你这篇文章就好了!
    但是还有一点,是我近期才遇到的。那就是APP的MAIN函数第一行为什么还要加SCB->VTOR = 0x10000 & 0x1FFFFF80;这么一句?
    我之前在LPC1758上没有加这一句用的好好的,跑FreeRTOS和裸机都没问题,现在用LPC1778,发现系统滴答定时器没法用,所以运用程序的FREERTOS跑不起来,但是跑其他东西都没问题。按照楼主写的在APP的main第一行加了这句就都正常了。为什么啊
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-12 17:39 , Processed in 0.123251 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表