代码之家  ›  专栏  ›  技术社区  ›  hamboy75

EZBLèu EraseAll或EZBLèNVMKEY在mplab x IDE版本5.4中不工作

  •  0
  • hamboy75  · 技术社区  · 4 年前

    我有一个引导程序为MPLABxIDEV4.2工作了多年。它是用XC16 1.35编译的。

    我们正在更新它,以便在MPalb x idev5.40上使用。我已经能够通过创建一个ezbl示例并用我的4.2版代码替换这些文件来实现这一点。

    我的引导程序在SD内存中搜索固件更新并将其烧录到flash中。正如我所说的,这段代码在4.2中运行得非常好

    这里的问题是EZBLèu EraseAll并没有删除5.4版中的闪存。如果我把它设置为详细模式,我会得到:

     Write: 002198  9059FE DD19C8 710083 90610E
             0021A0  514F8A 360003 400408 488489 37FFE9 BE050C 97B60F 97B69F
             0021B0  EF6870 20A9C2 97B03F 97B0CF 07337D E00400 3A0003 EFA850
      Read:  002198  320009 B2C206 3A000A 200045
             0021A0  FB8039 32010A 2006C6 E10406 3A0004 200025 B00065 FB8039
             0021B0  320103 B2C250 320024 B2C460 3200E3 781F88 E9040F B001CF
      Write: 0021C0  EF2852 37009B 97B03F 97B0CF 884280 884291 560661 5E86E0
             0021D0  97B0DF 660201 97B16F 668002 EB0080 DD01C0 200002 B82061
             0021E0  710100 718181 90602E 504FE3
                                                   MISMATCH (program and erase restricted; bootloader mismatch)
      Write: 0021C0  EF2852 37009B 97B03F 97B0CF 884280 884291 560661 5E86E0
             0021D0  97B0DF 660201 97B16F 668002 EB0080 DD01C0 200002 B82061
             0021E0  710100 718181 90602E 504FE3
      Read:  0021C0  B2C3B0 320073 B2C200 32006F B2C0D0 32002E B2C110 320019
             0021D0  B2C0D0 320017 B2C190 320069 B2C1F0 320067 B101CF 78044F
             0021E0  B2C1C0 3200AC B2C1D0 3200D3
      Write: 0021E8  3A001A 20A9C0 97E9EF 797003
             0021F0  97B80F 2FF004 97B2FF 620205 EB0280 DD2B48 DE2248 730204
             002200  DE2AC8 20A9D1 78F104 E80081 797080 20F001 600001 B80261
                                                                               MISMATCH (program and erase restricted; bootloader mismatch)
      Write: 0021E8  3A001A 20A9C0 97E9EF 797003
             0021F0  97B80F 2FF004 97B2FF 620205 EB0280 DD2B48 DE2248 730204
             002200  DE2AC8 20A9D1 78F104 E80081 797080 20F001 600001 B80261
      Read:  0021E8  B2C080 3200D8 B2C030 3200D6
             0021F0  B2C200 3200D4 B2C220 3200D2 B2C200 3200D0 3700D4 E80408
             002200  37FF6C A6F01A 37000B 2002D7 786C07 200010 550385 EA8BD7
      Write: 002210  DD2BC8 DE2248 738204 DE2AC8 20A9F0 787104 370069 504FE2
             002220  3A000E 20A9C0 97E8EF 797001 2FF004 97B1FF 620203 EB0280
             002230  DD2B48 DE2248 730204 DE2AC8
    

    好吧,我想知道为什么同样的代码适用于4.2版而不适用于5.4版,即使编译器在这两种情况下都是XC16。

    我的一些日志:

    NVMKEY = 0xFC21
    NVMKEY before erase = 0xFC21
    Erasing ... done
    Terminating: code = 0xFFE8
    EZBL_Install_SPI_FILE2Flash (hard): -24 EZBL_ERROR_HARD_VERIFY_ERROR: Bootloader read-back verification failure.)
    

    提前谢谢。

    0 回复  |  直到 4 年前
        1
  •  0
  •   hamboy75    4 年前

    我终于修好了。我将使这个答案与ezbl项目的步骤小指南。

    我在这里评论这个答案,因为它将对其他人有用。

    当您将4.2版更改为5.4版时,即使编译器是同一版本(1.35)并且ezbl也是同一版本(2.11),您也需要特别注意“hardware initializers”文件夹中的文件。

    我修改了它,并将值设置为与以前版本相同的值,但它不起作用。我带着-24和-25离开了。

    另一个重要的事情是正确地遵循所有的ezbl步骤,我稍后会对它们进行评论。

    在我的例子pic24j256gb410\u explorer\u 16.c中,您需要打开设备的“硬件初始化器文件夹”中的正确文件

    //#define FCY         16000000ul      // Changing this automatically changes the PLL settings to run at this target frequency
    #define FCY          4000000ul
    

    另一个重要的细节是,将串行速度设置为正确的速度。

    const long EZBL_COMBaud = 115200;
    

    顺便说一句,如果你使用某些微控制器,一些引脚用于默认文件的例子不存在。小心。

    EZBL_SET_CONF(_FSEC, BWRP_OFF & BSS_OFF & BSEN_OFF & GWRP_OFF & GSS_OFF & CWRP_OFF & CSS_DIS & AIVTDIS_DISABLE)
    EZBL_SET_CONF(_FOSCSEL, FNOSC_FRC & PLLMODE_PLL96DIV2 & IESO_OFF)
    EZBL_SET_CONF(_FOSC, POSCMOD_XT & OSCIOFCN_ON & SOSCSEL_ON & PLLSS_PLL_PRI & IOL1WAY_OFF & FCKSM_CSECME)
    EZBL_SET_CONF(_FWDT, WDTPS_PS1024 & FWPSA_PR32 & FWDTEN_SWON & WINDIS_OFF & WDTWIN_PS75_0 & WDTCMX_LPRC & WDTCLK_LPRC)
    EZBL_SET_CONF(_FPOR, BOREN_ON & LPCFG_ON)
    EZBL_SET_CONF(_FICD, ICS_PGx2 & JTAGEN_OFF & BTSWP_ON)
    EZBL_SET_CONF(_FDS, DSWDTPS_DSWDTPS0D & DSWDTOSC_LPRC & DSBOREN_ON & DSWDTEN_ON)
    EZBL_SET_CONF(_FDEVOPT1, ALTCMPI_DISABLE & TMPRPIN_OFF & TMPRWIPE_OFF & ALTVREF_ALTVREFDIS)
    

    您需要再次在这个文件中为您的项目设置配置位。

    为什么要用EZBL\u set\u CONF设置它们?因为这些配置字节将包含在生成的.merge.s文件中,并告诉并强制最终应用程序中的链接器使用它们。

    ; Bootloader code block intended for program region 'FSEC'
    ; 0x02AF80 to 0x02AF84, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FSEC, address(0x02AF80), code, keep
    .pword      0x00FFFF, 0xFFFFFF                                                              /* 0x02AF80 ......                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FOSCSEL'
    ; 0x02AF98 to 0x02AF9C, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FOSCSEL, address(0x02AF98), code, keep
    .pword      0x0000F8, 0xFFFFFF                                                              /* 0x02AF98 ......                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FOSC'
    ; 0x02AF9C to 0x02AFA0, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FOSC, address(0x02AF9C), code, keep
    .pword      0x00001B, 0xFFFFFF                                                              /* 0x02AF9C ......                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FWDT'
    ; 0x02AFA0 to 0x02AFA4, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FWDT, address(0x02AFA0), code, keep
    .pword      0x004BDF, 0xFFFFFF                                                              /* 0x02AFA0 .K....                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FPOR'
    ; 0x02AFA4 to 0x02AFA8, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FPOR, address(0x02AFA4), code, keep
    .pword      0x000001, 0xFFFFFF                                                              /* 0x02AFA4 ......                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FICD'
    ; 0x02AFA8 to 0x02AFAC, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FICD, address(0x02AFA8), code, keep
    .pword      0x000081, 0xFFFFFF                                                              /* 0x02AFA8 ......                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FDS'
    ; 0x02AFAC to 0x02AFB0, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FDS, address(0x02AFAC), code, keep
    .pword      0x0080DF, 0xFFFFFF                                                              /* 0x02AFAC ......                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FDEVOPT1'
    ; 0x02AFB0 to 0x02AFB4, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FDEVOPT1, address(0x02AFB0), code, keep
    .pword      0x00001E, 0xFFFFFF                                                              /* 0x02AFB0 ......                   */
    .popsection
    
    ; Bootloader code block intended for program region 'FBOOT'
    ; 0x801800 to 0x801804, length 0x000004 (6 bytes; needs 0 pages)
    .pushsection    EZBL_BTLDR_CONFIG_WORD_FBOOT, address(0x801800), code, keep
    .pword      0x000003, 0xFFFFFF                                                              /* 0x801800 ......                   */
    .popsection
    

    如果将其设置为bootloader,它将对bootloader有效,但对最终应用程序无效,并且int将在验证过程中失败。

    最后一个也是更难的问题之一(在本例中,我认为这是一个bug)是这些配置标志行中的第一行。

    在我以前的项目中

    EZBL_SET_CONF(_FSEC, BWRP_OFF & BSS_OFF & BSEN_OFF & GWRP_OFF & GSS_OFF & CWRP_OFF & CSS_DIS & AIVTDIS_DISABLE)
    

    但是这为FSEC config register生成了一个不同于previouis版本的值,我不记得这个值了,它是从0x8开始的…,这里的问题是bootloader在寻找一个不同的值,如果我没有错的话,我得到了-25退出代码。

    #define EZBL_DEBUG     // Uncomment to allow debugging messages to be printed to stdout
    #define VERBOSE        // Uncomment to have verbose printing of all flash write commands and data
    

    重要的是,默认情况下,ezbl在不修改内存的情况下尝试引导加载过程(以查看导入的文件是否正确),然后刷新它。因此,在调试模式下,您将看到该文件在应用程序内存地址的第一步失败(引导加载程序地址必须正确,否则您使用的引导加载程序文件错误)。

    经过多次尝试后,我将该行改为:

    EZBL_SET_CONF(_FSEC, 0xFFFF)
    

    当您能够编译项目时,它将生成一个.merge.s文件和一个合并.gld文件。您必须知道,您需要在最终项目中使用这些文件。

    .merge.s文件转到源文件,然后返回。合并.gld转到链接器文件。

    非常重要。如果你改变引导程序文件,你将需要再次编译最终的应用程序。在我的例子中,它包含了更多的步骤,因为更新是通过SD卡完成的,所以我必须编译最终的应用程序并将其复制到SD,这是我遇到的主要错误之一,我向引导加载程序提供了一个不兼容版本的引导加载程序文件(即使哈希相同,因为散列是用ezbl的第一行生成的_启动.mk)当您对代码进行更改时,它不会更改,但最终的引导加载程序文件会有所不同。

    BOOTID_VENDOR = "xxxxx"
    BOOTID_MODEL  = "xxxx"
    BOOTID_NAME   = "12/11/2020"
    BOOTID_OTHER  = "GA410-GA406"
    

    所有这些都是最重要的问题和需要注意的事情。如果我记得更多,我会编辑和添加它们。

    正如我所说的,闪烁的第一步是验证文件是否正确,所以当启用调试时,在闪烁过程中会出现很多错误,因为它不闪烁地址,然后读取总是0xFFFF。验证完成后,真正的过程将开始。这里是它不能失败的地方,如果它失败了,那么您可能混合了引导加载程序版本,或者您的配置位有问题(最终的应用程序可能会正常工作)。

    推荐文章