问题描述
在使用NXP RT10xx系列的童鞋,会经常遇到在某次下载SpiFlash代码后,再次Debug就连不上,提示下方:
这时IAR无论如何也连接不上板子了,通Jflash连接,也会提示DAP Register Failed, 初次遇到会误认为硬件坏掉了。。
。
解决
解决方法有两种:
一、通过 清空Memory(需更改BootMode)
1、更改BootMode,这里我用的RT1060,所以讲开发板将开发板的SW17更改为Serial 模式:
SW7 to “1-OFF, 2-OFF, 3-OFF, 4-ON”.:
2、通过IAR打开一个NXP SDK工程,并切换Debug模式,然后清空Memory
这里随便选择一个Led_Blinky的工程,点击Erase Memory
注意要选择Debug Configuration
3、Erase后,将开发板SW7拨回正常启动(Internal Boot)
SW7 to “1-OFF, 2-OFF, 3-ON, 4-OFF”.:
最后就发现IAR可以正常连接调试了:
BootMode如下
二、通过MCUBootUtility烧写/下载任一程序,如LedBlinky:
- 下载MCUBootUtility: https://github.com/JayHeng/NXP-MCUBootUtility/releases
- 将EVK board SW7改为Serial :
3. 下载后在NXP-MCUBootUtility/Bin中打开NXP-MCUBootUtility.exe ,然后根据使用的硬件,选择MCU Device、Boot DeviceConfiguration、BootType、
4.点击Connect to ROM/Reset Device连接,连接后选中Borwse打开编译好的Hex/bin (如打开文件里包含测试用的LedBlinky固件)最后点击上方All-in One Action烧写程序到单片机
具体使用可参见https://github.com/JayHeng/NXP-MCUBootUtility
根本原因
原因也有多种:
- 一种是由于Jlink来不及在程序跑飞前连接MCU
在 Flash-XIP代码跑飞后,Jlink在Reset后Code会立即运行,所以无法进行连接(跑飞的原因有多种,如硬件配置、野指针、初始化失败、代码bug等)
- 另一种是由于写入的程序FCDB和BootHeader有误,导致Bootloader无法正确引导启动
这种情况需要检查下BootHeader的Macro是否开启:
将XIP_BOOT_HEADER_ENABLE设为0,即不需要生成包含i.MXRT加载启动文件头的image;
如果为1,那么生成的可执行image文件会包含i.MXRT加载启动文件头,生成的image也可叫做Bootable image,即能被BootROM正确加载启动的image
一般XIP(eXecute In Place,如flash)中的image,都要定义:
XIP_EXTERNAL_FLASH=1
XIP_BOOT_HEADER_ENABLE=1
这样BootROM才能在flash中加载application到RAM/XIP执行