STM32MP157PRO 环境部署#
硬件环境:https://ic-item.jd.com/10081677874432.html
拨码开关(BOOT CFG 表格)#
拨码开关 |
1 |
2 |
3 |
备注 |
---|---|---|---|---|
EMMC |
OFF |
ON |
OFF |
正常启动 |
SD |
ON |
OFF |
ON |
从 SD 卡启动 |
USB |
OFF |
OFF |
OFF |
烧写系统 |
M4 |
OFF |
OFF |
ON |
调试 |
接线规则#
网口 net1:使用以太网转换器连接到电脑上,用于和电脑和虚拟机通信;
网口 net2:使用网线直接连接到路由器上;
Type-C 口 OTG:用于向开发板烧写程序(对应通用串行总线设备中的 DFU);
Type-C 口 Serial:用于串口连接开发板,使用 115200 波特率;
拨码开关:见开发板背面 BOOT CFG 表格,正常使用选择 EMMC 模式。
烧写系统#
下载 STM32CubeProgrammer(不能有中文路径)
更新整个系统的烧写方式:
关闭电源,将拨码开关设置为从 USB 启动,打开电源;
连接 OTG 线;
在 STM32CubeProgrammer 中选择
USB
>connect
> 刷新 Port 选择USB1
;选择分区配置文件:点击 Open File,选择
Buildroot_Emmc_Systemall.tsv
;Binaries Path 选择
uImage
所在目录;开始烧写;
烧写成功,关闭电源,将启动方式设置为 EMMC,打开电源。
单独更新 Trust Boot 的烧写方式:
关闭电源,设置 USB 启动方式,打开电源;
连接 OTG 线;
在 STM32CubeProgrammer 中选择
USB
>connect
> 刷新 Port 选择USB1
;选择分区配置文件:点击 Open File,选择
Buildroot_Emmc_TrustUbootBootloader.tsv
;开始烧写;
烧写成功,关闭电源,将启动方式设置为 EMMC,打开电源。
使用开发板:网络配置#
串口登录开发板:输入 root,没有密码。
cat <<EOF | sudo tee /etc/systemd/network/50-static.network
[Match]
Name=eth0
[Network]
Address=192.168.5.9/24
Gateway=192.168.5.1
EOF
sudo systemctl enable systemd-networkd
Note
开发板上网:接上网线后执行 udhcpc -i eth1
。
配置虚拟机桥接网卡(用于和开发板互相通信)
虚拟机 - 设置 - 添加 - 网络适配器 - 桥接模式 - 复制物理网络连接状态
编辑 - 虚拟网络编辑器 - 添加网络 - VMnet0 - 桥接模式选择 AXIC 网络适配器
cat <<EOF | sudo tee /etc/netplan/99_config.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33: # NAT 网卡
addresses:
- 192.168.183.128/24
routes:
- to: default
via: 192.168.183.2
nameservers:
search: [localdomain, localhost]
addresses: [114.114.114.114, 8.8.8.8]
ens37: # 桥接网卡
addresses:
- 192.168.5.11/24
routes:
- to: 192.168.0.0/24
via: 192.168.5.1
EOF
sudo netplan apply
配置电脑端 AXIC 网络适配器的 IPv4 和网关(用于和开发板和虚拟机通信)
更改 AXIC 网络适配器属性
IPv4 : 192.168.5.10
Netmask : 255.255.255.0
Gateway : 192.168.5.1
关闭 Windows 公用网络防火墙
编码和调试(二次开发)#
下载 CubeMX 和 IDE#
下载 STM32CubeMX(设置硬件引脚,生成 HAL 层代码)
下载 STM32CubeIDE(编写业务代码)
下载源代码#
上层应用源代码
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
下载 BSP
mkdir -p 100ask_stm32mp157_pro-sdk && cd 100ask_stm32mp157_pro-sdk
git clone https://e.coding.net/codebug8/repo.git
./repo/repo init -u https://gitee.com/weidongshan/manifests.git -b linux-sdk -m stm32mp1/100ask_stm32mp157_pro_release-v2.0.xml --no-repo-verify
./repo/repo sync -j4
配置交叉编译环境#
export ARCH=arm
export CROSS_COMPILE=arm-buildroot-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_stm32mp157_pro-sdk/ToolChain/arm-buildroot-linux-gnueabihf_sdk-buildroot/bin
挂载 NFS 目录#
在开发板上执行
mount -t nfs -o nolock,vers=3 192.168.5.11:~/nfs_rootfs /mnt
挂载完成后,在开发板 /mnt
目录,可以直接访问虚拟机上 nfs_rootfs
文件。
编译和安装内核#
编译 Linux 内核
cd 100ask_stm32mp157_pro-sdk/Linux-5.4/
make 100ask_stm32mp157_pro_defconfig
make uImage LOADADDR=0xC2000040
make dtbs
cp arch/arm/boot/uImage ~/nfs_rootfs/
编译和安装内核模块
cd 100ask_stm32mp157_pro-sdk/Linux-5.4/
make ARCH=arm CROSS_COMPILE=arm-buildroot-linux-gnueabihf- modules -j8
make ARCH=arm INSTALL_MOD_PATH=/home/book/nfs_rootfs INSTALL_MOD_STRIP=1 modules_install
将内核模块安装到开发板
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
mount /dev/mmcblk2p2 /boot
cp /mnt/uImage /boot
cp /mnt/*.dtb /boot
cp /mnt/lib/modules /lib -rfd
sync
reboot
编译和安装驱动#
cd 01_all_series_quickstart/05_嵌入式 Linux 驱动开发基础知识/source/01_hello_drv/
make
cp led_drv.ko ledtest ~/nfs_rootfs/
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
cp /mnt/led_drv.ko ./
cp /mnt/ledtest ./
insmod led_drv.ko
lsmod
echo none > /sys/class/leds/heartbeat/trigger # 关掉 led0 的默认呼吸效果
chmod +x ./ledtest
./ledtest /dev/myled on # 打开 led0 灯
编译生成 SDK 和工具链#
一个完整的嵌入式操作系统应该包含以下几部分:
内核(Kernel)
Bootloader
文件系统(fs)
TFA(受信任固件)
交叉编译工具链
所有这些环境都可以通过 Buildroot 来完成构建:
1、准备环境
sudo apt install -y build-essential make unzip
2、下载并解压源代码:
cd sdk/buildroot/
wget https://buildroot.org/downloads/buildroot-2023.02.9.tar.gz
tar xf buildroot-2023.02.9.tar.gz
3、生成编译所需的配置文件:
# cd /home/book/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x
# make 100ask_stm32mp157_pro_ddr512m_systemD_qt5_defconfig
cd buildroot-2023.02.9 && make stm32mp157c_dk2_defconfig
4、编译和生成 kernel、u-boot、fs 等:
make all -j4
tree output/images/
output/images/
├── rootfs.ext2 # 文件系统分区镜像
├── rootfs.ext4 -> rootfs.ext2
├── sdcard.img
├── stm32mp157c-dk2.dtb # 设备树文件
├── tf-a-stm32mp157c-dk2.stm32 # 完整的系统镜像
├── u-boot.stm32 # u-boot 镜像文件
└── zImage # 内核镜像文件
编译 TFA(可选)#
仅适用于 STM32MP157PRO 开发板
编译 TFA
cd /home/book/100ask_stm32mp157_pro-sdk/Tfa-v2.2
make -f $PWD/./Makefile.sdk all
cp tf-a-stm32mp157c-100ask-512d-v1.stm32 ~/nfs_rootfs/
更新 TFA
echo 0 > /sys/class/block/mmcblk2boot0/force_ro
echo 0 > /sys/class/block/mmcblk2boot1/force_ro
dd if=tf-a-stm32mp157c-100ask-512d-v1.stm32 of=/dev/mmcblk2/boot0 conv=fsync > /dev/null 2>&1
dd if=tf-a-stm32mp157c-100ask-512d-v1.stm32 of=/dev/mmcblk2/boot1 conv=fsync > /dev/null 2>&1
echo 1 > /sys/class/block/mmcblk2boot0/force_ro
echo 1 > /sys/class/block/mmcblk2boot1/force_ro
编译 Bootloader(可选)#
编译 Bootloader
cd /home/book/100ask_stm32mp157_pro-sdk/Uboot-2020.02
make stm32mp15_trusted_defconfig
make DEVICE_TREE=stm32mp157c-100ask-512d-v1 all -j4
cp u-boot.stm32 ~/nfs_rootfs/
更新 u-boot 镜像
dd if=u-boot.stm32 of=/dev/mmcblk2p1 conv=fsync > /dev/null 2>&1
sync