查看: 2934|回复: 0

使用blhost烧写其它板载Flash

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

    [LV.8]以坛为家I

    3309

    主题

    6558

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32140
    最后登录
    2024-5-9
    发表于 2021-4-22 09:41:03 | 显示全部楼层 |阅读模式
    使用blhost烧写其它板载Flash

    小编最近在支持客户,使用blhost配合flash loader,通过USB HID方式进行固件更新时发现,除了reset命令,execute命令同样可以运行固件程序。


    通过和其他同事沟通,大家对execute命令的总体感觉是,参数多且不清楚如何设置这些参数,因而无法使用。
    经过研究和实践,小编找到execute命令参数的设置方法,并通过execute命令运行存储在LPC54018M SPIFI Flash的固件程序。小编决定把自己的发现记录下来和小伙伴们分享。


    一、blhost是什么


    相信很多使用过恩智浦LPC系列和Kinetis系列MCU的小伙伴,对blhost应该不是很陌生。考虑到还有第一次接触blhost的小伙伴,小编对它先做一个简单的介绍,让刚接触它的小伙伴有个初步的认识。当然,如果有介绍不到位的,望指正。
    blhost是一款运行于PC端的应用软件,支持Windows、Linux (X86-based)、Mac-OSX, 和Linux (Arm-based)多个平台。
    blhost同时也是一款基于命令行的工具,通过向运行有flashloader的恩智浦MCU发送命令,可以实现Flash擦除、读取和写入操作,可以实现固件更新,可以复位MCU以重新运行固件,也可以通过execute命令在不复位MCU的情况下,运行预置于MCU片内Flash、片内RAM或者其他支持XIP功能的片外存储器的固件。


    二、Flash loader是什么


    flash loader是NXP MCU bootloader的一种实现方式,与运行于PC端的工具blhost配合实现对Flash存储器的读、写、擦除操作。


    Flash loader具有如下特点:
    ·基于RAM,不需要额外占用Flash存储空间
    ·系统掉电后丢失,在与blhost配合对Flash存储器进行读、写、擦除之前,要预先将其下载到RAM中并运行
    ·支持SPI slave,I2C slave,UART,USB HID, CAN多种接口

    三、execute命令支持


    blhost中的execute命令用于跳转到指定地址执行代码,并且跳转后不返回bootloader。


    这个命令的有关细节如下图所示。参数arg通过R0寄存器传递给被调用代码;参数stackpointer用于设置主堆栈指针(MSP)和进程堆栈指针(PSP)。stackpointer可以设置为0,但前提是被调用代码在使用栈之前要设置主堆栈指针(MSP)和进程堆栈指针(PSP)。
    11.png
    Fig1 execute命令

    四、设置execute的关键参数


    事实上,blhost用户指南对execute命令的参数说明算是比较详细了。然而,我该如何设置这些参数运行自己的程序呢?小编带大家来一探究竟。


    其实,在使用execute命令运行固件程序之前,用户应该通过PC端的集成开发环境,如Keil、IAR,编译生成固件程序的可执行文件。然后,再将可执行文件烧写到指定地址的存储器中。


    为什么我提到固件程序的可执行文件呢?因为这条指令的关键参数address和stackpointer就可以从可执行文件中获得。接下来,我用一个实例说明如何通过固件程序可执行文件确定参数address和stackpointer。这两个参数至关重要,如果它们错了,固件程序可就无法运行了。


    光说不练假把式,光练不说傻把式,又练又说才是真把式。接下来,我就以LPC54018M为例,讲解如何确定execute命令的参数address和stackpointer。


    参考LPC54018M用户手册(UM11155 LPC54018JxM/LPC54S018JxM User manual)第三章Chapter 3: LPC54018JxM Boot ROM for non-secure devices有关镜像文件布局的描述。从图2和图3可以看出,无论是plainimage layout还是XIP image layout, 镜像文件中偏移地址为0开始的四个字节是stack pointer,偏移地址为4开始的四个字节是镜像执行起始地址,也就是前面提到的address。
    12.png
    Fig3 XIP Image Layout


    弄明白如何确定execute命令参数address和stackpointer之后,我们以LPC54018M SDK的hello_world_qspi_xip工程为例,说明如何使用execute命令运行固件程序。


    首先,编译生成hello_world_qspi_xip工程的可执行文件。可执行文件生成后,打开如下图所示。根据前面的描述,可执行文件偏移地址为0开始的4个字节是stackpointer, 这里是0x00030000, 偏移地址为4开始的4个字节是可执行起始地址address,这里是0x10000215。
    13.png


    Fig4 hello_world_qspi_xip可执行文件


    除了通过可执行文件获得stackpointer和可执行起始地址address,还可以通过hello_world_qspi_xip工程的map文件获取这两个参数。以Keil MDK为例,生成可执行文件的同时,会生成map文件hello_world_qspi_xip.map。


    看到这里,可能有的小伙伴会问了,这个map文件有那么多的符号,我怎么知道哪两个符号表示stack pointer和可执行起始地址address。其实,可以在LPC54018M启动文件startup_LPC54S018M.S中找到答案。打开startup_LPC54S018M.S,如下图所示。
    14.png
    Fig5 代表stack pointer和可执行起始地址address的符号


    可以看到,代表stackpointer的符号是Image$$ARM_LIB_STACK$$ZI$$Limit,代表可执行起始地址address的符号是Reset_Handler。


    打开hello_world_qspi_xip的map文件,用Image$$ARM_LIB_STACK$$ZI$$Limit和Reset_Handler进行搜索,结果如下图所示。
    15.png
    Fig7 确定可执行起始地址address



    五、让blhost支持SPIFI Flash XIP


    为了使位于SPIFI Flash中的固件程序,能够通过blhost execute命令运行,需要对flash loader工程进行修改,具体步骤如下:
    1、本文基于LPC54018M SDK 2.9.0,IDE为Keil MDK。SDK可以通过以下链接下载:https://mcuxpresso.nxp.com/en/welcome
    2、下载后解压缩,flash loader示例工程位于 :SDK_2.9.0_LPCXpresso54S018M\boards\lpcxpresso54s018m\bootloader_examples\flashloader
    3、Flash loader示例工程中,打开memory_map_LPC54S018M.c,路径为:SDK_2.9.0_LPCXpresso54S018M\middleware\mcu-boot\targets\LPC54S018M\src\memory_map_LPC54S018M.c
    4、该文件定义了LPC54S018M的存储器映射,如下图所示:
    16.png
    Fig 8 修改前的LPC54S018M存储器映射


    5、LPC54018M SPIFI Flash是支持XIP特性的,因此,上图的kMemoryNotExecutable应当修改为kMemoryIsExecutable,如下图所示:
    17.png
    Fig9 修改后的LPC54S018M存储器映射

    6、重新编译,生成可执行文件flashloader.bin,路径:SDK_2.9.0_LPCXpresso54S018M\boards\lpcxpresso54s018m\bootloader_examples\flashloader\mdk\release




    六、烧写用户固件程序


    使用blhost编程固件程序hello_world_qspi_xip.bin到LPC54S018M SPIFI Flash的步骤如下所示:


    1,下载dfu-util.exe,链接地址为http://dfu-util.sourceforge.net/releases/


    2,配置ISP引脚,然后复位芯片使芯片进入USB0 DFU引导模式
    18.png
    Fig10 LPC54S018M USB0 DFU引导模式配置

    3,将LPC54S18M评估板LPC54S018M-EVK的USB0 Full-Speed端口与PC端的USB端口相连,并在PC端打开命令行窗口并输入如下命令:


    dfu-util.exe –D flashloader.bin


    4,使用如下图所示的blhost命令将固件程序hello_world_qspi_xip.bin烧写到LPC54S018M的SPFI Flash中
    19.png
    Fig11 烧写固件程序的blhost命令

    七、使用execute运行固件程序


    在使用blhost命令烧写固件程序hello_world_qspi_xip.bin到LPC54S018M的SPIFI Flash之后,运行execute命令即可运行固件程序hello_world_qspi_xip.bin。
    20.png
    Fig12 通过execute命令运行固件程序


    固件程序hello_world_qspi_xip.bin运行之后,会在PC端串口控制台先打印”Hello world”,之后会回显用户的键盘输入。运行结果如下图所示,字符串”This is a routine which is used to test blhost execute command.”就是来自键盘的输入。
    21.png
    Fig13 固件程序在串口控制台的输出

    八、总结


    本篇小文首先简单介绍blhost工具,然后对execute命令的功能和参数进行详细说明,接着逐步分析如何确定execute命令参数stackpointer和address,最后给出使用blhost命令更新固件程序和使用execute命令运行固件程序的方法。

    签到签到
    回复

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-9 18:15 , Processed in 0.122022 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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