查看: 1615|回复: 0

LPC800的HEX文件下载到芯片中却无法运行是怎么回事?

[复制链接]
  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3300

    主题

    6547

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32032
    最后登录
    2024-4-26
    发表于 2019-9-26 09:36:55 | 显示全部楼层 |阅读模式
    @ HEX文件下载中遇到的问题

    在调试LPC800芯片时,有些用户发现,在MDK中当生成一个HEX文件,然后通过离线编程器或串口方式下载到芯片中,却无法将芯片运行起来。
    还有一些用户发现,在MCUXpresso中调试LPC8N04时,以前可以用的HEX文件,在换了一块新板子后程序也会运行不起来。这是怎么一回事呐?
    下面就通过一些分析来对这些现象作一下解释,并介绍一些解决的方法。

    @ 有效用户代码

    要搞清楚这个问题,先得普及一下“有效用户代码”的知识。

    LPC800芯片在上电后,进入上电引导过程,引导加载程序会检查闪存扇区0中是否存在有效用户代码。有效用户代码的判定标准如下:
    Cortex-M0+的向量表中,异常向量位置7(向量表中的偏移量0x0000 001C),应包含向量表中条目0到6的校验和的二进制补码,在下文中我们将把这个二进制补码称为有效用户代码判定字。
    这将使向量表中头8个条目(0到7)的校验和为0。
    上电后,引导加载程序会计算闪存扇区0的前8个位置(word)的校验和,如果结果为0,则判定用户代码为有效用户代码,执行控制会被转交到用户代码。如果结果不为0,则判定用户代码为无效用户代码,引导加载程序会启动自动波特率通信程序,通过串口USART0与主机进行通信。
    而我们仔细分析无法运行的HEX文件就会发现,在这些HEX文件中都缺少有效用户代码判定字,从而导致芯片在上电引导时,无法跳转到用户代码。
    用户开发调试LPC800代码时,一般会使用三种比较通用的开发环境:IAR、MDK和MCUXpresso。其中在IAR开发环境中,当产生HEX文件时,会自动将有效用户代码判定字添加到HEX文件中,因此不存在这个问题。而MDK和MCUXpresso这两种环境,都不会将有效用户代码判定字添加到HEX文件中,因此需要进行手动的添加。

    @ 在MDK开发环境中的解决办法

    1)手动添加法:

    在MDK开发环境中,用户一般会参照NXP推荐的SDK和CODE BUNDLE两种代码体系来进行开发,在这两种体系中都需要手动地添加有效用户代码判定字到HEX文件中。

    方法如下:首先进入“Options for target”界面,然后进入“User”, 加入用户命令#1如下:

    $K\ARM\BIN\ELFDWT.EXE !L BASEADDRESS(0x00000000)

    提示:左右滑动上面命令行,可查看完整内容。
    如下图所示:
    29.png
    加入这条用户命令后,再次编译时,编译输出窗口会输出有效用户代码判定字
    如下图所示:
    30.png
    然后将得到的有效用户代码判定字,手动添加到Keil_startup.s文件中向量表的0x0000 001C位置处。
    如下图:
    31.png

    添加完成后,就会在产生HEX文件时,将有效用户代码判定字加入。

    2)自动添加法

    在MDK最近一些的版本,(例如最新的MDK5.28版本),可使用如下方法来自动将有效用户代码判定字加入Hex文件中。
    但对一些KEIL老版本的开发环境,这个方法不适用,可参考本站另一篇介绍文章《LPC技术小贴士—自动添加中断向量校验位》。
    这个自动方法如下:
    进入“Options for target”界面,然后进入“User”, 加入用户命令#1如下:

    $K\ARM\BIN\ELFDWT.EXE !L BASEADDRESS(0x00000000)

    然后再加入用户命令#2如下:

    $K\ARM\ARMCC\BIN\fromelf.exe --i32 --output=xxx.hex  .\Objects\xxx.axf

    其中xxx是文件名,代表用户当时自己取的HEX文件名,后面那个xxx.axf也是用户再建工程时自己取的文件名。

    添加完成后,在编译时,会自动将有效用户代码判定字加入HEX文件。
    @ 在MCUXpresso开发环境中的解决办法

    在MCUXpresso开发环境中有一个专门的API可以产生有效用户代码判定字:
    __valid_user_code_checksum
    如果用户开发的LPC800芯片系列有相应的SDK代码,则不会有这个问题,因为在SDK MCUXpresso的代码中已经在向量表0x0000 001C位置处调用了这个API。
    如下图所示:
    32.png
    @ LPC8N04的特殊处理

    而对于LPC8N04这颗芯片,由于它没有相应的SDK代码,用户的开发代码来源就比较多样化,就会产生这类问题。

    LPC8N04目前在市场上共有两种版本的芯片,老的版本芯片使用的bootloader版本号为Version 0.12,新的版本芯片使用的bootloader版本号为Version 0.14。这两种版本在针对有效用户代码判定的使用上是有区别的,Version0.12无需进行有效用户代码的判定,而Version 0.14则需要进行有效用户代码的判定。因此如果用户把在老版本芯片上开发成功的代码拿到新版本芯片上去运行,就会产生问题,导致下载到芯片中HEX文件无法运得,因此用户在使用LPC8N04芯片时得多加留意芯片的版本号。
    遇到这类问题的解决方法就是将这个API手动添加到向量表0x0000 001C位置处,添加完成后,会在产生HEX文件时,将有效用户代码判定字加入。




    作者:谢瑜          文章出处:恩智浦MCU加油站


    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-4-27 04:14 , Processed in 0.119793 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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