NXP新出的Cortex-M7核单⽚机1050调试⼼得
感谢琳的出现,陪我度过开⼼的每⼀天。开⼼的⽇⼦总是过得很快,离上次写博客已经快两个⽉了。历经⼀年半的阴云密布,终于迎来了久违的万丈阳光,希望未来的岁⽉带来的是更多美好甜蜜,开⼼认真过好每⼀天。
对于IMX.RT1050芯⽚的介绍,⽹上已经有⼀些了,最近这款芯⽚这么⽕的原因是600M的主频,价格却在3美元左右,性能和A7差不多。它的双精度浮点运算单元,⾼速计算能⼒,刚好适合写运动控制算法,所以公司开始投⼊⼈⼒搭建这款芯⽚的软件平台。本⽂只写技术要点,所以⼀些基本的MDK和单⽚机知识都没有提及。
这款单⽚机有好多种启动⽅式,SD卡、SPI FLASH、并⾏NORFLASH、并⾏NANDFLASH、USB、串⼝等,下⾯主要介绍外挂FlexSPI flash加载调试的⼼得。在介绍这之前先说说CMSIS-DAP调试器的使⽤注意事项。
⼀、CMSIS-DAP调试注意事项
NXP官⽅的评估板,上电使⽤CMSIS-DAP调试⼯具调试官⽅例程helloword,发现CMSIS-DAP调试很不稳定,不断摸索,终于到原因。⼀定要认真看官⽅提供的⼿册,在MIMXRT1050EVKHUG.pdf⽂档中,有这么⼀句话很重要,截图如下:
画红框的这句话意思就是使⽤CMSIS-DAP在线调试时,⼀定要把板的boot启动模式切换到串⾏boot模式 ,下图是boot启动模式的各种管脚配置:
如红框中所⽰,把板上拨码开关SW7-3和SW7-4跳成01,CMSIS-DAP调试时就稳定了。
⼆、CMSIS-DAP进⼊U盘模式把BIN⽂件烧录到Hyper Flash⽅法
官⽅评估板集成了CMSIS-DAP调试⼯具,该调试⼯具有三个功能:虚拟串⼝、在线调试、U盘模式烧录固件到HyperFlash。下⾯是使⽤U盘模式烧录固件的⽅法:
(1)评估板boot模式切换到串⾏下载模式,即拨码开关SW7-3和SW7-4配置成01;
(2)J27跳线帽跳到1-2脚,USB线供电后按下SW4按键,这样PC上会出现⼀个U盘符;
(3)官⽅例程中的helloworld⼯程选择
(4)编译⽣成的hello_world.bin⽂件复制到刚才的U盘中;
(5)把拨码开关SW7-3和SW7-4配置成10,即boot使⽤HyperFlash启动⽅式;
(6)按下SW3键复位整板,就可以运⾏helloworld程序了。
三、评估板下载到HyperFlash调试的⽅法
HyperFlash加载算法,MDK已经提供了,这⾥使⽤官⽅例程中的Helloworld为例,对MDK的详细配置进⾏说明,调试器使⽤评估板⾃带的CMSIS-DAP,具体⽅法如下:
(1)使⽤MDK5.23以上的版本打开官⽅例程,代码路径为SDK_2.3.0_EVK-
MIMXRT1050\boards\evkmimxrt1050\demo_apps\hello_world\mdk;
(2)选择如下图所⽰的⼯程进⾏编译,这个⼯程就是烧录到HyperFlash的⼯程:
(3)对DEBUG中的调试器及MDK加载到HyperFlash的算法进⾏配置,如下图所⽰:
点击Settiing进⼊调试器配置,下图红框中的配置很重要,如果选择不对,会导致⽆法下载
下图中的RAM⼤⼩配置成0x8000,这个是⽤来运⾏MDK集成的烧录HyperFlash算法的,空间⼩了会导致运⾏失败,切记
(4)配置MDK中的LOAD设置,如下图所⽰:
Update Target before Debugging不能勾选,勾选之后⽆法进⾏DEBUG调试,后⾯会详细介绍DEBUG调试⽅法;
(5)评估板上电,插上USB下载线,boot模式使⽤串⼝下载模式或者HyperFlash模式都可以,即配置拨码开关SW7为0101或0110,然后点击LOAD按钮就可以把代码烧录到HyperFlash中了;
(6)配置boot模式为HyperFlash模式,复位评估板就可以在串⼝终端上看到hello world输出了。现实是这⾥还看不到终端输出,因为IVT还没有烧录到flash⾥,后⾯介绍为什么要这么做;
(7)保留第六步⾥的boot模式,复位评估板,然后点击DEBUG按钮就可以在flash⾥在线调试代码了;
(8)想要flash⾥的代码运⾏起来,还必须烧录IVT和512字节的加载头,这个在开发⼿册第⼋章有详细的介绍,这⾥我只简单说下IVT每个字段的含义:
volatile const uint32_t_ivt[]  __attribute__((at(0X60001000))) = {
0x412000D1,            //头字节,是固定的
0x60002000,            //程序镜像存放的起始地址,因为后⾯的DCD字段最⼤为1768字节,所以程序存放地址要⼤于这个地址
0,                  //保留字段,写0
0,                  //DCD存放地址,这⾥没有⽤到DCD,所以写0
0x60001020,            //bootdata存放的地址,⼿册中要求IVT存放的地址为0x1000处,⽽IVT总共有32个字节,bootdata需要紧跟IVT后⾯,所以地址为0x1020
0x60001000,            //IVT存放的地址,⼿册中要求IVT存放的地址为0x1000处
0,                  //csf没有⽤到,写0
0,                //保留字段,写0
boot_data数据格式,在下图中介绍
0x60000000,          //boot起始地址,就是HyperFlash的起始地址
0x04000000,          //boot空间⼤⼩,就是 HyperFlash的空间⼤⼩
0,                //plugin flag,没有⽤到,写0
};
boot_data数据格式如下:
(9)512字节的加载头,好像是⽤来设置flash的⼀些运⾏参数的,具体在⼿册8.6有详细的介绍,这⾥只贴上需要填充的数据
static const uint32_tboot_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,
};
(10)把上⾯两段C代码添加到helloworld.c⽂件⾥⼀起编译,就可以把整个程序镜像烧录到HyperFlash中了,到这⾥复位评估板,就可以在串⼝终端上看到hello world了。
四、flashloader烧录固件到hyperflash⽅法
flashloader最终烧录⽤到的固件是SB格式的镜像⽂件,下⾯介绍SB⽂件⽣成的⽅法:
(1)从NXP官⽹下载Flashloader_i.MXRT1050_1.0_GA.zip⼯具,可以直接从NXP官⽹下载
(2)解压⽂件到当前⽬录,在doc⽂件夹下放着关于flashloader的使⽤⼿册,这⾥我们直接看i.MX MCU Manufacturing User's Guide.pdf的7.2.1章节⽣成SB⽂件的部分;
(3)⽤MDK编译器编译出SREC格式的可执⾏⽂件,它是⽤于⽣成SB⽂件的原始固件,这⾥我们以官⽅例程helloworld为例,⽤MDK编译出helloworld.srec固件,步骤如下:
1、打开官⽅例程中的helloworld⼯程,路径如下SDK_2.3.0_EVK-MIMXRT1050\boards\evkmimxrt1050\demo_apps\hello_world\mdk;
2、选择hello_world Flexspi_nor_release⽬标⼯程,如下图所⽰:
3、⽤⽅法⽣成helloworld.srec固件,SREC格式即常⽤的S19格式的可执⾏⽂件,直接在MDK⾥配置,如下图红框所⽰:
< --m32combined  --output  "$L@L.srec"  "#L"
在线代码运行器
(4)⽤flashloader⾥的⼯具把helloworld.srec固件⽣成helloworld.sb烧录⽂件
1、在DOS命令窗⼝⾥⽤\Flashloader_RT1050_1.0\Tools\elftosb\⼯具把helloworld.srec⽂件⽣成helloworld.bin和
helloworld_nopadding.bin两个⽂件,⽣成过程中需要⽤到Flashloader_RT1050_1.0\Tools\bd_file\imx10xx\imx-flexspinor-normal-unsigned.bd⽂件,DOS窗⼝中输⼊的命令如下:
< -f imx -V -c ../../bd_file/imx10xx/imx-flexspinor-normal-unsigned.bd -o helloworld.bin ../../../../SDK_2.3.0_EVK-
MIMXRT1050/boards/evkmimxrt1050/demo_apps/hello_world/mdk/flexspi_nor_release/hello_world.srec
在所在的⽬录下就会⽣成helloworld.bin和helloworld_nopadding.bin两个⽂件,DOS命令截图如下所⽰:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。