引言
最近AIoT应用大赛正在火热展开,看到许多参赛选手对于NXP工程及IDE接触较少,在此我就以移植一个SDK工程为例,给大家简单介绍移植的过程以及一些注意事项。
利用MCUXpresso IDE创建工程
在Tencent EVB_AIOT开发板设计初期,考虑到开发者的使用便捷,尽量使板子的pin脚和SDK工程中的例子对应,所以此处使用SDK的工程为模板,进行修改、开发。
打开NXP官网,在SDK Buider中将针对芯片i.MX RT1062的SDK包(下载地址:https://mcuxpresso.nxp.com/en/select)下载下来(选择”Select Development Board”->”Boards”->”i.MX”,在下面找到”EVK-MIMXRT1060(MIMXRT1062xxxxA)”)
确认下载的版本无误(此处我们需要v2.10.1版本),点击”Build MCUXpresso SDK”;在下载页面,你可以根据自己的环境选择要下的包,也可以在下方选择你需要的附加例程(点击”SELECT ALL”可全选),配置好后点击下载。如下图所示:
下载完成之后就可以MCUXpresso IDE里导入SDK包了。打开MCUXpresso IDE,可以看到一整面”Welcome”界面,关闭”Welcome”界面,将下载好的SDK压缩包直接拖拽到IDE的指定位置”Installed SDKs”,之后便可以选择SDK包中任何工程进行编辑调试。我们在”Create or import a project”框中选择”Import SDK examples”来选择需要的工程,位置为driver_examples->elcdif->elcdif_rgb。选择好工程后,将工程重命名为“1060_elcdif_rgb_EVB_AIOT”,现在就可以开始针对开发板的适配了。
根据开发板修改工程配置
1.显示屏相关修改
在SDK工程中,默认使用的LCD显示屏分辨率为480*272,而在Tencent EVB AIOT开发套件中,使用了分辨率为800*480的屏,所以需要在工程源文件中对此进行修改:
由于用了不同的屏,参数修改后需要对LCD的时钟进行配置,要使帧率为60Hz,原本的像素时钟频率为(480 41 4 18) * (272 10 4 2) * 60 = 9.2M.
现在的像素时钟频率要为(480 4 4 4) * (272 30 210 30) * 60 = 31.5M.
所以,在BOARD_InitLcdifPixelClock中将时钟的DIV进行修改:
2.内存配置
编译后发现,由于屏幕像素的提高,刷图所需的”m_ncache region”大小超出了限制,所以需要对内存配置进行修改。右击工程,打开”properties”选择”C/C Build”中的”MCU Settings”,在”Memory details”选项下进行配置。虽然EVB_AIOT开发板和官方i.MXRT1060-EVK开发板选用flash型号不同,但是同为QSPI flash,两者通用QSPI Flashloader,因此无需对flash进行修改。按照修改分辨率后的存储大小需要,将”NCACHE_REGION”的大小改为至少4MB,并且,由于”ConfigMPU”中的限制,此处将”BOARD_SDRAM”的大小改为12MB,即下图所示:
3.SDRAM配置
由于现在经常会碰到LCD显示的应用,数据缓存需要的空间较大,内部SRAM远不够用,所以外接SDRAM很常见。通常会使用DCD(Device Configuration Data)文件来初始化SDRAM。EVB_AIOT开发板使用的SDRAM和官方例程不同,并且管脚配置还有一点点差异,所以在这里简单介绍一下使用DCD初始化SDRAM的操作。在例程的”board”目录下,可以打开”dcd.c”文件,在dcd文件中主要包含”HEADER”和”COMMANDS”段,对”COMMANDS”中对相应寄存器进行配置即可对SDRAM进行初始化,下图是MCUXpresso Config Tool中如何生成dcd.c,将寄存器、命令、寄存器取值一一对应添加进去,就能在右侧代码预览窗口看到生成的dcd.c代码。其中寄存器取值窗口点开还可以看到对应的寄存器解释。修改之后,点击更新代码就能够生成需要的dcd文件,来进行SDRAM的初始化。在本例程中,进行dcd文件修改时,需要将”IOMUXC_SW_MUX_CTL_PAD_GPIO_EMC_20”以及” IOMUXC_SW_PAD_CTL_PAD_GPIO_EMC_20”两行右击删除(因为GPIO_EMC_20没有用于SDRAM),并将” SEMC_SDRAMCR1”值改为0x601922、” SEMC_SDRAMCR2”值改为0x1090B(根据SDRAM的datasheet修改)。完成后点击”Update Code”。
至此,测试的工程已经创建好,下面就可以编译、下载、调试工作了。点击IDE工具栏中的小锤子”build”按键,构建项目成功后,通过CMSIS-DAP口将程序下载调试,如下图所示:
打开串口调试助手,将EVB_AIOT开发板上的SW1拨码拨至”AT-MCU”侧,运行代码,可以看到串口打印出程序中相应的log,并且LCD屏开始运行色块程序。这时候,看起来移植工作已经完成了。
4.差异对比
仔细观察屏幕中的色块,会发现颜色跟预期的有差异,还需要回头再找找出错在哪。查找原理图后发现,NXP官方EVK开发板的LCD为16bit接口,所以官方SDK例程中的pin脚配置也只有16个,但是Tencent EVB_AIOT开发板的RGB接口为24bit,所以数据位的偏差导致了显示的偏差。修改方法是在”pin_mux.c”文件中,添加”LCD_DATA16”~”LCD_DATA23”的pin_mux配置,这里可以利用Config Tool的”Pins”功能实现,方法如下:右击工程,选择”MCUXpresso Config Tools”的”Open Pins”,可以看到已经配置好的pin脚有绿色勾选标识。
点开”LCDIF”,发现”DATA16”-“DATA23”管脚没有配置,需要勾选上,并在下方”Routing Details”功能框中确保这几个管脚配置和前面配置一致。之后点击”Update Code”更新代码;
修改管脚后,需要在工程的预定义中,将” APP_LCDIF_DATA_BUS=kELCDIF_DataBus16Bit”这句定义删除,方法如下所示:右击工程在”properties”中选项中选择”C/C Build”的”settings”,在”MCU C Compiler”下的”Preprocessor”里找到这句定义,用右上角的删除键将其删除。
再次编译下载调试,发现例程已经正确地运行了起来,这样一个NXP官方的SDK例程就成功移植到Tencent EVB_AIOT开发板上了。
5.MCUXpresso IDE对比功能
在修改工程配置时,如果只能看一段修改一段,往往会导致修改的不完善或者直接修改错误,利用MCUXpresso IDE的对比功能,可以轻松帮助你锁定差异。
在此工程的修改过程中,我在创建完”1060_elcdif_rgb_AIOT”工程后,又再次导入原SDK工程”evkmimxrt1060_elcdif_rgb”,通过选中两个工程,并且右击选择”Compare with eachother”功能,即可对比查看,减少错误的发生,也可在调试出问题的过程中,快速找到问题所在。
下图为对比功能的介绍:
总结
虽然当初在EVB_AIOT开发板设计的时候尽量和NXP官方例程pin脚保持一致,方便例程的移植,但是在实际开发的过程中还是多多少少会碰到差异,需要自己去对比原理图、工程代码来找出硬件方面的不同。
对于不同工程,需要的存储区域以及大小不同,在MCUXpresso IDE中,通过”MCU settings”以及”Managed Linker Script”可以简单直接的对存储区域进行修改,确保对应的数据段、代码段和其他特定的段都链接到正确的地址。
最后就是当工程使用SDRAM时,需要根据原理图以及数据手册,对DCD文件进行正确的配置。