本帖最后由 zuozhongkai 于 2017-12-5 17:37 编辑
第一次更新 2017/12/04
昨天收到了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的下载选项,也就是烧写算法,如下图:
结果依旧是下载失败,如下图:
说是烧写算法有问题,没找到解决方法,在网上问了其它的网友,也是在用MDK下载的时候遇到过各种问题,而且即使用MDK下载成功以后板子重新上电以后代码也不能运行,不知道为何?看来直接通过MDK向hyper flash是不行了,但是代码还是要下载的啊?结果在例程的readme中看到也可是使用另外一种方法下载,
那就是直接将生成的bin文件拖到开发板模拟出来的U盘里面,就是下面模拟出来的这个U盘:
测试了一下,这个果然可以,所以总结一下,RT1050 EVK开发板在MDK下的代码调试和下载的方法:
1、NXP提供的所有的例程都可以debug,所以在调试的时候要选择debug而不是down。
2、我这里测试MDK是不能下载到hyper flash中的,要将生成的bin文件拖到开发板模拟出来的U盘中才行。
3、以上结论是本人实测的结果,不排除电脑因素的影响,如果有其它朋友有测试出来的好的方法的话欢迎留言。
第二次更新 2017/12/05
1、上面说了MDK直接向RT1050 EVK开发板上的hyper flash下载数据失败的问题找到了,是个很简单的问题,还是因为STM32做的太好了,一般很难遇到这种问题,解决方法就是将烧写算法中的size改大一点,直到能够正常下载,如下图所示:
2、但是用此种方法直接下载例程以后还是不能够运行,这是因为没有再hyper flash 0X6000 1000地址开始处添加Image Vector Table(IVT)信息,关于IVT的相关内容在RT1050的用户手册上的8.7章节(就是那本3500多页的文档)有详细的讲解,见下图:
从上图可以看出我们需要创建一个IVT表,IVT表中的信息按照RT1050里面的用户手册里面来写就好了,RT-Therad的梁永祥先生(本论坛ID为:tanekliang)提醒我说TouchGFX的RT1050例程有个IVT表,可以拿来用,此表内容如下,
[mw_shl_code=applescript,true]/* IVT表 */
volatile const uint32_t _ivt[] __attribute__((at(0X60001000))) = {
0x412000D1,
0x60002000,
0,
0,
0x60001020,
0x60001000,
0,
0,
0x60000000,
0x04000000,
0,
0,
0,
0,
0,
0,
};[/mw_shl_code]
注意此表要的基地址要为0X6000 1000,添加此表以后通过MDK下载代码到Hyper flash中, 但是:复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
复位以后程序还是没有运行!!!
为什么还是不能运行?!经过与梁永祥先生进一步交流,他告诉我,地址0X6000 0000开始出还需要还需要存放512字节的数据,好吧,至于是什么数据那就不知道了,但是我们可以使用U盘模拟试验先烧写进入一个可以执行的代码,然后再把0X6000 0000开始的512个字节的数据给读出来。将这512字节的数据做成数组,数组如下:
[mw_shl_code=applescript,true]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,
};[/mw_shl_code]
上面这个数组要放到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表都不能少。
|