STM32MP1的M4 固件装载和双机通信

继续折腾米尔科技的STM32MP157C 开发板,程序员研究开发板和教师不同,不会面面俱到,往往是带着问题去寻找解决之道。

实现了交叉编译cortex-A 的应用程序之后,下一步需要搞定两个问题

  • M4 程序的开发和下载
  • cortex_A 处理器和cortex-M4 之间的通信

毕竟我们是冲着异构处理器架构来的。

本文参考:STM32MP157——Remoteproc和RPMsg 一文

1.生成M4固件

理论上M4 的编程和普通STM32F系列程序设计没有什么大区别,唯一不同的就是处理器上接口的配置。

   可以使用STM32CubeIDE来配置M4的引脚,并且开发相关的应用程序.

  

2.M4固件的装入方式

M4 固件下载的方式有两种

工程模式(Engineering Mode)

类似于使用ST-LINK仿真器将STM32单片机烧录到RAM,适用于M4上电启动模式,无需加载A7核。因为烧写到RAM里面,所以掉电程序会丢失,一般用于调试。。

产品模式(Production Mode)

   M4 的程序存放在A7的 linux 系统的文件中,A7核先启动后,通过remoteproc 的软件引导M4核启动,固件加载执行。

我更倾向一开始就直接使用生产方式。

3 remoteproc 机制

  Remoteproc(Remote Processor Framework),主要作用就是对远程处理器(也就是M4)的生命周期进行管理,即启动、停止远程处理器。

 实际操作时,可以使用开发板上现成的linux 命令行来实现。state powering 等等。在米尔开发板中使用fw_cortex_m4.sh

不过,米尔科技开发板上相关的文件目录和其说明书不同,埋的够深的。

root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# ls
README	fw_cortex_m4.sh  lib

而且在lib 中已经放置了OpenAMP_TTY_echo.elf 文件,倒也是满贴心的。

4 cortex-A 和cortex-M 之间的信息交换RPMsg框架

两个处理器之间的信息交换是使用RPMsg框架来实现的。

从图上看,进一步地是采用openAMP 来实现。ST 公司在A7 端将处理器信息交换仿真成为一个TTY 终端。而在M4 端仿真成为虚拟UART 。于是,两个处理器之间的通信变成了串口通信那么简单直接。只是这个串口的速度非常块,因为他们完全是在内存完成的。

5 测试

先要运行fw_cortex_m4.sh

root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# ./fw_cortex_m4.sh start
fw_cortex_m4.sh: fmw_name=OpenAMP_TTY_echo.elf

才能在/dev目录中看到ttyRPMSG0和ttyRPMSG1 虚拟终端。

root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# ls -l /dev/ttyRPMSG*
crw-rw---- 1 root dialout 5, 3 Apr  9 11:50 /dev/ttyRPMSG0
crw-rw---- 1 root dialout 5, 4 Apr  9 12:56 /dev/ttyRPMSG1
root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# stty -onlcr -echo -F /dev/ttyRPMSG0
root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# cat /dev/ttyRPMSG0 & 
root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# stty -onlcr -echo -F /dev/ttyRPMSG1
root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# cat /dev/ttyRPMSG1 &
root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# echo "hello virtual UART0" >/dev/ttyRPMSG0
hello virtual UART0
root@myir:/usr/local/Cube-M4-examples/STM32MP157C-EV1/Applications/OpenAMP/OpenAMP_TTY_echo# echo "hello virtual UART1" >/dev/ttyRPMSG0
hello virtual UART1

就这样了,下面测试STM32Cube IDE 编译M4 程序。

猜你喜欢

转载自blog.csdn.net/yaojiawan/article/details/109201648