移植i.MX RT1062 SDK工程至腾讯EVB_AIOT开发板
最近腾讯物联网操作系统TencentOS Tiny团队联合恩智浦半导体、安谋科技(Arm China)发起的线上开发者活动,正在进行中。为了活动的顺利进行,我们的支持工作也在同步开展着。在拿到TencentOS Tiny寄来的EVB_AIOT开发套件后,为了能让开发者更快进行开发工作,本文将以移植一个LCD_RGB工程为例,介绍如何使用MCUXpresso IDE将i.MX RT1062 SDK工程移植到腾讯EVB_AIOT开发板进行开发。
在Tencent EVB_AIOT开发板设计初期,考虑到开发者的使用便捷,尽量使板子的pin脚和SDK工程中的例子对应,所以此处使用SDK的工程为模板,进行修改、开发。
在NXP官网上将针对芯片i.MX RT1062的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显示屏分辨率为480x272,而在Tencent EVB AIOT开发套件中,使用了分辨率为800x480的屏,所以需要在工程源文件中对此进行修改:
现在的像素时钟频率改为(480 + 4 + 4 + 4) * (272 + 30 + 210 + 30) * 60 =31.5M。
所以,在BOARD_InitLcdifPixelClock中将时钟的DIV进行修改:
编译后发现,由于屏幕像素的提高,刷图所需的”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,即下图所示:
由于现在经常会碰到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”。
4. 差异对比
仔细观察屏幕中的色块,会发现颜色跟预期的有差异,还需要回头再找找出错在哪。查找原理图后发现,NXP官方EVK开发板的LCD为16bit接口,所以官方SDK例程中的pin脚配置也只有16个,但是Tencent EVB_AIOT开发板的RGB接口为24bit,所以数据位的偏差导致了显示的偏差。
修改方法是在”pin_mux.c”文件中,添加”LCD_DATA16”~”LCD_DATA23”的pin_mux配置,这里可以利用ConfigTool的”Pins”功能实现,方法如下:右击工程,选择”MCUXpressoConfig Tools”的”Open Pins”,可以看到已经配置好的pin脚有绿色勾选标识。
5. MCUXpresso IDE对比功能
在修改工程配置时,如果只能看一段修改一段,往往会导致修改的不完善或者直接修改错误,利用MCUXpresso IDE的对比功能,可以轻松帮助你锁定差异。
在此工程的修改过程中,我在创建完”1060_elcdif_rgb_AIOT”工程后,又再次导入原SDK工程”evkmimxrt1060_elcdif_rgb”,通过选中两个工程,并且右击选择”Comparewith eachother”功能,即可对比查看,减少错误的发生,也可在调试出问题的过程中,快速找到问题所在。
下图为对比功能的介绍:
虽然当初在EVB_AIOT开发板设计的时候尽量和NXP官方例程引脚保持一致,方便例程的移植,但是在实际开发的过程中还是多多少少会碰到差异,需要自己去对比原理图、工程代码来找出硬件方面的不同。
对于不同工程,需要的存储区域以及大小不同,在MCUXpresso IDE中,通过”MCU settings”以及”Managed Linker Script”可以简单直接的对存储区域进行修改,确保对应的数据段、代码段和其他特定的段都链接到正确的地址。
最后就是当工程使用SDRAM时,需要根据原理图以及数据手册,对DCD文件进行正确的配置。
<ignore_js_op>
用MCUXpresso IDE创建工程
在Tencent EVB_AIOT开发板设计初期,考虑到开发者的使用便捷,尽量使板子的pin脚和SDK工程中的例子对应,所以此处使用SDK的工程为模板,进行修改、开发。
在NXP官网上将针对芯片i.MX RT1062的SDK包下载下来之后,直接拖拽到IDE的指定位置”Installed SDKs”,之后便可以选择SDK包中任何工程进行编辑调试。我们在”Create or import a project”框中选择”Import SDK examples”来选择需要的工程,位置为driver_examples->elcdif->elcdif_rgb。选择好工程后,将工程重命名为“1060_elcdif_rgb_EVB_AIOT”,现在就可以开始针对开发板的适配了。
<ignore_js_op>
根据开发板修改工程配置
1. 显示屏相关修改
在SDK工程中,默认使用的LCD显示屏分辨率为480x272,而在Tencent EVB AIOT开发套件中,使用了分辨率为800x480的屏,所以需要在工程源文件中对此进行修改:
<ignore_js_op>
由于用了不同的屏,参数修改后需要对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进行修改:
<ignore_js_op>
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,即下图所示:
<ignore_js_op>
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”。
<ignore_js_op>
<ignore_js_op>
至此,测试的工程已经创建好,并且编译通过,下面就可以进行调试工作。通过CMSIS-DAP口将程序下载调试,如下图所示:<ignore_js_op>
打开串口调试助手,将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配置,这里可以利用ConfigTool的”Pins”功能实现,方法如下:右击工程,选择”MCUXpressoConfig Tools”的”Open Pins”,可以看到已经配置好的pin脚有绿色勾选标识。
<ignore_js_op>
<ignore_js_op>
点开”LCDIF”,发现”DATA16”-“DATA23”管脚没有配置,需要勾选上,并在下方”Routing Details”功能框中确保这几个管脚配置和前面配置一致。之后点击”UpdateCode”更新代码;<ignore_js_op>
<ignore_js_op>
修改管脚后,需要在工程的预定义中,将” APP_LCDIF_DATA_BUS=kELCDIF_DataBus16Bit”这句定义删除,方法如下所示:右击工程在”properties”中选项中选择”C/C++ Build”的”settings”,在”MCU C Compiler”下的”Preprocessor”里找到这句定义,用右上角的删除键将其删除。<ignore_js_op>
再次编译下载调试,发现例程已经正确地运行了起来,这样一个NXP官方的SDK例程就成功移植到TencentEVB_AIOT开发板上了。5. MCUXpresso IDE对比功能
在修改工程配置时,如果只能看一段修改一段,往往会导致修改的不完善或者直接修改错误,利用MCUXpresso IDE的对比功能,可以轻松帮助你锁定差异。
在此工程的修改过程中,我在创建完”1060_elcdif_rgb_AIOT”工程后,又再次导入原SDK工程”evkmimxrt1060_elcdif_rgb”,通过选中两个工程,并且右击选择”Comparewith eachother”功能,即可对比查看,减少错误的发生,也可在调试出问题的过程中,快速找到问题所在。
下图为对比功能的介绍:
<ignore_js_op>
<ignore_js_op>
总结
虽然当初在EVB_AIOT开发板设计的时候尽量和NXP官方例程引脚保持一致,方便例程的移植,但是在实际开发的过程中还是多多少少会碰到差异,需要自己去对比原理图、工程代码来找出硬件方面的不同。
对于不同工程,需要的存储区域以及大小不同,在MCUXpresso IDE中,通过”MCU settings”以及”Managed Linker Script”可以简单直接的对存储区域进行修改,确保对应的数据段、代码段和其他特定的段都链接到正确的地址。
最后就是当工程使用SDRAM时,需要根据原理图以及数据手册,对DCD文件进行正确的配置。