第二章STM32MP1简介
本章,我们将向大家介绍STM32MP1是一个什么东西?有哪些资源?能够做什么?如何选型等基础知识。由于本书是讲解STM32MP1的M4裸机开发,因此本章会重点讲解一下STM32MP1的M4内核部分,让大家对STM32MP1有一个大概了解。
本章将分为如下几个小节:
2.1、初识STM32MP1;
2.2、STM32MP157 M4内核和STM32F4单片机区别;
2.3、STM32MP1设计选型;
2.1 初识STM32MP1
2.1.1 STM32大家族
2007年6月,ST在北京发布了全球第一款基于ARM Cortex M3内核的32位通用微控制器芯片:STM32F103,以优异的性能,丰富的资源,超高的性价比,迅速占领市场,从此一鸣惊人,一发不可收拾,截止到2020年6月,STM32累计出货量超过45亿颗。目前STM32已经成为了32位ARM单片机的代名词,很多企业在招聘的时候都会注明要会使用STM32,这些企业在实际的项目开发中并不一定使用STM32,但是如果应聘者掌握了STM32的开发就意味着应聘者掌握了32位ARM芯片的开发方式,实际开发中很容易切换到其他型号的32位ARM芯片。至于STM32系列为什么能够在众多半导体厂商中脱颖而出,这里面的商业因素我们就不分析了,总之,STM32很火。当然了,打铁还需自身硬,STM32自身优异的性能也是至关重要的,STM32的优异性体现在如下几个方面:
1、超低的价格。8位机的价格,32位机的性能,是STM32最大的优势。
2、超多的外设。STM32拥有包括:FSMC/FMC、TIMER、SPI、IIC、USB、CAN、IIS、SDIO、ADC、DAC、RTC、DMA、RGBLCD、SAI、JPEG解码等众多外设及功能,具有极高的集成度。
3、丰富的型号。STM32仅M3内核就拥有F100、F101、F102、F103、F105、F107、F207、F217等8个系列上百种型号,具有QFN、LQFP、BGA等封装可供选择。同时STM32还推出了STM32L和STM32W等超低功耗和无线应用型的M3芯片,另外,ST还推出了STM32F4/F7/H7等更高性能的芯片。2019年ST推出了STM32家族首款Cortex-A内核、可运行Linux系统的STM32MP1系列MPU,将STM32家族推向了一个新的高度!
4、优异的实时性能。数十,甚至上百个中断(视具体芯片而定),可编程优先级,并且所有引脚都可以作中断输入。
5、杰出的功耗控制。STM32各个外设都有自己的独立时钟开关,可以通过关闭相应外设的时钟来降低功耗。
6、极低的开发成本。通过串口即可下载程序,而且相应的仿真器也很便宜,支持JTAG&SWD调试接口,最少仅2个IO口即可实现仿真调试,极大的降低了开发成本。
截止2020年,STM32家族结构图如图2.1.1.1所示:
图2.1.1.1 STM32家族结构图
关于STM32整个家族的详细介绍请查阅《STM32选型手册》,《STM32选型手册》已经放到了开发板光盘中,路径:开发板光盘à7、STM32MP1参考资料。
2.1.2 你好,STM32MP1
笔者在做STM32单片机教育工作这数年以来,“STM32能不能跑Linux?”这个问题被问了无数次,虽然Linux已经支持了无MMU,但是终归不是“正途”,完整的Linux体验肯定是需要Cortex-A这样的“正统”内核。千呼万唤始出来,ST终于在2019年发布了STM32MP1系列,STM32MP1是ST首款Cortex-A7内核的MPU,STM32MP1目前有三条产品线:STM32MP151/153/157,这三条产品线的主要区别如表2.1.2.1所示:
型号 | Cortex-A7 | Cortex-M4 | GPU |
STM32MP151系列 | 单核,650/800M | 单核209M | 无 |
STM32MP153系列 | 双核,650/800M | 单核209M | 无 |
STM32MP157系列 | 双核,650/800M | 单核209M | 有,3D GPU |
表2.1.2.1 STM32MP1系列主要区别
从表2.1.2.1可以看出,STM32MP157是目前整个STM32MP1系列最强的,正点原子的STM32MP1开发板就使用了STM32MP157DAA3这颗主控,STM32MP157DAA3又是STM32MP157最强的型号。
可以看出,STM32MP1系列是多核异构形式的,包括一颗或两颗Cortex-A7,外加一颗Cortex-M4内核。毫无疑问,Cortex-A7就是为了运行Linux这样的富操作系统,Cortex-M4可以看做一个M4内核的单片机,类似STM32F429,可以运行对实时性要求比较高的控制应用,也可以运行FreeRTOS、UCOS这样的RTOS类操作系统。
STM32MP1可以看作是STM32H7单片机的换核版,除了最主要的内核、DDR、GPU等新加的外设以外,其他基础外设几乎和STM32H7单片机一模一样,这就意味着可以完全利用STM32单片机已经建立起来的庞大的生态环境。对于开发者而言,简化了STM32MP1上手难度,如果以前做过STM32单片机开发,那么可以很轻松的切入到STM32MP1。尤其是那些学习了STM32单片机,想转入到嵌入式Linux开发的朋友,STM32那些基础知识不需要再重头学起,对STM32MP1内部的外设也比较清楚,数据手册也可以轻松看懂,极大的降低了学习门槛。
2.1.3 STM32MP157资源简介
STM32MP157根据封装、引脚、工作温度的不同也分为了多款不同的芯片,正点原子的STM32MP157开发板选择的是STM32MP157DAA1,这是一款448脚、LFBGA封装的芯片。双核32位Cortex-A7+单核Cortex-M4,A7主频为800MHz,M4主频为209MHz。A7内核包含32KB的L1 I/D Cache,256KB的L2 Cache,支持NEON以及TrustZone,M4内核包含FPU单元。STM32MP1支持16/32bit的LPDDR2/LPDDR3-1066、DDR3/DDR3L-1066内存,最大支持1GB,另外STM32MP157内部包含708KB的SRAM。内部一个3D GPU,支持OpenGL ES2.0,RGB LCD接口支持24bit,RGB888格式,分辨率最高支持1366*768 60fps,其他详细的资源配置见表2.1.3.1:
STM32MP157DAA1资源 | |||
Cortex-A7 | 800M×2 | 32位定时器 | 2个 |
Cortex-M4 | 209M×1 | 电机控制定时器 | 2个 |
3D GPU | 1 | 16位ADC | 2个 |
SRAM | 708KB | SPI | 6个 |
封装 | LFBGA448 | QSPI | 2个 |
通用IO | 176 | I2S | 3个 |
16位定时器 | 12个 | I2C | 6个 |
U(S)ART | 4+4=8个 | FMC | 1个 |
CAN FD | 2个 | USB OTG FS | 1个 |
SDIO | 3个 | USB OTG HS | 2个 |
千M网络MAC | 1个 | RGB LCD | 1个 |
DSI | 1个 | SAI | 4个 |
SPDIF RX | 4个 | DFSDM | 8个 |
DCMI | 1个 | TRNG | 1个 |
2.1.3.1 STM32MP157DAA1内部资源表
表2.1.3.1列出了STM32MP157的大多数外设资源,从表中可知,STM32MP157内部资源还是非常丰富的,但是这些资源有些是M4内核无法访问的,本书稍后会讲解STM32MP157的A7以及M4内核是如何分配这些外设的。本书将针对M4内核的那些资源进行详细的使用介绍,并提供丰富的例程,供大家参考学习,相信经过本书的学习,您会对STM32MP157的M4内核有一个全面的了解和掌握。
关于STM32MP157内部资源的详细介绍,请大家参考《STM32MP157参口手册》以及《STM32MP157A&D数据手册》,这两个都已经放到了开发板光盘中,路径为:开发板光盘à、STM32MP1参考资料,这两份文档里面有STM32MP157详细的资源说明和相关性能参数。
2.1.4 STM32MP157 A7和M4内核资源分配
STM32MP157内部有A7和M4两种不同架构的内核,因此就会存在资源外设资源分配的问题,有些外设是只能A7访问的,有些只能M4访问,有些是A7和M4都能访问。所以在正式编写M4裸机驱动之前一定要先搞明白M4能使用哪些外设,这个ST官方Wiki上有详细的讲解,地址为:https://wiki.st.com/stm32mpu/wiki/STM32MP15_peripherals_overview,由于链接可能会失效,因此笔者对其进行了整理,大家可以直接看表2.1.4.1:
注:
STM32MP157有多种运行时上下文,这些运行时上下文对应不同的内核和安全模式:
● A7安全模式:STM32MP1整个系列包含TrustZone,TrustZone是安全相关的,在安全状态下会运行一个TEE系统,ST为STM32MP1系列提供的TEE系统是OP-TEE。大家要注意,OP-TEE是在Linux内核之外的另外一个OS,和Linux内核处于统一平面的。我们在学习的时候不涉及任何安全方面的知识,因此不需要管OP-TEE,知道有这个东西就行,看到OP-TEE知道是和A7的安全有关的即可。
● A7非安全模式:也就是A7运行Linux系统的时候。
● M4模式,也就是M4内核运行的时候。
表2.1.4.1中‘£’表示外设可以分配(R)给此运行时上下文,‘P’表示此外设只能用于某些运行时上下文。
域 | 外设 | 运行时分配 | 描述 | |||
外设实例 | A7安全模式 (OP-TEE) | A7非安全模式 (Linux) | M4模式 | |||
模拟 | ADC | ADC | £ | £ | 单选 | |
模拟 | DAC | DAC | £ | £ | 单选 | |
模拟 | DFSDM | DFSDM | £ | £ | 单选 | |
模拟 | VREFBUF | VREFBUF | £ | 单选 | ||
音频 | SAI | SAI1 | £ | £ | 单选 | |
SAI2 | £ | £ | 单选 | |||
SAI3 | £ | £ | 单选 | |||
SAI4 | £ | £ | 单选 | |||
音频 | SPDIFRX | SPDIFRX | £ | £ | 单选 | |
协处理 | IPCC | IPCC | R | R | 共享 | |
协处理 | HSEM | HSEM | P | P | P | |
内核 | RTC | RTC | P | P | ||
内核 | STGEN | STGEN | P | P | ||
内核 | SYSCFG | SYSCFG | P | P | ||
内核/DMA | DMA | DMA1 | £ | £ | 单选 | |
内核/DMA | DMA2 | £ | £ | 单选 | ||
内核/DMA | DMAMUX | DMAMUX | £ | £ | 可共享 | |
内核/DMA | MDMA | MDMA | £ | £ | 可共享 | |
内核/中断 | EXTI | EXTI | £ | £ | 可共享 | |
内核/中断 | GIC | GIC | P | P | ||
内核/中断 | NVIC | NVIC | P | |||
内核/IO | GPIO | GPIOA | £ | £ | 可共享 | |
GPIOB | £ | £ | 可共享 | |||
GPIOC | £ | £ | 可共享 | |||
GPIOD | £ | £ | 可共享 | |||
GPIOE | £ | £ | 可共享 | |||
GPIOF | £ | £ | 可共享 | |||
GPIOG | £ | £ | 可共享 | |||
GPIOH | £ | £ | 可共享 | |||
GPIOI | £ | £ | 可共享 | |||
GPIOJ | £ | £ | 可共享 | |||
GPIOK | £ | £ | 可共享 | |||
GPIOZ | £ | £ | £ | 可共享 | ||
内核/RAM | BKPSRAM | BKPSRAM | £ | £ | 单选 | |
内核/RAM | DDR控制器 | DDR | P | P | ||
内核/RAM | MCU SRAM | SRAM1 | £ | £ | £ | 可共享 |
SRAM2 | £ | £ | £ | 可共享 | ||
SRAM3 | £ | £ | £ | 可共享 | ||
SRAM4 | £ | £ | £ | 可共享 | ||
内核/RAM | RETRAM | RETRAM | £ | £ | £ | 单选 |
内核/RAM | SYSRAM | SYSRAM | £ | £ | £ | 可共享 |
内核/定时器 | LPTIM | LPTIM1 | £ | £ | 单选 | |
LPTIM2 | £ | £ | 单选 | |||
LPTIM3 | £ | £ | 单选 | |||
LPTIM4 | £ | £ | 单选 | |||
LPTIM5 | £ | £ | 单选 | |||
内核/定时器 | TIM | TIM1 | £ | £ | 单选 | |
TIM2 | £ | £ | 单选 | |||
TIM3 | £ | £ | 单选 | |||
TIM4 | £ | £ | 单选 | |||
TIM5 | £ | £ | 单选 | |||
TIM6 | £ | £ | 单选 | |||
TIM7 | £ | £ | 单选 | |||
TIM8 | £ | £ | 单选 | |||
TIM12 | £ | £ | £ | 单选 | ||
TIM13 | £ | £ | 单选 | |||
TIM14 | £ | £ | 单选 | |||
TIM15 | £ | £ | £ | 单选 | ||
TIM16 | £ | £ | 单选 | |||
TIM17 | £ | £ | 单选 | |||
内核/看门狗 | IWDG | IWDG1 | £ | |||
IWDG2 | £ | £ | 共享 | |||
内核/看门狗 | WWDG | WWDG | £ | |||
高速接口 | OTG(USB OTG) | OTG(USB OTG) | £ | |||
高速接口 | USBH(USB Host) | USBH(USB Host) | £ | |||
高速接口 | USBPHYC(USB HS PHY控制器) | USBPHYC(USB HS PHY控制器) | £ | |||
低速接口 | I2C | I2C1 | £ | £ | 单选 | |
I2C2 | £ | £ | 单选 | |||
I2C3 | £ | £ | 单选 | |||
I2C4 | £ | £ | 单选 | |||
I2C5 | £ | £ | 单选 | |||
I2C6 | £ | £ | 单选 | |||
低速接口 | SPI | SPI2S1 | £ | £ | 单选 | |
SPI2S2 | £ | £ | 单选 | |||
SPI2S3 | £ | £ | 单选 | |||
SPI4 | £ | £ | 单选 | |||
SPI5 | £ | £ | 单选 | |||
SPI6 | £ | £ | 单选 | |||
低速接口 | USART | USART1 | £ | £ | 单选 | |
USART2 | £ | £ | 单选 | |||
USART3 | £ | £ | 单选 | |||
UART4 | £ | £ | 单选 | |||
UART5 | £ | £ | 单选 | |||
USART6 | £ | £ | 单选 | |||
UART7 | £ | £ | 单选 | |||
UART8 | £ | £ | 单选 | |||
大容量存储 | FMC | FMC | £ | |||
大容量存储 | QUADSPI | QUADSPI | £ | £ | 单选 | |
大容量存储 | SDMMC | SDMMC1 | £ | |||
SDMMC2 | £ | |||||
SDMMC3 | £ | £ | 单选 | |||
网络 | ETH | ETH | £ | 单选 | ||
网络 | FDCAN | FDCAN1 | £ | £ | 单选 | |
FDCAN2 | £ | £ | 单选 | |||
电源&热量 | DTS | DTS | £ | |||
电源&热量 | PWR | PWR | P | P | P | |
电源&热量 | RCC | RCC | P | P | P | |
安全 | BSEC | BSEC | P | P | ||
安全 | CRC | CRC1 | £ | |||
安全 | CRC2 | £ | ||||
安全 | CRYP | CRYP1 | £ | £ | 单选 | |
安全 | CRYP2 | £ | ||||
安全 | ETZPC | ETZPC | P | P | P | |
安全 | HAS | HASH1 | £ | £ | 单选 | |
安全 | HASH2 | £ | ||||
安全 | RNG | RNG1 | £ | £ | 单选 | |
安全 | RNG2 | £ | ||||
安全 | TZC | TZC | P | |||
安全 | TAMP | TAMP | P | P | ||
跟踪&调试 | DBGMCU | DBGMCU | ||||
跟踪&调试 | HDP | HDP | £ | |||
跟踪&调试 | STM | STM | £ | |||
视觉 | CEC | CEC | £ | £ | 单选 | |
视觉 | DCMI | DCMI | £ | £ | 单选 | |
视觉 | DSI | DSI | £ | |||
视觉 | GPU | GPU | £ | |||
视觉 | LTDC | LTDC | £ |
表2.4.1.1 STM32MP1 A7和M4外设资源分配
笔者注:
● ST官方EVK开发板上I2C4连接了一个PMIC芯片,因此表2.4.1.1中M4是无法使用I2C4的。如果你所使用的板子上I2C4没有连接PMIC,那么M4是可以使用I2C4的,正点原子的STM32MP157开发板就在I2C4上连接了一个PCF8563实时时钟芯片,我们提供了对应的M4裸机例程。
● 表2.4.1.1中有些外设M4是不能使用的,但是经过笔者实际测试有一些外设M4是可以使用的,比如USART1,笔者只是简单测试了一下USART1的收发功能,当代码量大的时候有没有什么后遗症笔者就没有再去测试了。
● 笔者也在M4内核中测试了内部RTC,单独使用RTC的时候没有任何问题,但是当笔者加入其它的定时器中断相关代码的时候RTC就会出问题,同样的代码,笔者在STM32F429上测试就没问题。由此可见,有些M4无法使用的外设,强行在M4中使用可能会工作,但是会出一些问题。
● 总之,笔者建议严格按照表2.4.1.1中的外设资源分配来使用M4内核,防止出现一些不可解决的错误,尤其是在将以前STM32F4单片机中的程序移植到ST32MP1的M4内核上的时候。
大家在使用STM32MP157的M4内核的时候,一定要先查阅表2.4.1.1,看看M4内核能使用哪些外设。如果你所做的产品既要用A7内核跑Linux系统,又要M4内核处理实时任务,那么还需要对A7和M4做好资源分配,因为很多外设资源是A7和M4共享的。
2.2 STM32MP157 M4内核和STM32F4单片机区别
大家肯定好奇STM32MP157的M4内核和传统的STM32F4单片机有啥区别,STM32MP157中的M4能不能取代STM32F4单片机,是不是买个STM32MP157开发板就相当于同时拥有了Linux和单片机?
首先直接告诉大家结论:STM32MP157的M4内核不能取代传统的STM32F4单片机,虽然开发方式差不多,就像压死骆驼的最后一根稻草一样,就是因为那一两个核心功能的缺失,导致了STM32MP157的M4在实际使用中与STM32F4单片机差别还是很大的。
如果你没有任何Linux基础,现在就想着买个STM32MP157学习M4单片机,学会了以后再学习A7的Linux部分,这样可以省下买STM23F4单片机的钱。理想很美好,现实很残酷,在你尝试过STM32MP157的M4以后大概率会自己重新去买个STM32F4单片机开发板,至于原因接下来就给大家详细分析一下。
2.2.1 M4内核的生态继承
先来看一下STM32MP157的M4内核与STM32F4单片机相同之处,这也是ST公司以及很多做STM32MP1开发板的厂家重点宣传都地方。核心宣传点就是:完美继承了STM32单片机的生态。这点非常重要,减少了STM23MP157的M4内核开发难度,以前用过STM32单片机的人可以很轻松的转入STM32MP157的M4开发。
生态继承主要体现在如下几点:
1、开发方式和STM32F4单片机一致,可以直接使用MDK、IAR或STM32CubeIDE来开发STM32MP157上的M4内核。开发方式非常友好,和STM32F4单片机没有什么区别,入门简单。
2、可以使用HAL库进行开发,ST为STM32MP157的M4内核提供了HAL库,因此可以像STM32F4单片机一样直接使用库进行开发。以前STM32F4上的项目代码可以很轻松的迁移到M4内核上。
3、开发资料基本可以参考现有的STM32F4单片机,甚至STM32F7/H7等,资料多,出问题容易查找。
以上几点是STM32MP157的M4内核在生态集成上的主要优点,还有其他的优点,这里就不一一列出了。看完了优点,接下来就要看一下STM32MP157上的M4内核相比STM32F4单片机的不足之处了。
2.2.2 M4内核与STM32F429的外设对比
一个完整的芯片不单单是一个内核,芯片外设也是重要的一个组成部分,外设的丰富程度决定了芯片的应用范围,尤其是在教育领域,外设越多,就意味着学习的知识点就越多。从学习的角度来说,肯定是外设越丰富越好,这里我们就以很经典的STM32F429NIH6为例,来和STM32MP157的M4内核做给对比,看看两者之间主要的外设差别,如表2.2.2.1所示,其中‘P’表示支持,‘O’表示不支持:
外设 | STM32MP157 M4 | STM32F429NIH6 | 描述 |
内核 | Cortex-M4带FPU | Cortex-M4带FPU | |
主频 | 209MHz | 180MHz | |
内部RAM | 708KB | 256KB | STM32MP157中M4可使用的RAM只有384KB |
内部Flash | 无 | 2MB | |
ADC | P | P | |
DAC | P | P | |
DFSDM | P | O | |
SAI | P | P | |
SPDIFRX | P | O | |
IPCC | P | O | |
HSEM | P | O | |
RTC | O | P | |
DMA | P | P | |
DMA2D | O | P | |
EXTI | P | P | |
NVIC | P | P | |
GPIO | P | P | |
LPTIM | P | O | |
TIM | P | P | |
IWDG | O | P | |
WWDG | P | P | |
USB | O | P | |
I2C | P | P | |
SPI | P | P | |
USART | P | P | |
FMC | O | P | |
QUADSPI | P | O | |
SDMMC | P | P | |
ETH | O | P | |
CAN | P | P | STM32MP157为FD CAN,STM32F429为CAN |
CRC | P | P | |
CRYP | P | P | |
ETZPC | P | O | |
HASH | P | P | |
RNG | P | P | |
CEC | P | O | |
DCMI | P | P | |
LTDC | P | P |
表2.2.2.1 STM32MP157与STM32F429外设对比表
从表2.2.2.1可以看出,由于STM32MP157出的比较晚,因此会比STM32F429多新功能外设,比如LPTIM、QUADSPI、SPDIF等,这些外设虽然STM32F429没有,但是STM32F7/H7这些单片机有。STM32F429相比STM32MP157的M4内核多了内部Flash、FMC接口、LTDC、RTC、USB、ETH等,其中内部Flash、FMC和LTDC尤为重要,内部Flash可以保存程序,FMC可以用来外扩SRAM、SDRAM、NAND Flash等,也可以通过FMC来连接8080接口的MCU屏幕。LTDC可以用来连接RGB接口屏幕,配置DMA2D,可以实现绚丽的UI界面设计。
这些差别中,最核心的就是内部Flash,也是因为内部Flash的原因,造成了STM32MP157和STM32F4不同的应用场合,也是STM32MP157的M4不能取代STM32F4单片机的重要原因。
2.2.3 内部Flash导致的使用上的差异
STM32MP157内部M4内核和整个STM32系列单片机(不限于STM32F429)相比,最大的区别就是没有内部Flash。没有FMC、LTDC这些,最多是不能使用屏幕,不能学习屏幕驱动与应用的开发,但是没有内部Flash就会直接导致使用上巨大的不便。
我们在使用STM32单片机的时候代码是下载到内部Flash中的,比如使用MDK编写好代码,然后点击下载或者debug,代码都会下载到内部Flash中去运行。代码调试完成以后代码也是下载到内部Flash中,只要给板子上电,Flash中的代码就会运行。但是,STM32MP157的M4内核没有内部Flash,只有RAM,我们同样使用MDK去编写代码,这点和STM32单片机一模一样,没任何区别。当我们编写好代码以后肯定需要调试,由于STM32MP157的M4没有内部Flash,因此我们只能在RAM中调试,ST在STM32MP157芯片内部定义了SARM1~SRAM4这4块SRAM为MCU SRAM,也就是M4内核可以使用的RAM,这四个SRAM地址是连续的,整个MCU SRAM地址范围为:0X10000000~0X1005FFFF,共384KB。配置MDK,设置代码在MCU SRAM中的位置,然后点击Debug在线调试。由于RAM中的数据掉电以后就会丢失,因此你的板子不能断电,一旦断电,RAM中的程序就会丢失,此时就只能重新通过MDK在线调试功能将程序下载到RAM中。
此时肯定有朋友就会有疑问,掉电程序就丢失,那STM32MP157中的M4压根就不能用啊。如果只使用M4内核肯定是没实际意义的,但是如果把A7内核也用上那就可以解决这个问题了,STM32MP157的设计就是这样的,在实际的产品开发中需要通过A7去启动M4内核。我们在调试好M4内核的代码以后,通过MDK生成对应的bin文件,A7内核的Linux系统启动以后可以加载这个bin文件到指定的MCU SRAM中,这样M4就可以启动了。用A7内核启动Linux系统,然后在加载M4的bin文件来启动M4内核,相比STM32F4单片机一键下载要繁琐的多,这中间的难点有一下几方面:
1、必须会Linux系统,这一点怎么都躲不过去,因为你要把编译出来的M4单片机bin文件放到A7内核的Linux系统里面去,你必须掌握向Linux系统中传输文件。这点好办,在A7的Linux系统中搭建TFTP服务,或者SSH服务,然后通过网络将bin文件发送到A7的Linux系统中。
2、分配A7和M4所占用的资源,如果说上面第一点你可以克服,那么接下来这一点就不容易了。在2.1.4小节我们讲了STM32MP157中的A7和M4外设资源分配的情况,可以看出,有很大一部分外设A7和M4是可以共享的。对于这些共享的外设,如果只运行A7或者M4,那么就不存在分配的问题,可是问题就在于现在需要通过A7去启动M4,所以A7和M4是要一起运行的,因此要先分配外设资源,M4要用到的外设,A7就不能使用。这个时候就需要修改A7的Linux系统设备树,修改完成以后重新编译设备树,用新的设备树启动Linux系统,然后再加载M4的bin文件。可以看出,这一步是需要你懂Linux底层驱动开发的。
3、启动慢!前面说了,要先启动A7的Linux系统,然后在Linux系统中再加载bin文件,启动M4。A7的Linux系统启动就很慢,大概需要几秒,甚至十几秒,等Linux系统启动以后才能启动M4内核。再看一下STM32单片机,直接上电运行,这个启动速度是Linux系统都比不了的!
综上所述,STM32MP157的M4内核是绝对无法取代STM32单片机的,STM32MP157的M4是为了解决实际问题的,更多的是用于产品开发,比如在M4上运行对实时性要求高的应用。前提是你已经掌握了Linux驱动的开发,或者你的开发团队有Linux驱动开发人员,你们的产品开发需要用到M4内核。如果你现在是个初学者,看到很多宣传说STM32MP157既能学习Linux,又能学习单片机,想着买个STM32MP157开发板回来先学习M4裸机,然后再学习Linux,我个人建议还是买个传统的STM32单片机来专门学习单片机的知识。虽然STM32MP157也可以学习STM32单片机开发,但是综合体验完全不一样。毕竟谁都不想为了运行个M4代码,每次都要使用电脑通过MDK将程序下载到内部RAM中,使用过程中还不能断电。或者为了学习M4,先去把Linux驱动开发学一遍,本末倒置。
2.3 STM32MP1设计选型
STM32MP1在2019年推出至今(2020年),一共有3个系列,STM32MP151/153/157,为了方便大家选择合适的型号设计产品,本节给大家讲讲STM32MP1的设计选型。
2.3.1 STM32MP1系列
STM32MP1目前总共有3大类,如表2.3.1.1所示:
型号 | 系列 | 内核 | 特性 |
STM32MP151 | 650M | 单A7+M4 | 入门级,低成本。 |
800M | |||
STM32MP153 | 650M | 双核A7+M4 | 中端级,成本与性能平衡。 |
800M | |||
STM32MP157 | 650M | 双核A7+M4+GPU | 旗舰级,强大的性能,集成GPU |
800M |
表2.3.1.1 STM32MP1系列分类及说明
可以看到,STM32MP1主要分三大类:151/153/157,每一类都有650M和800M两种,800M的性能比650M的要好,但是650M的工作温度范围比800M的大,650M的芯片结温范围为-40℃~+125℃,800M的芯片结温为-20℃~+105℃。
另外每一类芯片都有4种封装类型:TFBGA257、TFBGA354、TFBGA361和TFBGA448,257/354/361/448分别代表每种封装对应的引脚数量,引脚数量越多说明芯片内部外设资源就越多。大家在做产品评估阶段要根据自己产品所需要的外设资源选择合适的封装,引脚数越多,芯片价格就越高。另外,同一种封装的芯片,151/153/157都是Pin to Pin兼容的,比如你的产品一开始用的TFBGA448封装的ST32MP151,随着产品研发的进行,项目需求进行了变更,需要产品加入UI界面,并且要求UI界面精美、流畅,甚至还需要对3D进行支持,那么你就可以直接重新焊接一块TFBGA448引脚的ST32MP157上去,硬件无需做任何修改。
2.3.2 STM32MP1命名
STM32MP1的命名规则如图2.3.2.1所示:
图2.3.2.1 STM32 MPU命名规则(摘自STM32产品选型手册)
如图所示,STM32的产品名字里面包含了:家族、产品类别、特定功能、类型、选项、温度范围和封装等重要信息,这些信息可以帮助我们识别和区分STM32MP1不同芯片。
正点原子ST32MP157开发板使用的STM32MP157DAA1,从命名就可以知道如表2.3.2.1所示信息:
描述 | 型号 | 说明 |
家族 | STM32 | ST公司32位处理器 |
产品类别 | MP | MPU微处理器 |
特定功能 | 157 | MP1系列中的157子系列,是目前旗舰型号 |
类型 | D | 800M主频,基本安全性 |
选项 | AA | LFBGA448引脚,目前功能最全的旗舰型号 |
温度范围 | 1 | -20℃<结温①<+105℃ |
封装 | 无字符 | 管装或托盘包装 |
表2.3.2.1 STM32MP1型号说明
注:
①、结温是芯片晶圆的温度,可以理解为芯片温度,并不是环境温度。芯片工作的时候会产生热量,比如环境温度是25℃,芯片工作以后晶圆温度可能会到50℃。芯片工作负载不同,其发热量也不同,因此在产品开发中要平衡好芯片负载和温度之间的关系,防止芯片结温超过工作范围,导致系统down机设置损坏芯片。
任何STM32MP1型号,都可以按图2.3.2.1所示命名规则进行区分解读。
2.3.3 STM32MP1选型
了解了STM32MP1的系列和命名以后,我们再进行STM32MP1选型就会比较容易了,这里我们只要遵循:由高到低,由大到小的原则,就可以很方便的完成设计选型了。
由高到低原则:在不能评估项目所需性能的时候,可以考虑先选择高性能的STM32MP1型号进行开发,比如选择ST32MP157系列。在高性能STM32MP1上面完成关键性能(即最需要性能的代码)开发验证,如果满足使用要求,则可以降档,如从157à153à151,甚至可以考虑STM32F7/H7这样的单片机,如不满足要求,则可以升档,通过此方法找到最佳性价比的STM32系列,想要一次就位,找到最合适的芯片很难。
由大到小原则:在不能评估项目所需存储大小、RAM大小、GPIO数量、外设等资源需求的时候,可以考虑先选择资源多的型号,比如选择封装LFBGA361甚至LFBGA448的型号进行开发,等到开发完成大部分功能之后,就对项目所需资源有了定论,从而可以根据实际情况进行降档选择(当然极少数情况可能还需要升档),通过此方法,找到最合适的STM32MP1型号。
通过这两个原则,我们就可以找到最适合项目使用的STM32MP1具体型号了。
整个选型工作大家可以在正点原子STM32MP1开发板上进行验证,一般我们开发板都是选择资源最强的旗舰级型号进行设计的,这样可以免去大家自己设计焊接验证板的麻烦,加快项目开发进度。一些资深工程师,对项目要求认识比较深入的话,甚至都不需要验证了,直接就可以选出最合适的型号,这个效率更高。当然这个需要长期积累和多实践,相信只要大家多学习,多实践,总有一天也能达到这个级别。
2.3.4 STM32MP1设计
这里我们简单给大家介绍一下STM32MP1的原理图设计,上一节我们通过选型原则可以确定项目所需的STM32MP1具体型号,但是在选择型号以后,需要先设计原理图,然后再画PCB、打样、焊接、调试等步骤。这里我们重点介绍如何设计STM32MP157的原理图。
任何MPU部分的原理图设计,其实都遵循:最小系统 IO分配的设计原则。在开始设计原理图之前,我们要通读一遍对STM32MP157原理图设计非常有用的手册:STM32MP157的数据手册,可以说不看这个数据手册,我们就无法设计STM32MP157原理图。
1、数据手册
在设计STM32MP157原理图的时候,我们需要用到一个非常重要的文档:STM32MP157数据手册,里面对STM32MP157的IO定义和说明有非常详细的描述,是我们设计原理图的基础。正点原子STM32MP157开发板所使用的STM32MP157芯片数据手册已经到到了光盘中,路径:开发板光盘à、STM32MP1参考资料à数据手册.pdf,接下来我们简单介绍一下如何使用该文档。
《STM32MP157A&D数据手册.pdf》是针对STM32MP157A和STM32MP157D这两个系列的数据手册,主要包括9个章节,如表2.3.4.1所示:
章节 | 概要说明 |
介绍 | 简单说明数据手册作用 |
规格说明 | 简单介绍STM23MP157A/D内部所有资源及外设特点 |
功能描述 | 简单介绍STM32MP157A/D各个功能模块 |
引脚定义 | 介绍不同封装的引脚分布、引脚定义等,含引脚特性、复用功能、脚位等 |
存储器映像 | 介绍STM32MP157A/D整个4GB存储空间和外设的地址映射关系 |
电气特性 | 介绍STM32MP157A/D的电气特性,包括工作电压、电流、温度、各外设资源的电气性能等 |
封装特性 | 介绍了STM32MP157A/D不同封装的封装机械数据(脚距、长短等)、热特性等 |
订购须知 | 介绍STM32MP157A/D具体型号命名所代表的意义,方便选型订货 |
版本历史 | 介绍数据手册不同版本之间的差异和修订内容 |
表2.3.4.1 STM32MP157A/D数据手册各章节内容概要
整个STM32MP157数据手册,对我们开发学习STM32MP157来说都比较重要,因此建议大家可以简单的通读一遍这个文档,以加深印象。对于原理图设计,最重要的莫过于引脚定义这一章节了,只有知道了STM32MP157的引脚定义,才能开始设计原理图。
STM32MP157DAA1引脚分布如图2.3.4.1所示:
图2.3.4.1 STM32MP157DAA1芯片引脚分布(摘自STM32MP157A/D数据手册)
STM32MP157引脚定义如图2.3.4.2和图2.3.4.3所示:
图2.3.4. 2芯片引脚定义(部分)(摘自STM32MP157A/D数据手册)
图2.3.4. 13STM32MP157芯片引脚定义(部分)(摘自STM32MP157A/D数据手册)
引脚定义的具体说明如表2.3.4.2所示:
序号 | 名称 | 说明 |
① | 脚位编号 | 对应芯片的引脚,这里列出了4种封装的脚位描述,根据实际型号选择合适的封装查阅 |
② | 管脚名称 | 即对应引脚的名字,PH5、PH10等表示GPIO引脚,VSS/VDD表示电源引脚,其他类似 |
③ | 类型 | I/O:表示输入/输出引脚 I:表示输入引脚 S:表示电源引脚 A:模拟或特殊电平引脚 |
④ | IO结构 | FT :表示5V兼容的引脚(可以接5V/3.3V) 空:表示5V不兼容引脚(仅可以接3.3V) TT:表示直连DAC,可以容忍3.6V。 DDR : 表示DDR相关接口引脚 DSI:表示DSI接口的1.2V引脚 A:模拟信号 RST:复位引脚 |
⑤ | 引脚功能 | 表示此引脚可以复用为哪些功能外设,比如PH5这个引脚除了可以作为普通的GPIO以外,还可以作为I2C2_SDA、SPI5_NSS和SAI4_SD_B这三个外设引脚。 |
表2.3.4.2 引脚定义说明
了解了引脚分布和引脚定义以后,我们就可以开始设计STM32MP157的原理图了。
2、最小系统
最小系统就是保证MPU正常运行的最低要求,MPU的最小系统设计要比MCU复杂的多,因为要外接DDR,EMMC或NAND等存储设备,MPU对电源的处理要求也比较高,比如对芯片的上电顺序有严格的要求,一般的设计思路如下:
①、根据需求选择好所要使用的STM32MP1芯片型号,确定板子所使用的DDR类型、容量、大小等,确定板子所使用的存储器类型和大小,是采用EMMC、NAND Flash还是其他的存储器。主控、RAM和Flash是MPU设计中的三巨头,需要最先确定好。
②、确定板子电源方案,MPU不像单片机,直接3.3V供电即可,MPU的电源分类比较多,比如STM32MP157最小系统板上就要考虑到芯片电压(3.3V)、芯片内核电压(1.2V或1.35V)、DDR3L(1.35V)等不同电压的电源,这些不同的电源对上电顺序也有要求,ST提供了专门的电源设计文档,这个已经放到了开发板光盘中,路径为:开发板光盘à7、STM32MP1参考资料àSTM32MP1分立电源硬件集成设计指南.pdf。
③、我们需要向板子里面烧写Linux系统,不同的板子烧写系统的方法不同,比如有的是通过串口、有的是通过USB、有的是通过网络等。所以最小系统板上需要有烧写系统的接口,对于Linux开发板,我们也需要通过串口与Linux系统进行交互,所以最小系统上的串口也是必须的。最小系统板上最好放上网络,因为Linux下很多文件传输也都是通过网络来完成的。
3、IO分配
IO分配就是在完成最小系统设计以后,根据项目需求对MPU的IO口进行分配,连接不同的器件,从而实现整体功能。比如:GPIO、IIC、SPI、SAI、SDMMC、中断等。遵循:先分配特定外设IO,再分配通用IO,最后微调的原则,见表2.3.4.3所示:
分配 | 外设 | 说明 |
特定 外设 | IIC | IIC一般用到2根线:IIC_SCL和IIC_SDA(ST叫I2C) 数据手册有I2C_SCL、I2C_SDA复用功能的GPIO都可选用 |
SPI | SPI用到4根线:SPI_CS/MOSI/MISO/SCK 一般SPI_CS我们使用通用GPIO即可,方便挂多个SPI器件 数据手册有SPI_MOSI/MISO/SCK复用功能的GPIO都可选用 | |
TIM | 根据需要可选:TIM_CH1/2/3/4/ETR/1N/2N/3N/BKIN等 数据手册有TIM_CH1/2/3/4/ETR/1N/2N/3N/BKIN复用功能的GPIO都可选用 | |
USART UART | USART有USART_TX/RX/CTS/RTS/CK信号 UART仅有UART_TX/RX两个信号 一般用到2根线:U(S)ART_TX和U(S)ART_RX 数据手册有U(S)ART_TX/RX复用功能的GPIO都可选用 | |
…… | …… | |
通用 | GPIO | 在完成特定外设的IO分配以后,就可以进行GPIO分配了 比如将按键、LED、蜂鸣器等仅需要高低电平读取/输出的外设连接到空闲的普通GPIO即可 |
微调 | IO | 微调主要包括两部分: 1,当IO不够用的时候,通用GPIO和特定外设可能要共用IO口 2,为了方便布线,可能要调整某些IO口的位置 这两点,得根据实际情况进行调整设置,做到:尽可能多的可以同时使用所有功能,尽可能方便布线。 |
表2.3.4.3 IO分配
经过以上几个步骤,我们就可以完成STM32MP157的原理图设计了。