STM32MP1-内核+ Linux =完美的微控制器

根据活动的性质,我从事各种设备的开发:测量,控制,控制等。该设备的绝大部分分为2部分:

  1. 高资源微控制器,不需要硬实时图形用户界面(GUI)。
  2. 消耗很少的资源并在设备的实时硬件中工作。

通常,向GUI系列的改进决定了向新系列微控制器的过渡:更多的颜色,更高的分辨率,更复杂的设计元素。曾经有一次想法是使用某种Raspberry板作为图形界面。

但是随着STM的新系列STM32MP1微控制器的问世,我的痛苦结束了,到目前为止,事情就是这样。

完美的控制器


对我而言,理想的控制器应具有以下特征:

  • 具有良好的图形功能,例如对各种图形格式的简单支持,对矢量字体的支持
  • 图形的大量内存
  • USB键盘和鼠标支持
  • 以太网支持
  • 大量的硬件计时器
  • PWM产生
  • 大量的GPIO
  • 16位ADC

这些要求是构建具有良好图形用户界面的各种设备所需要的。

因此,我很高兴看到STM的新系列:STM32MP1。

首次见面


为了熟悉新芯片,购买了STM32MP157C-DK2板。这是一张(来自Internet的照片):该



演示板基于STM32MP157CAC芯片构建,其中包括:

  • 2个内核A7,每个650 MHz
  • 1核心M4,208 MHz

记忆


引起您注意的第一个区别是芯片上缺少闪存。对于本质上是微处理器的A7内核,这是正常情况,并且代码始终从DRAM执行。基于M4的微控制器通常包括闪存,其中存储了可执行代码。

在此晶振中,M4内核仅具有RAM,并从中执行代码(根据数据表):

708 KB内部SRAM:256 KB
AXI SYSRAM + 384 KB AHB SRAM +
64 KB AHB SRAM在备份域中
,4 KB SRAM在备份域中

A7内核具有内置的DDR控制器(来自数据表):
STM32MP157C / F设备嵌入了用于外部SDRAM的控制器,该控制器支持
以下设备:

  • LPDDR2或LPDDR3,16位或32位数据,最大1 GB,最大533 MHz时钟。
  • DDR3或DDR3L,16位或32位数据,最高1 GB,最高533 MHz时钟。

一方面,M4内核的内存似乎比闪存中的内存要少,但另一方面,RAM内存以核心频率运行。闪存无法做到这一点,因此您必须使用分频器。

工作场所组织


由于需要使用Linux才能与开发板一起使用,因此我必须在计算机上安装一个额外的硬盘驱动器,然后在其上部署Ubuntu 16.04。STM建议使用此操作系统。

工程与生产模式


该板可以两种模式之一启动(由DIP开关确定)。在工程模式下,M4内核单独工作。在生产模式下,M4内核在A7内核的控制下运行。我没有使用工程模式,仅在生产模式下工作。在这种模式下,您不必担心调整核心时钟。在引导过程中将时序配置为最大值。我检查了调试器中的几个寄存器,推导了MCO上的某些频率,然后看了示波器。A7的工作频率为650 MHz,M4的工作频率为208 MHz。

内核M4。下载并运行程序


由于M4内核正在运行A7,因此意味着正在运行OpenSTLinux。Linux remoteproc框架(RPROC)用于控制M4内核。该框架允许您启用和禁用内核,下载和调试软件(ELF文件)。

要将程序加载到M4内核中,请使用以下命令:

echo -n <firmware_name.elf >> / sys / class / remoteproc / remoteproc0 / firmware

要启动程序:

echo start> / sys / class / remoteproc / remoteproc0 / state

要停止:

echo停止> / sys / class / remoteproc / remoteprocX /状态

内核M4。SW4STM32


上面提到的命令已经过尝试,一切正常:)但是要工作,您需要某种普通的IDE。STM建议为此使用AC6 SW4STM32软件。同时,OpenSTM32网站有一个非常酷的标题:
借助适用于Linux的System Workbench,意法半导体STM32MP1系列MPU上的嵌入式Linux的构建和维护从未如此简单,即使对于Linux世界的新手也是如此。
而且,如果您在STM32的System Workbench中安装了Linux的System Workbench,则可以无缝地开发和调试部分在Linux上,部分在Cortex-M4上运行的非对称应用程序。
也就是说,您可以为m4内核和A7编写代码。但这是付费版本。免费的一个可供下载,允许您只为M4内核编写和调试代码。

IDE SW4STM32已下载,安装并尝试。一切正常,编写和编译的过程与Windows上的版本相同。
唯一的区别是代码加载和调试,因为Ethenet和SSH连接用于编写软件。为了进行逐点调试和停止,使用了内置的ST LINK板。

内核A7。交叉编译器


为了在PC上编译程序,STM提供了一个交叉编译器。STM32MP1 Wiki的下面的链接中详细描述了加载和运行交叉编译器脚本的过程。一切都按照说明进行,一切都按预期进行。:)

运行生态系统v1.1.0的交叉编译器:

源SDK / environment-setup-cortexa7t2hf-neon-vfpv4-openstlinux_weston-linux-gnueabi
,然后 根据makefile将
make命令
和源代码编译为ARM代码:)

内核A7。下载并运行程序


要将程序加载到演示板上,请使用命令:

scp gtk_hello_world root@192.168.1.18:/ usr / local

此命令将gtk_hello_world文件下载到/ usr / local部分,该文件位于IP地址为192.168.1.18的开发板上。根-默认情况下,板上的密码。

核心间数据交换


大多数时间都花在了解内核之间的数据交换机制上。在STM提供的示例中,有几种选择可以实现这种交换。您可以直接从OpenSTLinux使用驱动程序,也可以使用虚拟UART机制。我决定简化通过虚拟端口的共享。

在Linux端,它看起来像这样:

打开设备:

fd = open(“ / dev / ttyRPMSG0”,O_RDWR);

然后我们对其进行写入或读取:

write(fd,“ LED_Toggle \ r \ 0”,10);
len =读取(fd,buf,sizeof(buf));

一切都很简单,但有一点细微差别。为了显示ttyRPMSG0设备,您需要M4内核以这种形式访问A7内核:

这是M4内核代码的行:

VIRT_UART_Init(&huart0); //  
VIRT_UART_RegisterCallback(&huart0, VIRT_UART_RXCPLT_CB_ID, VIRT_UART0_RxCpltCallback) //      .

M4内核从虚拟端口接收数据:

if (VirtUart0RxMsg)
{
      //     VirtUart0ChannelBuffRx
     
      VirtUart0RxMsg = 0;
}

将数据写入虚拟端口:

VIRT_UART_Transmit(&huart0, TxArray, TXCounter);

一切正常,但有一点细微之处我仍无法理解。除非A7内核先前已将任何数据写入端口,否则M4内核发送的A7内核的数据接收不会开始。

整个机制由一组第三方OpenAMP库实现。该库应包含在M4内核项目中,并进行相应的初始化。

未来的计划


安装并配置Eclipse以编写和调试A7的代码。
编写一个普通的图形演示,例如M4 ADC的示波器。
最后,使您的控制器板基于该芯片。:) Wiki

有用链接

STM32MP1
OpenSTM32
ST社区
AC6

All Articles