查看原文
其他

双核A7+单核M4的STM32MP157到底值不值得入手?开箱~

The following article is from 智果芯Linux Author 智果芯

击上方“果果小师弟”,选择“置顶/星标公众号

干货福利,第一时间送达!

摘要2007年6月,ST在北京发布了全球第一款基于ARM-Cortex-M3内核的32位通用微控制器芯片STM32F103。2019年ST推出了STM32家族首款Cortex-A内核、可运行Linux系统的STM32MP1系列MPU,将STM32家族推向了一个新的高度!作为初学者我该不该入手STM32MP157开发板呢?

STM32的优异性体现在如下几个方面:

  • 1、超低的价格
  • 2、超多的外设
  • 3、丰富的型号。STM32仅M3内核就拥有 F100、F101、F102、F103、F105、F107、F207、F217等8个系列上百种型号,具有 QFN、LQFP、BGA 等封装可供选择。
  • 4、优异的实时性能
  • 5、杰出的功耗控制
  • 6、极低的开发成本。串口即可下载程序,支持JTAG&SWD 调试接口,最少仅2个IO口即可实现仿真调试。
STM32MPU命名规则

STM32能不能跑Linux?

如果这个问题你在19年以前问,我的回答是不可以,如果在19年之后问,我的回答是可以跑!ST公司在2019年发布了STM32MP1系列,STM32MP1是ST首款Cortex-A7内核的MPU,STM32MP1目前有三条产品线。

STM32MP1系列主要区别

目前市面上有三款经典大众的STM32MP157的开发板,分别是正点原子、野火和百问网的。

正点原子
野火
百问网

其实开发板都是一样的,关键是看哪一家的资料教程比较全,其中正点原子的教程是比较详细的

STM32MP157是目前整个STM32MP1系列最强的,STM32MP1系列是多核异构形式的,包括一颗或两颗 Cortex-A7,外加一颗Cortex-M4内核。Cortex-A7 就是为了运行 Linux 这样的富操作系统,Cortex-M4可以看做一个M4内核的单片机,类似 STM32F429,可以运行对实时性要求比较高的控制应用,也可以运行FreeRTOS、UCOS 这样的RTOS类操作系统。

对于我们开发者而言,简化了STM32MP1上手难度,如果以前做过STM32单片机开发,那么可以很轻松的切入到STM32MP1。尤其是那些学习了STM32单片机,想转入到嵌入式Linux开发,STM32那些基础知识不需要再重头学起,对STM32MP1内部的外设也比较清楚,数据手册也可以轻松看懂,极大的降低了学习门槛。

裸机开发就跟STM32单片机一模一样。

入门STM32买MP157值得吗?

STM32MP157中的M4能不能取代STM32F4单片机,是不是买个STM32MP157 开发板就相当于同时拥有了Linux 和单片机?

:STM32MP157的M4内核不能取代传统的STM32F4单片机,STM32MP157 内部M4内核和整个STM32 系列单片机相比,最大的区别就是没有内部Flash。在实际的产品开发中需要通过A7去启动M4内核。我们在调试好M4内核的代码以后,通过MDK生成对应的bin文件,A7内核的Linux系统启动以后可以加载这个bin文件到指定的MCU的SRAM中,这样M4就可以启动了

如果你没有任何Linux基础,现在就想着买个STM32MP157学习M4 单片机,学会了以后再学习A7的Linux部分,这样可以省下买STM23F4单片机的钱。理想很美好,现实很残酷,在你尝试过STM32MP157的M4以后大概率会自己重新去买个STM32F4单片机开发板。

MP157的M4内核优势?

1、开发方式和STM32F4单片机一致,可以直接使用MDK、IAR或STM32CubeIDE 来开发STM32MP157上的M4内核。开发方式非常友好,和STM32F4单片机没有什么区别,入门简单。

2、可以使用HAL库进行开发,ST为STM32MP157的M4 内核提供了HAL库,因此可以像STM32F4单片机一样直接使用库进行开发。以前 STM32F4上的项目代码可以很轻松的迁移到M4内核上。

3、开发资料基本可以参考现有的STM32F4单片机,甚至STM32F7/H7等,资料多,出问题容易查找。

买MP157学STM32的劣势?

前面说了,STM32MP157内部M4内核和整个STM32 系列单片机相比,最大的区别就是没有内部Flash。在实际的产品开发中需要通过A7去启动M4内核。我们在调试好M4内核的代码以后,通过 MDK 生成对应的 bin 文件,A7内核的 Linux系统启动以后可以加载这个bin文件到指定的 MCU的SRAM 中,这样M4就可以启动了。所以固然涉及到以下几个难点:

1、必须会Linux系统。因为你要把编译出来的M4单片机bin文件放到A7内核的 Linux 系统里面去,你必须掌握向Linux系统中传输文件。在A7的Linux系统中搭建TFTP服务,然后通过网络将bin文件发送到A7的Linux系统中。——first blood

2、会分配A7和M4所占用的资源。MP157有很大一部分外设A7和M4是可以共享的。对于这些共享的外设,如果只运行A7或者M4,那么就不存在分配的问题,可是问题就在于现在需要通过A7去启动M4,所以A7和M4是要一起运行的,因此要先分配外设资源,M4要用到的外设,A7就不能使用。这个时候就需要修改A7的Linux 系统设备树,修改完成以后重新编译设备树,用新的设备树启动Linux 系统,然后再加载M4的bin文件。这一步是需要你懂Linux底层驱动开发的。——double kill

