昨天收到了NXP的I.MX RT1050开发板,就是下图这货:
按捺不住激动的心情,想早点尝鲜,先从点灯开始,NXP官方的SDK包包含了各种例程,见下图:
找到led_output试验例程,编译,下载。调试器使用的RT1050 EVK自带的DAP仿真器,板子上的跳线帽
什么的都没有做修改,micro USB先插到J28接口上即可,结果下载失败,失败信息如下:
查找问题,发现工程没选对,下载的话是要下载到板子自带的那片死贵的hyper flash里面的,
但是led_output没有支持hyper flash的工程,这个例程只有四个针对内部RAM和SDRAM的,
见下图:
这说明这四个例程只能debug!!!,不能download,和STM32不一样,
STM32的官方例程都是可以既可以debug又可以download的,NXP的就不行,
大多数例程只能debug
这可如何是好?debug意味着掉电代码就丢失了?肯定要能下载到外面的那个
hyper flash里面的啊,最简单的方法就是找个支持heyper flash的工程:
SDK_2.3.0_EVK-MIMXRT1050\boards\evkmimxrt1050\demo_apps\hello_world,
这个hello_world例程是支持RAM,SDRAM,flash三者调试和下载的,见下图:
选择nor_release这个工程,编译、设置MDK的下载选项,也就是烧写算法,如下图:
结果依旧是下载失败,如下图:
在使用STM32的时候很少遇到这个错误,因为STM32做的太好了,一般很难遇到这种问题,
解决方法就是将烧写算法中的size改大一点,直到能够正常下载,如下图所示:
但是用此种方法直接下载例程以后还是不能够运行,这是因为没有再hyper flash 0X6000 1000
地址开始处添加Image Vector Table(IVT)信息,关于IVT的相关内容在RT1050的用户手册上的8.7章节
(就是那本3500多页的文档)有详细的讲解,见下图
从上图可以看出我们需要创建一个IVT表,IVT表中的信息按照RT1050里面的用户手册里面来写就好了,
RT-Therad的梁永祥先生提醒我说TouchGFX的RT1050例程有个IVT表,可以拿来用,此表内容如下:
/* IVT表 */
static const uint32_t _ivt[] __attribute__((at(0X60001000))) = {
0x412000D1,
0x60002000,
0,
0,
0x60001020,
0x60001000,
0,
0,
0x60000000,
0x04000000,
0,
0,
0,
0,
0,
0,
};
注意此表要的基地址要为0X6000 1000,添加此表以后通过MDK下载代码到Hyper flash中, 但是:
复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
为什么还是不能运行?!经过与梁永祥先生进一步交流,他告诉我,地址0X6000 0000开始出还需要还需要
存放512字节的数据,好吧,至于是什么数据那就不知道了,但是我们可以使用U盘模拟试验先烧写进入
一个可以执行的代码,然后再把0X6000 0000开始的512个字节的数据给读出来。将这512字节的数据做成数组,
数组如下:
/* FlexSPI nor flash 参数表*/
static const uint32_t boot_data[] __attribute__((at(0X60000000))) = {
0x42464346, 0x56010400, 0x00000000, 0x03030303, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000059, 0x01080800, 0x00000000, 0x00000000, 0x04000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x0000000F, 0x0001000F,
0x8B1887A0, 0xA7048F10, 0x00000000, 0x00000000, 0x87008700, 0x87AA8700, 0x87058700, 0x87708700,
0x8B1887A0, 0xB70B8F10, 0x0000A704, 0x00000000, 0x87008700, 0x87AA8700, 0x87058700, 0x87AA8700,
0x87008700, 0x87558700, 0x87028700, 0x87558700, 0x87008700, 0x87AA8700, 0x87058700, 0x87808700,
0x87008700, 0x87AA8700, 0x87058700, 0x87AA8700, 0x87008700, 0x87558700, 0x87028700, 0x87558700,
0x8B188700, 0x87008F10, 0x00008730, 0x00000000, 0x87008700, 0x87AA8700, 0x87058700, 0x87A08700,
0x8B188700, 0xA3808F10, 0x00000000, 0x00000000, 0x87008700, 0x87AA8700, 0x87058700, 0x87808700,
0x87008700, 0x87AA8700, 0x87058700, 0x87AA8700, 0x87008700, 0x87558700, 0x87028700, 0x87558700,
0x87008700, 0x87AA8700, 0x87058700, 0x87108700, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000102, 0x00000302, 0x00000504, 0x00000902, 0x00000B04, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000200, 0x00040000, 0x00000001, 0x00000001, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
};
上面这个数组要放到0x6000 0000开始的地方,然后重新下载代码,复位运行!成功!串口输出了hello_word:
至此,终于可以通过MDK向RT1050上的那篇死贵的hyper flash下载代码了,而且下载完以后可以掉电复位运行。
那这512字节的参数哪里有说明呢?有的需要阅读RT1050用户手册的8.6.1.2章节,里面有详细的说明如果使用
Flex SPI nor flash的话需要在flash的前512个字节存放flash的配置参数,见下图:
但是这512字节的参数改怎么写呢?继续看资料吧,RT1050用户手册的8.6.3章节就是讲解的这512字节
的具体含义了,如下图所示:
从上图可以看出地址偏移0开始的地方存放的数据是0X4246346,而我们上面设置的boot_data[]数组
的第一个数据正是0X4246346!其它的数据对应的看RT1050用户手册的8.6.3章节就行了,至此MDK
如何向RT1050 EVK开发板的外置hyper flash下载数据并且可以正常运行就解决了!
总结一下:
1、I.MX RT1050是由I.MX 6UL欢心(A7换成M7)而来的,因此A7上的内部bootloader保留了下来,
RT1050支持多种boot device就是这个内部bootloader来支持的(猜测,没用过A7),这样的结果就是
不能像STM32一样拿到例程就可以直接编译、下载、复位云心。I.MX RT1050因为是要下载外部的
hyper flash中的,因此MDK要先有hyper flash烧写算法,这点MDK已经支持了。
2、光有烧写算法还是不行的,根据I.MX RT1050的用户手册得知还需要在hyper flash的指定地址存放一些
数据用来描述代码的一些信息,这点和我用过的S5PV210一样,S5PV210如果从SD卡启动的时候是需要
在bin文件前面添加16个字节(应该是16个字节,年久已经忘记了,反正是要添加头信息)的头信息。
3、RT1050的代码要想下载到外部hyper flash中并且可以在复位后正常运行,0x6000 0000和0x6000 1000这
两个地址开始出的那个512 Bytes flexSPI flash的配置参数信息和64 Bytes IVT表都不能少。