我有一个为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
好吧,我想知道为什么相同的代码适用于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.)
提前谢谢。
我终于修复了它。我将把这个答案作为ezbl项目的小指南。
我在这里评论这个答案是因为它将对其他民族有用。
当您将版本4.2更改为版本5.4时,即使编译器是同一版本(1.35),ezbl也是同一版本时(2.11);硬件初始化器";文件夹
我更改了它,并将值设置为与以前版本相同的值,但它不起作用。我退出时的代码是-24,也有-25。
另一件重要的事情是正确遵循所有ezbl步骤,我稍后会对它们进行评论。
您需要在"中打开正确的文件;硬件初始化器文件夹";对于您的设备,在我的情况下为pic24j256gb410_explorer_16.c
第一件重要的事。。FCY速度,这里我有默认的样本速度(16m)。例如,如果你设置错误,你会看到串行端口以不同的速度传输(比预期快4倍),但在最终应用程序的引导程序中没有。引导程序串行速度将工作,即使您设置错误的FCY速度。
//#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), 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将在验证过程中失败。
最后也是最困难的问题之一(在这种情况下,我认为这是一个错误)是这些配置标志行中的第一行。
在我以前的项目中,我使用
EZBL_SET_CONF(_FSEC, BWRP_OFF & BSS_OFF & BSEN_OFF & GWRP_OFF & GSS_OFF & CWRP_OFF & CSS_DIS & AIVTDIS_DISABLE)
但这为FSEC配置寄存器生成了一个与以前版本不同的值,我不记得这个值,它以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.gold转到链接器文件。
非常重要。如果您更改了引导程序文件,您将需要再次编译最终的应用程序。在我的情况下,它包括了更多的步骤,因为更新是通过SD卡完成的,所以我必须编译最终的应用程序并将其复制到SD,这是我的主要错误之一,我向引导加载程序提供了一个不兼容版本的引导加载程序文件(即使哈希是相同的,因为哈希是用ezbl_boot.mk的第一行生成的),当你对代码进行更改时,它不会改变,但最终的引导加载程序文件会有所不同。
BOOTID_VENDOR = "xxxxx"
BOOTID_MODEL = "xxxx"
BOOTID_NAME = "12/11/2020"
BOOTID_OTHER = "GA410-GA406"
当引导程序文件不同时,验证过程将在引导程序更新过程中失败。
所有这些都是最重要的问题和需要注意的事情。如果我记得更多,我会编辑并添加它们。
注意:在我最初的帖子中,我认为这是关于nvmkey或擦除的,我完全错了。。。
正如我所说,闪烁的第一步是验证文件是否正确,所以当调试启用时,你会在闪烁过程中遇到很多错误,因为它没有闪烁地址,然后读取总是0xFFFF。验证完成后,将开始真正的过程。这是它不能失败的地方,如果失败了,那么你可能混合了引导程序版本,或者你的配置有问题(最终的应用程序可能会正常工作)。