@[toc]html
MYD-YA157C開發套件由核心板MYC-YA157C和底板MYB-YA157C組成,主控芯片是ST目前最高配置的MPU——STM32MP157AAC3,雙核Corte-A7+Cortex-M4,主頻最高可達650Mhz。python
硬件準備linux
開發板和主機配置git
所謂交叉編譯,實際上是相對於本地編譯,即在一種平臺上編譯出來的程序,能夠在另一個平臺下運行,即編譯的環境和運行的環境不同,屬於交叉的。在進行嵌入式開發時,經常是在PC(x86架構)上使用交叉編譯工具編譯,編譯出來的可執行文件在開發板(ARM)平臺下運行。sql
交叉編譯工具包,位於光盤資料的03-Tools/Complie Toolchain
目錄下,是一個壓縮包,直接右鍵提取,或者使用tar解壓命令均可以把壓縮包解壓。解壓完成以後有如下幾個文件:shell
#解壓sdk tar xvf qt-sdk.tar.xz #進入sdk目錄以後能夠看到如下文件 meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.host.manifest meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.sh meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.target.manifest meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.testdata.json
由於後面咱們會進行Qt應用的開發,因此這裏咱們選擇帶Qt圖形庫支持的交叉編譯工具包json
安裝交叉編譯工具包:vim
#切換到解壓以後的文件夾執行安裝腳本 ./meta-toolchain-qt5-openstlinux-eglfs-stm32mp1-x86_64-toolchain-2.6-snapshot.sh #按[ENTER]鍵選擇默認的安裝配置,默認安裝在/opt目錄下
來看一下是否安裝成功了:bash
#切換到安裝目錄 cd /opt/st/stm32mp1/2.6-snapshot/ #臨時設置環境變量 source ./environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_eglfs-linux-gnueabi #這樣會把GCC交叉編譯器臨時添加到環境變量,退出終端失效 #查看GCC交叉編譯器版本 arm-openstlinux_eglfs-linux-gnueabi-gcc --version #或者使用$CC --version #輸出信息 arm-openstlinux_eglfs-linux-gnueabi-gcc (GCC) 8.2.0 Copyright (C) 2018 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
若是能輸出版本信息,就說明安裝成功了。服務器
有了交叉編譯工具,和PC平臺的gcc使用方法同樣,就能夠直接編譯第一個程序了。
#切換到用戶目錄 cd ~ #新建一個目錄 mkdir hello #切換到hello目錄 cd hello #新建一個C文件 touch hello.c #輸入Hello World程序 vim hello.c
hello.c文件的內容:
#include <stdio.h> int main(void) { printf("Hello STM32MP1 ! -- By arm-gcc\n"); return 0; }
編寫完成以後,先別急着用arm-gcc編譯,先用Ubuntu自帶的gcc編譯一下,看有沒有語法錯誤,能不能正常運行。編譯這個C文件,並指定輸出文件爲pc.o
gcc hello.c -o pc.o
看一下這個文件的類型,並執行這個文件。
能夠看出,沒有語法錯誤,生成了pc.o文件,這個文件是運行在x86_64架構系統上,即PC上的,並且運行結果是咱們想要的。好了,程序運行沒問題,就可使用arm-gcc來編譯這個程序,並生成能夠在arm開發板上運行的可執行文件了。再使用交叉編譯工具編譯這個C程序,指定輸出arm.o文件。
$CC hello.c -o arm.o
語法沒有錯誤,生成了arm.o文件,能夠經過file命令查看這個文件的信息。
由於這個文件是運行在ARM架構的系統上的,因此在PC上不能運行,下面咱們把這個文件放到開發板上去運行。
怎麼能在開發板上運行這個程序呢?也就是怎麼能把這個文件傳輸到開發板上呢?
這恐怕是最簡單的方法了。把生成的arm.o文件複製到U盤裏,把U盤插到板子上的USB接口,並掛載到mnt目錄
#查看當前的設備 ls /dev/sda* #掛載U盤到mnt目錄 mount /dev/sda /mnt #若是沒有掛載成功,嘗試掛載另一個設備 mount /dev/sda4 /mnt #掛載成功以後切換到mnt目錄 cd /mnt #運行arm.o ./arm.o
實際運行:
一樣取消掛載:
#先退出/mnt目錄 cd ~ #取消掛載 umount /mnt
這種方式有點麻煩,咱們來使用另一種方法。
在使用交叉編譯工具鏈,編譯出arm.o文件時,咱們是經過拷貝到U盤,而後把U盤插到開發板上來運行程序的,可是這樣未免太麻煩了。
那麼有沒有一種簡單的方式,能夠在PC Ubuntu主機和開發板快速方便的進行文件傳輸呢?其實有不少種方法,nfs,ftp,tftp等等,這裏咱們使用一種最簡單的方式:scp命令。
scp命令是基於物理網口的,在進行傳輸以前,須要肯定開發板和PC主機是能夠正常通訊的。開發板和電腦使用網線鏈接,或者開發板鏈接路由器,電腦連路由器的WiFi,這兩種方式都是能夠的。
ifconfig eth0 192.168.1.136 up
經過有線鏈接選項,手動配置IPv4地址
開發板和主機互相ping,測試網絡是否正常。
這樣就說明是正常的。把PC主機上的arm.o文件傳輸到開發板上:
scp ~/arm.o root@192.168.1.136:/root
若是出現以下錯誤:
只須要執行一下提示的那一行命令就好了:
ssh-keygen -f "/home/whik/.ssh/known_hosts" -R 192.168.1.136
若是仍是報錯:
那就把knows_host文件刪除了
rm ~/.ssh/know_hosts
再執行scp命令:
先輸入yes,下面會顯示傳輸的進度。
到開發板上看一下:
能夠看到,和PC上的運行結果是同樣的。
關於scp的其餘用法:
#複製本地文件到遠程文件夾 scp local_file remote_username@remote_ip:remote_folder #複製本地文件到遠程文件 scp local_file remote_username@remote_ip:remote_file #複製整個目錄及其子文件 scp -r local_folder remote_username@remote_ip:remote_folder
從遠程複製到本地,只要將從本地複製到遠程的命令的後2個參數調換順序便可。
#scp 命令使用端口號 4588 scp -P 4588 remote@192.168.1.136:/usr/local/sin.sh /home/administrator
另外一種文件傳輸方式,比scp麻煩一些,先在主機配置tftp服務器,並配置共享目錄,而後就能夠開始文件傳輸了。
#主機安裝tftp服務器 sudo apt-get install tftpd-hpa #建立共享目錄 mkdir ftp #修改目錄權限 chmod 777 ftp #在配置文件中添加共享目錄 sudo vim /etc/default/tftp-hpa #添加共享文件夾 TFTP_DIRECTORY="/home/whik/ya157c/ftp" #啓動tftp服務器 sudo service tftpd-hpa restart
開發板獲取主機192.168.1.111上共享目錄下的a.cpp文件,並從新命名爲b.cpp保存到本地
#把遠程的a.cpp文件保存到本地b.cpp tftp 192.168.1.111 -g -r a.cpp -l b.cpp #把遠程的a.cpp保存到本地,不重命名 tftp 192.168.1.111 -g -r a.cpp
參數說明:
-g 表示下載文件(get) -p 表示上傳文件(put) -l 表示本地文件名(local file) -r 表示遠程主機的文件名(remote file)
若是scp和tftp均可以正常傳輸,咱們還可使用ssh命令登陸開發板,和串口登陸是同樣的。
ssh root@192.168.1.136
若是遇到沒法正常安裝程序,請嘗試安裝如下程序。
#更新源 sudo apt-get update sudo apt-get upgrade #安裝所須要的軟件 sudo apt-get install libusb-1.0-0 sudo apt-get install bison flex sed wget curl cvs subversion git-core coreutils unzip texi2html texinfo docbook-utils gawk python-pysqlite2 diffstat help2man make gcc build-essential g++ desktop-file-utils chrpath libxml2-utils xmlto docbook bsdmainutils iputils-ping cpio python-wand python-pycryptopp python-crypto sudo apt-get install libsdl1.2-dev xterm corkscrew nfs-common nfs-kernel- server device-tree-compiler mercurial u-boot-tools libarchive-zip-perl sudo apt-get install ncurses-dev bc linux-headers-generic gcc-multilib libncurses5-dev libncursesw5-dev lrzsz dos2unix lib32ncurses5 repo libssl-dev
簡單寫一個shell腳本閃個燈,沒什麼技術含量,led_blink.sh文件內容:
#!/bin/bash echo none > /sys/class/leds/heartbeat/trigger #死循環 while true do echo 0 > /sys/class/leds/heartbeat/brightness echo "點亮" sleep 0.1 echo 1 > /sys/class/leds/heartbeat/brightness sleep 0.1 echo "熄滅" done
在開發板上運行
#scp傳輸 scp led_blink.sh root@192.168.1.136:/home/root #開發板給這個腳本添加可執行權限 chmod +x led_blink.sh #開發板執行這個腳本 ./led_blink.sh
個人公衆號:mcu149
原文出處:https://www.cnblogs.com/whik/p/12430277.html