3、启动慢。要想让板子正常工作,要先启动A7的Linux系统,然后在Linux系统中再加载bin文件,启动M4。A7的Linux系统启动就很慢,大概需要几秒,甚至十几秒,等Linux系统启动以后才能启动M4内核。而stm32单片机上电直接运行,秒杀。——triple kill

总结

如果你现在是个初学者,我个人建议还是买个传统的STM32单片机来专门学习单片机的知识。虽然STM32MP157也可以学习STM32单片机开发,但是综合体验完全不一样。谁都不想为了运行个M4代码,每次都要使用电脑通过MDK将程序下载到内部RAM中,使用过程中还不能断电。或者为了学习M4,先去把Linux 驱动开发学一遍。

说了半天来用STM32Cubemx新建一个工程看看吧!

一、下载MP157固件包

为了方便,新建工程前,我们先来下载和关联STM32Cube固件包,点击Help->Manage—>embedded software packages,然后弹出管理界面,在该窗口找到 STMMP1列表选项,勾选1.3.0 版本(目前官网最新版本是1.5.0 版本,也可以选择自己需要的版本)。

二、新建工程

使用 STM32CubeMX 配置工程的一般步骤为:

  1. 工程初步建立
  2. HSE 和 LSE 时钟源设置
  3. 时钟系统(时钟树)配置
  4. GPIO 功能引脚配置
  5. 生成工程源码
  6. 用户程序

1、工程初步建立

依次点击File,New Project即可建新工程。选择具体的芯片型号,在搜索框中先输入芯片的型号,正点原子STM32MP157 开发板的主控芯片型号是 STM32MP157DAAx

2. HSE和LSE时钟源设置

进入工程主设计界面后,首先设置时钟源HSE和LSE。HSE和LSE选择Crystal/Ceramic Resonator,表示选择外部晶振作为它们的时钟源。我们开发板的外部高速晶振(HSE)和外部低速晶振(LSE)分别是:24MHZ和32.768KHZ。所以 HSE 时钟频率就是24MHZ,LSE时钟频率就是32.768KHZ。

3. 时钟系统-时钟树配置

STM32MP157是双核A7+单核M4所以时钟要比传统的STM32复杂得多。

  1. 时钟源参数设置:我们选择 HSE 为时钟源,所以我们要根据硬件实际的高速晶振频率填写。
  2. 时钟源选择:我们配置选择器选择HSE即可。
  3. PLL3 分频系数 M 配置。分频系数 M 我们设置为 2。
  4. PLL3 倍频系数 N 配置。倍频系数 N 我们设置为 52。
  5. PLL3 分频系数 P 配置。分频系数 P 我们配置为 3。
  6. MCU 时钟时钟源选择:PLL,HSI 还是 HSE。我们选择 PLL3,选择器选择 PLL3P 即可。
  7. AHB1 ~ AHB4、APB1~ APB3 和 Systick 时钟的最终来源都是MLHCLK,经过上面配置以后此时 MCU 的频率为 209Mhz,AHB1~ AHB4 的时钟频率为 209MHz,APB1~ APB3 总线的时钟频率为 104.5MHz,定时器的时钟频率为209MHz,Systick 的时钟频率为209MHz。

引脚图中点击PI0,在弹出的下拉菜单中,选择IO口的功能为GPIO_Output。然后再右键PI0,选择将PI0分配给M4使用,因为STM32MP157有两个A7内核和一个M4内核,所以GPIO引脚要做好资源分配,给谁用就要指定给谁。

三、生成工程源码

  • Project Settings 是基本的工程配置
  • Project Name:工程名称,填入工程名称(半角,不能有中文字符)
  • Project Location:工程保存路径,点击 Browse 选择保存的位置(半角,不能有中文字符)
  • Toolchain Folder Location:工具链文件夹位置,默认即可。
  • Application Structure:应用的结构,选择 Basic(基础),不勾选 Do not generate the main(), 因为我们要其生成 main 函数。
  • Toolchain/IDE:工具链/集成开发环境,我们使用 Keil,因此选择 MDK-ARM,MinVersion选择 V5.27。
  • Minimum Heap Size 最小堆大小,默认。
  • Minimum Stack Size 最小栈大小,默认。
  • MCU and Firmware Package 是 MCU 及固件包设置:
  • MCU Reference:目标 MCU 系列名称。

至此工程最基础的配置就已经完成,先按下Ctrl+S保存配置,再点击蓝色按钮(SENERATECODE)就可以生成工程。在弹出来的窗口中点击Open Project 就可以打开MDK工程。

下面就是STMCubeMX生成得MP157工程。

然后点个灯!

HAL_GPIO_WritePin(GPIOI,GPIO_PIN_0,GPIO_PIN_SET); /* 设置 PI0 为高电平 */
HAL_Delay(500); /* 延时 500ms */
HAL_GPIO_WritePin(GPIOI,GPIO_PIN_0,GPIO_PIN_RESET); /* 设置 PI0 为低电平 */
HAL_Delay(500); /* 延时 500ms */

然后进行仿真调试。

以看到开发板底板的LED0在闪烁。

我这里只是调试,并没有下载程序。现在你应该比应该明白这个块板子是咋回事了吧!

点击查看往期内容(关注果果小师弟)↓↓↓




觉得好看,请点这里↓↓↓

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存