@[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