对于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))) = {
(9)512字节的加载头,好像是用来设置flash的一些运行参数的,具体在手册8.6有详细的介绍,这里只贴上需要填充的数据
static const uint32_tboot_data[] __attribute__((at(0X60000000))) = {
(10)把上面两段C代码添加到helloworld.c文件里一起编译,就可以把整个程序镜像烧录到HyperFlash中了,到这里复位评估板,就可以在串口终端上看到hello world了。
四、flashloader烧录固件到hyperflash方法
flashloader最终烧录用到的固件是SB格式的镜像文件,下面介绍SB文件生成的方法:
(1)从NXP官网下载Flashloader_i.MXRT1050_1.0_GA.zip工具,可以直接从NXP官网下载Flashloader_i.MXRT1050_1.0_GA.zip
(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、用fromelf.exe方法生成helloworld.srec固件,SREC格式即常用的S19格式的可执行文件,直接在MDK里配置,如下图红框所示:
fromelf.exe --m32combined --output "$L@L.srec" "#L"
(4)用flashloader里的elftosb.exe工具把helloworld.srec固件生成helloworld.sb烧录文件
1、在DOS命令窗口里用\Flashloader_RT1050_1.0\Tools\elftosb\win\elftosb.exe工具把helloworld.srec文件生成helloworld.bin和helloworld_nopadding.bin两个文件,生成过程中需要用到Flashloader_RT1050_1.0\Tools\bd_file\imx10xx\imx-flexspinor-normal-unsigned.bd文件,DOS窗 口中输入的命令如下:
elftosb.exe -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
在elftosb.exe所在的目录下就会生成helloworld.bin和helloworld_nopadding.bin两个文件,DOS命令截图如下所示:
2、继续用elftosb.exe工具把helloworld_nopadding.bin文件生成helloworld.sb文件,生成过程需要用到Flashloader_RT1050_1.0\Tools\bd_file\imx10xx\program_flexspinor_image_hyperflash.bd文件,DOS窗口中输入的命令如下:
elftosb.exe -f kinetis -V -c ../../bd_file/imx10xx/program_flexspinor_image_hyperflash.bd -o helloworld.sb helloworld_nopadding.bin
在elftosb.exe所在的目录下就会生成helloworld.sb文件,DOS命令截图如下所示:
(5)烧录helloworld.sb镜像到hyperflash
1、评估板J1跳线帽跳到3/4,USB线接到J9,SW7拨码开关设置为串口下载模式0101,USB线通过USB HUB连接到PC机,打开Flashloader_RT1050_1.0\Tools\mfgtools-rel\MfgTool2.exe,看到如下所示界面:
2、把Flashloader_RT1050_1.0\Tools\elftosb\win\helloworld.sb拷贝到Flashloader_RT1050_1.0\Tools\mfgtools-rel\Profiles\MXRT105X\OS Firmware\目录下,并把helloworld.sb名字改成boot_image.sb;
3、点击MfgTool2.exe工具的start,开始烧录,烧录完成后如下图所示:
(6)评估板J1跳线帽跳到5/6,USB线接到J28,SW7拨码开关设置为串口下载模式0110,从hyperflash启动,PC上打开串口终端工具,会看到hello world字符串,说明烧录成功。
五、non-xip固件生成步骤
官方评估板的代码一般在hyperflash中直接执行,这种执行方式叫xip,但是hyperflash的运行速度相比于ITCM,还是慢了许多,所以有时候我们希望把固件存放在hyperflash中,但是启动的时候把hyperflash中的固件拷贝到ITCM中再运行,以便提高代码的执行速度,下面开始介绍固件生成步骤:
1、修改MDK/Linker中的分散加载文件的中断向量地址,即MIMXRT1052xxxxx_ram.scf文件里的地址修改后如下
#define m_interrupts_start 0x00002000
#define m_interrupts_size 0x00000400
#define m_text_start 0x00002400#define m_text_size 0x0001DC00
也就是把固件从0x2000地址开始加载,0~0x2000这段地址存放boot的控制信息。
2、MDK/Linker中Misc Controls添加 --entry=Reset_Handler,MDK默认生成的入口地址不是我们以为的Reset_Handler,而是__main,初始化RW和ZI段数据等操作后,再跳转到用户定义的main函数。查看Reset_Handler源码可知道,Reset_Handler依次设置了中断向量表,调用SystemInit,之后再调用了__main,所以需要告知BOOT ROM需要从Reset_Handler开始运行。
3、用fromelf.exe方法生成*.srec固件,生成方法参看上文的第四章节。
4、用flashloader里的elftosb.exe工具把*.srec固件生成*.sb烧录文件,生成方法参看上文的第四章节。这里生成的是non-xip,所以和第四章中使用的工具有不一样的地方,这里说明下:
(1)*.srec生成*.bin的时候使用的bd工具是imx-itcm-unsigned.bd,即固件最后是要在ITCM中运行的,由于默认的imx-itcm-unsigned.bd中的地址配置是imx板的,所以我们要打开这个文件,把里面的内容修改为如下地址,
options {
flags = 0x00;
startAddress = 0x0;
ivtOffset = 0x1000;
initialLoadSize = 0x2000;
}
那么完整的命令格式是elftosb.exe -f imx -V -c ../../bd_file/imx10xx/imx-itcm-unsigned.bd -o interpolation.bin ../../../../../code/project/Objects/interpolation.srec,这样就生成了interpolation.bin 和interpolation_nopadding.bin两个文件
(2) *.bin文件生成*.sb文件,完整命令格式是elftosb.exe -f kinetis -V -c ../../bd_file/imx10xx/program_flexspinor_image_hyperflash.bd -o interpolation.sb interpolation_nopadding.bin
(3)把*.sb文件用MfgTool2.exe工具烧录到hyperflash中,具体方法参看第四章。
文章评论(0条评论)
登录后参与讨论