STM32MP157A-DK1 这个板子从主要特征上看,就和风靡已久的各种“派”相似了,而和 STM32 MCU 的discovery比变化较大。至于玩法,因为目标平台是 ARM cortex-A 系列CPU的Linux系统,在应用层面上和其它 Linux 板子(比如各种“派”)风格就一致。
本来这个套件已经带了烧写好官方提供的 OpenSTLinux 的MicroSD卡,但不幸我收到的这套里面MicroSD卡已经壮烈牺牲了。于是我不能立即体验其demo. 得自己找个卡做个系统上去才能玩了。有点障碍的小问题是板子电源是 USB type-C 口提供电源(没有常规DC插座),而随板子给的一条USB线是双头 Type-C 口,这样我还没有电源可以直接插上去。ST-Link部分仍然是 USB micro 接口,但MPU并不从ST-Link这里获取电源,板子也没有电源跳线选择。按惯例某些插针上会连到5V电源,然而作为电源输入也不合适,我得找个 Type-C 的插头焊个电源线来用。
首先明确一点,STM32MP157A 这颗MPU是不带Flash的——这不同于STM32 MCU. 纵观板子以及查阅线路图又可以确定板子上没有NOR Flash、NAND Flash、eMMC之类存储芯片。这样也不需要对板子进行烧写,不存在烧错了“变砖”的风险,而且MicroSD卡接到其它系统上太灵活了。
根据 wiki.st.com 上 Starter package 部分的介绍(https://wiki.st.com/stm32mpu/wiki/STM32MP15_Discovery_kits_-_Starter_Package),需要用 STCubeProgrammer 来制作SD卡,这样就仿佛是对板子进行“烧写”编程(对于只有这一块开发板的用户来说这也是省事)。又要注意了,和以往MCU的烧写不同,这里的烧写并不是通过 ST-Link 进行,而是用STM32MP1的USB DFU模式,也就是从板子上另外一个 USB type-C 的口连接PC操作。但是我仅有的一条 USB type-C 转 type-A 数据线还不在手边,又卡壳了。
不过还有办法,STCubeProgrammer 还可以使用 UART 操作,就是速度慢而已,这个 UART 就是从 ST-Link 的 VCP 接出来的。
于是我不得已用这个慢速连接进行烧写操作。
事先需要将板子背面的 BOOT 开关都拨到 OFF 位置,也就是 BOOT0=0, BOOT2=0 (BOOT1固定为0),选择UART / USB启动。
尝试之后我认为这样个操作是可以的:
也就是用 -c 参数指定端口(USB或UART),用 -w 参数指定一个 layout 文件,提供给 STM32_Programmer_CLI 程序。程序会根据 layout 文件找到实际要烧写的数据文件进行操作。
比如这个 FlashLayout_sdcard_stm32mp157a-dk1-trusted.tsv 文件的内容:
#Opt Id Name Type IP Offset Binary
- 0x01 fsbl1-boot Binary none 0x0 tf-a-stm32mp157a-dk1-trusted.stm32
- 0x03 ssbl-boot Binary none 0x0 u-boot-stm32mp157a-dk1-trusted.stm32
P 0x04 fsbl1 Binary mmc0 0x00004400 tf-a-stm32mp157a-dk1-trusted.stm32
P 0x05 fsbl2 Binary mmc0 0x00044400 tf-a-stm32mp157a-dk1-trusted.stm32
P 0x06 ssbl Binary mmc0 0x00084400 u-boot-stm32mp157a-dk1-trusted.stm32
P 0x21 bootfs System mmc0 0x00284400 st-image-bootfs-openstlinux-weston-stm32mp1.ext4
P 0x22 vendorfs FileSystem mmc0 0x04284400 st-image-vendorfs-openstlinux-weston-stm32mp1.ext4
P 0x23 rootfs FileSystem mmc0 0x05284400 st-image-weston-openstlinux-weston-stm32mp1.ext4
P 0x24 userfs FileSystem mmc0 0x33C84400 st-image-userfs-openstlinux-weston-stm32mp1.ext4
也就是说,SD卡并不是整个作为一个Linux文件系统来用的,不能直接格式化了把文件复制进去。这样是要麻烦点,启动linux必需的 u-boot 也是存放在 SD 卡里面。根据资料,SD卡的空间分配是这样的:
正因如此,要利用CubeProgrammer来完成存储空间的索引,按地址写入文件。
但是,115200 baud 的UART速度实在太慢,写到后面几十MB的ext4文件系统内容时,效率不能忍受了。遂放弃……
我放弃通过 UART 用 CubeProgrammer 烧写,并非要转用 USB DFU, 而是因为发现FLASH文件压缩包中有 scripts/create_sdcard_from_flashlayout.sh 这个 bash 脚本文件,它应当是可以直接写SD卡的。于是,使用 Linux 机器执行这个脚本(注意需要 sgdisk 程序,我本来没有,结果第一次生成的结果不能用)。
[root(4) stm32mp1]# scripts/create_sdcard_from_flashlayout.sh flashlayout_st-image-weston/FlashLayout_sdcard_stm32mp157a-dk1-basic.tsv
这个脚本程序将创建一个镜像文件,完成后用 dd 命令写入 SD 卡应该就可以了。
Create Raw empty image: flashlayout_st-image-weston/../flashlayout_st-image-weston_FlashLayout_sdcard_stm32mp157a-dk1-basic.raw of 1536MB
具体的分区划分:
Number Start (sector) End (sector) Size Code Name
1 34 545 256.0 KiB 8301 fsbl1
2 546 1057 256.0 KiB 8301 fsbl2
3 1058 5153 2.0 MiB 8301 ssbl
4 5154 136225 64.0 MiB 8300 bootfs
5 136226 168993 16.0 MiB 8300 vendorfs
6 168994 1705857 750.4 MiB 8300 rootfs
7 1705858 3145694 703.0 MiB 8300 userfs
对应的文件:
part 1: fsbl1, image: u-boot-spl.stm32-stm32mp157a-dk1-basic
part 2: fsbl2, image: u-boot-spl.stm32-stm32mp157a-dk1-basic
part 3: ssbl, image: u-boot-stm32mp157a-dk1-basic.img
part 4: bootfs, image: st-image-bootfs-openstlinux-weston-stm32mp1.ext4
part 5: vendorfs, image: st-image-vendorfs-openstlinux-weston-stm32mp1.ext4
part 6: rootfs, image: st-image-weston-openstlinux-weston-stm32mp1.ext4
part 7: userfs, image: st-image-userfs-openstlinux-weston-stm32mp1.ext4
这样用脚本文件处理就摆脱了 CubeProgrammer 的步骤,直接制作 SD 卡,效率很高。SD卡用2GB以上就满足要求了。准备好以后将板子背面 BOOT 开关都拨到 ON 位置,插好 MicroSD 卡然后通电。一会儿蓝色LED闪烁,就说明系统启动成功了。从 ST-Link 的 VCP 可以看到启动时的很多信息。
此内容由EEWORLD论坛网友cruelfox原创,如需转载或用于商业用途需征得作者同意并注明出处