i.MX8M Plus是NXP推出的異構多核處理器,配置了主頻高達1.6GHz的四核ARM Cortex-A53和一顆運行速度800MHz、帶硬件浮點運算的MCU——ARM Cotex-M7內核。本文將基于英創的i.MX8M Plus主板ESM8400,詳細介紹NXP i.MX8M Plus Cortex-M7程序的開發方法,包括開發環境搭建,如何編譯/調試,以及如何自動啟動MCU應用程序等內容。
ESM8400是英創基于i.MX8M Plus處理器開發的64位高性能工控主板,與市面上其他i.MX8M Plus核心板不同,ESM8400直接支持4網口、7串口、同時板載了獨立硬件RTC,獨立的觸摸驅動芯片等必要外設。ESM8400除支持基于Linux-6.6.x內核的多種文件系統,包括Yocto Rootfs、Ubuntu以及Debian桌面系統外,還獨家支持Windows 10 IoT企業版操作系統。
NXP提供的 MCU SDK是一個綜合的軟件開發包,其中包含了i.MX8M系列處理器MCU初始化代碼,外設驅動程序,已經移植好的FreeRTOS操作系統和多核通訊協議棧RPMsg等。
圖 1:NXP MCU SDK Layers
MCU SDK包含了對基于i.MX8M系列處理器的多個主板的支持,各主板對應的硬件定義和例程位于<install_dir>/boards/<board_name>目錄中。
圖 2:boards目錄
evkmimx8mp是NXP i.MX8M Plus官方評估板,我們根據ESM8400的硬件資源,在參考evkmimx8mp的基上,對代碼結構和封裝進行了進一步優化,在<install_dir>/boards下創建了esm8400_m7目錄, 基于esm8400_m7目錄,用戶可以更加簡便、快速的進行m7程序開發。
esm8400_m7目錄內容及簡要說明如下:
esm8000_m7目錄中除包含demo_apps、driver_examples、drivers、multicore_examples 4個子目錄外,還包含以下公共文件:
l board.c/h: board.h包含了ESM8400在M7側所有可用的硬件資源宏定義,包括調試串口、SPI、PWM、可用的GPIO資源等。board.c中包含了各硬件外設的時鐘及RDC初始化代碼。
l clock_freq.c/h:包含了封裝好的用于設置和獲取外設當前時鐘頻率的功能函數。
l ESM8400_*.ld:ARM GCC鏈接文件,配置M7程序的CODE及DATA段。
l pin_mux.c/h:CPU管腳的復用設置。
l utilities.c/h:一些有用的實例程序,比如CPU使用率統計等。
ESM8400_m7下的所有examples和demo都將引用上述公共文件,所以一般不建議修改。
i.MX8M Plus Cortex-M7應用程序開發與普通的Cortex-M7單片機程序的開發完全一樣,本文僅以使用ARM GCC工具鏈為例,對開發環境的搭建進行說明。
3.1 Win10 安裝Linux子系統
<install_dir>/boards/esm8400_m7下的例子程序是在Win10的Linux子系統(WSL)環境下編譯測試的,使用的Linux版本為Ubuntu 18.04,如果用戶已經有了Linux開發主機,請跳過此小節。
Win10安裝Linux子系統請參考:https://docs.microsoft.com/zh-cn/windows/wsl/。
3.2 Win10 安裝ARM GCC及CMake
l 根據所用開發主機的操作系統,下載對應的GUN Arm Embedded工具鏈,下載地址:https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads 。這里以64位Win10操作系統下的Ubuntu 18.04 Linux子系統舉例 ,下載對應的工具包gcc-arm-none-eabi-10-2020-q4-major-x84_64-Linux.tar.bz2到D盤根目錄。
l 解壓tarball,執行:
sudo tar xjf /mnt/d/gcc-arm-none-eabi-10-2020-q4-major-x86_64-Linux.tar.bz2 -C /usr/share
l 建軟鏈接,執行:
sudo ln -s /usr/share/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gcc /usr/bin/arm-none-edbi-gcc
sudo ln -s /usr/share/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-g++ /usr/bin/arm-none-edbi-g++
sudo ln -s /usr/share/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-gdb /usr/bin/arm-none-edbi-gdb
sudo ln -s /usr/share/gcc-arm-none-eabi-10-2020-q4-major/bin/arm-none-eabi-size /usr/bin/arm-none-edbi-size
l 可通過--version命令查看gcc版本:arm-none-edbi-gcc --version
l 安裝CMake,執行:sudo apt-get install cmake
3.3 使用ARM GCC編譯Hello_world
解壓英創提供的SDK_1.0.0_ESM8400-MCU.tar.gz軟件包,在編譯任何工程之前,需要先設置一次編譯工具鏈的環境變量,執行:
export ARMGCC_DIR=/usr/share/gcc-arm-none-eabi-10-2020-q4-major
接下來就可編譯SDK中的例程了,進入<install_dir>/boards/esm8400_m7/demo_apps/ hello_world/armgcc目錄:
執行./build_realse.sh,編譯工具將基于ESM8400_tcm.ld文件在armgcc目錄下自動創建release子目錄,并在其下生成在ESM8400 TCM上運行的hello_world.bin文件。
執行./build_ddr_realse.sh,編譯工具將基于ESM8400_ddr_ram.ld在armgcc目錄下自動創建ddr_release子目錄,并在其下生成在ESM8400 DDR上運行的hello_world.bin文件。
3.4 在WSL2中編譯vs在Windows文件系統中編譯
WSL2使用了最新的虛擬技術在經量化的虛擬機中運行Linux內核,WSL2在多個方面與微軟最初推出的WSL1相比都更具優勢,但除了跨操作系統文件系統性能。詳細說明請參考:https://docs.microsoft.com/zh-cn/windows/wsl/compare-versions
我們將MCU SDK分別解壓到WSL2 Linux文件系統中和Windows文件系統中進行測試,與將文件存放在Windows中跨文件系統編譯相比,把文件存放在WSL中直接編譯速度要快5倍以上。
在M7程序開發過程中,可利用U-Boot直接加載并運行編譯好的M7應用程序,通過PRINTF輸出打印信息來調試應用程序。程序發布時可利用Linux的flash_opt工具,將要發布的M7應用程序bin文件固化到系統eMMC中,U-Boot在啟動時會先自動啟動M7程序,再啟動Linux系統。
4.1 硬件連接
最基本的需要連接并配置好網絡、連接ESM8400控制臺串口(調試串口)和給系統提供電源。ESM8400的UART2為M7程序的調試串口,在M7程序中調用PRINTF將從此串口輸出信息。UART2缺省配置為RS232電平,通訊格式與ESM8400的控制臺串口完全一樣,默認為115200-8-N-1。為了查看M7輸出的打印信息,需要再用一條串口線將ESM8400開發評估底板上的UART2與開發主機的串口相連。
4.2 在U-boot中通過TFTP下載并運行M7應用程序
安裝TFTP Server
用戶可以在開發主板上選擇自己熟悉的TFTP Server工具,這里以在Win10下使用Tfptd64配置為例,只需要設置好目錄,就可以使用TFTP服務了。(可能需要合理配置開發主機的防火墻)
啟動Tfptd64,點擊Setting,在TFTP界面點擊Browse設置TFTP目錄。Tfptd64支持直接選擇WSL系統下的文件目錄,這里直接選擇SDK安裝目錄下的boards文件夾:<install_dir>/boards。
通過U-boot在TCM上運行M7應用程序
TCM(Cortex-M Core’s Tightly Coupled Memory)是i.MX8M Plus CPU片內為Cortex-M內核使用的一塊專用內存,包含128KBytes的代碼存儲空間(CODE)和128KBytes運行內存空間(DATA)。連接好網線、ESM8400控制終端串口(這里連接到開發主機的COM1)、M7調試串口(這里連接到開發主機的COM3),短接開發評估底板上的JP1,以便讓ESM8400運行在調試模式,然后給ESM8400上電,在開發主機COM1串口工具上按空格鍵進入ESM8400 U-boot,依次執行如下命令:
a. setenv serverip 192.168.201.211 // 設置TFTP Server IP地址(開發主板IP地址)
b. setenv ipaddr 192.168.201.213 // 設置ESM8400 網口IP地址(與開發主機同一網段)
c. saveenv // 可以使用saveenv命令保存環境變量,系統下次啟動時就不需要重復設置IP地址了。
d. tftp 0x48000000 esm8400_m7/demo_apps/hello_world/armgcc/release/hello_world.bin // 從開發主機上下載hello_world.bin到ESM8400內存中
e. cp.b 0x48000000 0x7e0000 ${filesize} // 將下載的內容copy到i.MX8M Plus的TCM
f. bootaux 0x7e0000 // 從TCM啟動M7程序
如果程序正常啟動運行,在開發主機的COM3口上(連接到了M7的調試串口ESM8400-UART2) 可以看到程序運行時輸出的Hello World! 信息。
通過U-boot在DDR上運行M7應用程序
連接好網線、ESM8400控制終端串口(這里連接到開發主機的COM1)、M7調試串口(這里連接到開發主機的COM3),短接開發評估底板上的JP1,以便讓ESM8400運行在調試模式,然后給ESM8400上電,在開發主板COM1串口工具上按空格鍵進入ESM8400 U-boot,依次執行如下命令:
· DDR
a. setenv serverip 192.168.201.211 // 設置TFTP Server IP地址(開發主板IP地址)
b. setenv ipaddr 192.168.201.213 // 設置ESM8400 網口IP地址(與開發主機同一網段)
c. saveenv // 可以使用saveenv命令保存環境變量,系統下次啟動時就不需要重復設置IP地址了。
d. tftp 0x80000000 esm8400_m7/demo_apps/hello_world/armgcc/ddr_release/hello_world.bin // 從開發主機上下載hello_world.bin到ESM8400內存中
e. bootaux 0x80000000 //從系統DDR 0x80000000地址啟動M7程序
4.3 M7程序固化及開機自動運行
如前所述,M7程序可以加載到i.MX8M Plus的TCM或系統DDR中運行,各個memory區域提供的程序CODE和DATA空間如下表所示:
配置 | CODE | DATA | A53 & M7 Sheard Memory | CoreMark |
TCM | 128K (007E0000-007FFFFF) | 128K (00800000-0081FFFF) | 16M (80000000-0x80FFFFFF) | 2322.88 |
DDR | 2MB (80000000-801FFFFF) | 2MB (80200000-803FFFFF) | 12M (80400000-0x80FFFFFF) | 2354.88 |
M7程序運行位置由<install_dir>/boards/<board_name>/*.ld鏈接文件決定。
對于M7程序的固化,在進入Linux系統后,可以調用flash_opt命令進行設置。flash_opt在將M7程序固化到系統eMMC的同時,會根據燒寫文件的尾綴進行相應設置,以便在系統啟動時能根據設置自動將M7程序加載到TCM或DDR中運行。具體步驟為:將需要燒寫的程序(以hello_world.bin為例),拷貝到主板可以訪問的目錄中(比如/mnt/mmc),并根據程序實際運行的位置對程序重命名,如果程序是在TCM中運行,則需要命名為hello_world_tcm.bin,如果是在DDR在運行,則命名為hello_world_ddr.bin。重命名只是為了滿足flash_opt對命令格式的要求,程序在編譯時必須根據程序加載的位置選擇對應的*.ld文件。
執行燒寫命令(以燒寫到TCM為例):
#>flash_opt m7 hello_world_tcm.bin
操作完成后,就可以重啟主板,此后系統在啟動時就會自動運行M7程序hello_world.bin了,如果要更新程序,重復上述操作即可。
M7程序一旦通過flash_opt固化到系統中,在系統每次啟動時M7程序就會自動加載運行,此時就不能再在U-boot中手動下載、啟動M7程序進行調試。如果要重新在U-boot中調試M7程序,需要在Linux中執行#>flash_opt m7 dump.bin來擦除先前寫入的應用程序,dump.bin實際上是一個內容全為0xFF的二進行文件。
成都英創信息技術有限公司 028-8618 0660