微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

EZBL_EraseAll或EZBL_NVMKEY在mplab x IDE版本5.4中不起作用

如何解决EZBL_EraseAll或EZBL_NVMKEY在mplab x IDE版本5.4中不起作用

我有一个适用于mplab x IDE v4.2的引导加载程序已有多年了。它与XC16 1.35一起编译。

我们正在更新它,以用于MPalb x IDE v5.40。通过创建ezbl示例并将文件替换为4.2版中的代码,我能够做到这一点。

我必须对某些文件进行少量更改(只有很少的未定义端口未在最新版本中定义)。

我的引导程序在SD内存中搜索固件更新,并将其刻录到闪存中。正如我所说的那样,这段代码在4.2中可以正常工作

这里的问题是EZBL_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

写操作也不起作用

某些扇区在显示读取时为FFFF,特别是最后一个扇区,而写入操作则不会对其进行修改

EZBL_NVMKey设置为0xFC21

好吧,我想知道为什么即使在XC16和XC16中都使用相同的代码时,相同的代码仍适用于4.2版本而不适用于5.4版本。

我的一些日志:

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.)

谢谢。

解决方法

最后,我能够修复它。我将把这个答案作为有关ezbl项目步骤的小指南。

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

即使将编译器为相同版本(1.35)和ezbl也为相同版本(2.11)时,将版本4.2更改为版本5.4,您都需要特别注意“硬件初始化程序”文件夹的文件。

我对其进行了更改,并将值设置为与先前版本相同的值,但是没有起作用。我以代码-24和-25退出。

另一个重要的事情是正确执行所有ezbl步骤,稍后我将对其进行评论。

您需要在设备的“硬件初始化程序文件夹”中打开正确的文件,在我的情况下为pic24j256gb410_explorer_16.c

第一件重要的事情.. FCY速度,在这里,我具有样本的默认速度(16m)。如果将其设置为错误,则会在最终应用程序中看到串行端口以不同的速度(比预期的速度快4倍)传输,而不是在引导加载程序中传输。即使您设置了错误的FCY速度,Bootloader的串行速度也将起作用。

//#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_SET_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),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),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),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),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),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),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),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),keep
.pword      0x000003,0xFFFFFF                                                              /* 0x801800 ......                   */
.popsection

如果将其设置为引导加载程序,它将对引导加载程序有效,但不适用于最终应用程序,并且int会在验证过程中失败。

最后一个也是最困难的问题之一(在这种情况下,我认为这是一个错误)是这些配置标志行中的第一条。

我在上一个项目中使用过

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

但是这为FSEC配置寄存器生成了与previouis版本不同的值,我不记得该值,它以0x8开头...,这里的问题是引导加载程序正在寻找不同的值,并且我得到-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)

将_FSEC的配置标志强制为正确的值和所需的值。我不知道为什么这个版本给我的价值不同于4.2版本。

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

.merge.s文件进入源文件,.merge.gld文件进入链接器文件。

非常重要。如果更改引导加载程序文件,则需要再次编译最终应用程序。就我而言,它包括更多步骤,因为更新是通过SD卡完成的,所以我不得不编译最终的应用程序并将其复制到SD,这是我遇到的主要错误之一,我向引导加载程序提供了引导加载程序文件的不兼容版本(即使哈希值是相同的,因为哈希是通过ezbl_boot.mk的第一行生成的),并且在更改代码时它不会更改,但是最终的引导加载程序文件将有所不同。

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

当引导加载程序文件不同时,引导加载更新过程中的验证过程将失败。

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

注意:在我的原始帖子中,我说的是关于nvmkey或擦除全部的信息,我完全错了...

正如我所说的那样,在刷新时首先要检查文件是否正确,因此启用调试时会在刷新过程中遇到很多错误,因为它没有在刷新地址,然后读取的值始终为0xFFFF。验证完成后,实际过程将开始。这是它无法失败的地方,如果失败,则可能是混合了引导加载程序版本,或者配置位有问题(最终应用程序可能工作正常)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。