嵌入式基础及STM32开发入门

嵌入式基础及STM32开发入门

关于ARM

商业模式

ARM架构是由总部位于英国的ARM公司设计和授权的指令集和处理器架构。ARM公司只负责指令集和处理器架构的设计,然后授权给半导体厂商,由半导体厂商负责硬件的具体实现。

常见的ARM处理器厂商和生产产品:

1

ARM架构和微架构(处理器架构)

ARM架构指的是一系列的功能规范,定义了处理器的行为方式,包括支持的指令集和处理器的基本功能。它是硬件和软件之间的契约,描述了软件可以依赖硬件提供哪些功能‌。

不同版本ARM架构的命名采用ARMvXX的形式,例如ARMv1、ARMv4T、ARMv2a、ARMv6-M、ARMv7-R、ARMv7-A。

微架构是从ARM架构到处理器(也叫内核、CPU)的具体实现的设计。一种ARM架构可以对应多个微架构,一种微架构只对应一种处理器并且通常命名上不对微架构和处理器做区分。

不同型号的微架构没有完全固定的命名格式,大部分基于所属的系列或具体应用来进行命名。

微架构可以分为ARM公司自己研发的内核以及ARM公司授权第三方研发的内核:

  • 官方微架构:包括经典内核(ARM1-ARM11)、SecureCore内核(SC000、SC100、SC300)、Cortex-M/R/A内核(Cortex-M4、Cortex-R4、Cortex-A7)等。ARMv1-ARMv6主要是经典内核。在ARM11以后,从ARMv7开始,ARM公司停止了经典内核的版本迭代并改用Cortex命名。ARMv7架构定义了三大分工明确的系列:“A”系列面向尖端的基于虚拟内存的操作系统和用户应用(如智能手机、平板电脑、个人PC和服务器);“R”系列针对实时系统(如汽车电子系统、工业控制器);“M”系列对微控制器(如物联网设备、传感器、嵌入式控制器)。后来,从ARMv8开始,又改为了推出Neoverse系列内核。

    2

  • 第三方微架构,例如苹果为A系列芯片定制的内核(Swift、Cyclone、Twister等)、苹果为M系列芯片定制的内核(Apple M3、Apple M4等)、三星为Exynos系列芯片定制的内核(M1、M2、M3等)、高通为Snapdragon系列芯片定制的内核(Scorpion、Krait、Kryo等)。

[Wiki]List of ARM processors中有官方微架构与ARM架构的对应 关系表、第三方产品系列与ARM架构和微架构对应关系表、官方微架构推出的时间线表。

指令集

ARM架构采用精简指令集(RISC)设计,其指令集有thumb、thumb-2、Arm、AArch64(Arm64)

  • Arm:32位指令集。32位arm处理器的核心指令集,一般兼容thumb或thumb2。
  • thumb:16位指令集。thumb是arm指令集的子集,没有完整的体系结构,无法单独使用。thumb使程序能够在16位和32位指令集之间切换,减少存储空间的占用并提高运行速度。
  • thumb-2:16/32位混合指令集。拓展后的thumb指令集,引入了新的指令和优化,加强了性能以及与32位arm指令集的兼容性。
  • AArch64:64位指令集。64位arm处理器的核心指令集。Armv7处理器架构及以前只支持32位,从Armv8处理器架构开始支持AArch64同时兼容32位arm和thumb-2,目前最新的Armv9处理器架构开始只支持64位,不再兼容32位。

3

常见嵌入式芯片分类及介绍

MCU

名称:Micro controller Unit(微控制单元),又称为单片机。

组成:集成了CPU、存储器(RAM、ROM)、I/O接口、时钟电路、各种外设等部分的单芯片系统。

特性:

  • 没有MMU(内存管理单元),只能进行单一任务作业,多数只能运行裸机系统或小型的实时操作系统(RTOS),如FreeRTOS、RT-Thread等。
  • 资源有限,不能执行非常复杂的任务和运算。
  • 低功耗、低成本、体积小、集成度高、实时性强。

应用场景:工业控制、汽车电子、消费电子等领域。实时性要求高,进行简单控制,不需要强大运算和处理能力的场景。

典型产品:

  • 51单片机:最早的8位MCU之一,用于简单控制任务。
  • AVR系列:如Atmel公司的ATmega,广泛用于Arduino等开源硬件项目。
  • STM32系列:由STMicroelectronics公司推出,具有丰富的资源和外设,是工业和消费电子常用的32位MCU。
  • ESP32系列:由Espressif公司生产,集成了WiFi和蓝牙功能,非常适合物联网(IoT)应用。

MPU

名称:Micro Processor Unit(微处理器单元),通称微处理器。

组成:主要包含CPU核心、缓存、基本I/O接口和中断控制器,但与MCU不同,通常没有内建RAM和Flash,需外部配备存储器和其他必要外设。

特性:

  • 通常包含MMU(内存管理单元),可以运行复杂操作系统,如Linux。
  • 相比MCU,处理性能更高,支持多任务操作,但功耗也较大。
  • 可执行更复杂的数据处理任务,适合高计算需求的场合。

应用场景:需要多任务处理和较强运算能力的嵌入式系统中,如智能家居网关、网络设备和工业自动化。

典型产品:

  • ARM Cortex-A系列:常见的高性能嵌入式处理器,用于智能终端、网关设备等。
  • i.MX系列:NXP公司推出,适用于汽车娱乐、医疗设备等。
  • Sitara系列:由德州仪器(TI)推出,适合工业自动化、嵌入式视觉等领域。

SoC

名称:System on Chip(片上系统)

组成:将CPU、GPU、RAM、ROM、I/O接口、模拟电路、通信模块等各种功能模块集成在一个芯片上。

特性:

  • 高度集成,具备处理器、存储器、接口、外设等多种模块,减少外围电路需求。
  • 支持复杂操作系统,如Linux、Android,且多用于性能要求较高的应用场景。
  • 设计复杂,通常为定制芯片,适用于特定应用。

应用场景:智能手机、物联网设备、智能家居等需要多功能和较高性能的场景。

典型产品:

  • 高通骁龙系列:广泛应用于智能手机和平板设备。
  • 苹果A系列:用于苹果的iPhone、iPad等设备中。
  • ESP8266/ESP32:Espressif公司推出的SoC,适合物联网和低功耗无线通信场景。

DSP

名称:Digital Signal Processor(数字信号处理器)

组成:以处理数字信号为核心,包含快速乘法器、累加器、硬件回路等高效处理单元。

特性:

  • 专门为信号处理而设计,能够执行快速的FFT、滤波、矩阵运算等。
  • 实时处理能力强,适合处理连续的大量数据流。
  • 多数DSP运行专用软件,不适合通用计算。

应用场景:通信、音视频处理、图像处理、语音识别等需要实时信号处理的场景。

典型产品:

  • TI的C6000系列:广泛应用于音视频信号处理、通信等领域。
  • Analog Devices的SHARC系列:用于高性能音频、图像处理应用。
  • Qualcomm Hexagon:集成于高通SoC中,用于音频、图像等加速处理。

FPGA

名称:Field Programmable Gate Array(现场可编程门阵列)

组成:由可编程逻辑单元、可配置I/O接口、时钟管理模块等组成,可以根据设计需求配置逻辑功能。

特性:

  • 用户可通过硬件描述语言(HDL)编程配置逻辑,实现特定的电路功能。
  • 并行处理能力强,适合高实时性、复杂逻辑的处理任务。
  • 相比ASIC,开发周期短、成本低,但功耗较高、集成度不如ASIC。

应用场景:高速数据处理、视频图像处理、软件定义无线电、科学计算等对实时性、并行处理有高要求的场景。

典型产品:

  • Xilinx的Zynq系列:集成ARM核心与FPGA逻辑,适用于嵌入式系统开发。
  • Intel(Altera)的Stratix系列:高性能FPGA,广泛应用于数据中心、通信等高性能计算场景。

ASIC

名称:Application-Specific Integrated Circuit(应用专用集成电路)

组成:根据特定应用设计的定制化电路,包含固定逻辑和处理单元。

特性:

  • 完全为特定功能定制,性能高,功耗低,体积小。
  • 一旦设计完成不可更改,开发周期长、成本高,但单位成本低,适合大规模量产。
  • 集成度高,适合大规模商业产品。

应用场景:矿机芯片、网络芯片、视频解码芯片等大批量生产的定制需求场景。

典型产品:

  • 比特币矿机芯片:如比特大陆的BM系列,专门用于加密货币挖矿。
  • 苹果M系列芯片:苹果的自研芯片,适用于Mac产品中。
  • Google TPU:用于机器学习任务的专用芯片。

其它

除了上述常见嵌入式芯片类型,还有一些专用或混合类型的芯片:

  • GPU(图形处理器):用于加速图形和并行计算,在深度学习领域也应用广泛。
  • NPU(神经网络处理器):专为AI和机器学习任务设计,加速神经网络推理和训练过程。
  • TPU(张量处理器):Google推出的专用AI芯片,优化了张量计算,广泛用于深度学习。

这些芯片类型丰富了嵌入式系统的应用领域,根据需求的不同可以选择相应的芯片来优化系统性能。

STM32简介

STM32是意法半导体(STMicroelectronics)公司推出的基于32位ARM Cortex-M内核微控制器(MCU)产品系列。STM32有十几个不同的系列,几百个不同的型号,广泛应用于工业自动化、消费电子、医疗设备、通信、汽车电子等领域。

如图就是一块STM32F103的MCU

4

命名规范和产品系列

microcontrollers-stm32-family-overview

5

6

内部结构和存储映射

STM32 MCU内部通常包括处理器(内核)、ROM、RAM、片上外设、调试系统、时钟和复位模块、IO设备等部分。

ROM掉电后数据不丢失,一般存放要运行的程序(固件);ROM掉电后数据丢失,但是和CPU交互速度比ROM快很多,一般存储运行中的动态数据。

具体的内部结构需要参考对应型号MCU的数据手册。这里以官方的STM32F40xxx参考手册为例。

不同引脚的名称,有64脚、100脚、144脚、176脚的,这里只贴了64脚的。

7

可以看到ROM使用的是FLASH,RAM使用SRAM,内核是Arm Cortex-M4,许多类似CAN、UART、I2C的外设接口连接至AHB/APB总线

8

内存映射如图,可以看到最常用的ROM和RAM基址分别为0x08000000和0x20000000,还可以看到AHB/APB总线的地址,我们可以通过AHB/APB地址来访问外设。

9

硬件配置

1
2
3
4
MCU:STM32F407ZGT6(Cortex-M4内核)
开发板:启明欣欣STM32F407高配版V5.1(IMT407 V5.1)
调试器:CMSIS DAP
其它:杜邦线、面包板、显示屏、USB转各种串口的模块等,取决于具体应用

笔者的硬件配置如上,下面是一些相关细节

MCU

官网STM32F40xxx参考手册

STM32F407ZGT6数据手册(datasheet)

开发板

407高配版V4.1外设与接口介绍

关于仿真器和调试器

仿真器和调试器是两个不同的概念

仿真器的运行不需要MCU实物,通过硬件或软件的形式模拟MCU的运行并提供调试功能。仿真器的缺点是价格贵、不通用,往往某款仿真器只针对单一型号的MCU。所以开发中仿真器一般适用于不含硬件调试模块(不支持调试器)的MCU,比如51单片机。

调试器需要MCU实物,配合软件,通过JTAG或SWD接口,可以实时监测程序的执行状态、寄存器、内存等,并支持单步执行、断点调试、变量跟踪等功能,还可以烧录和下载程序。使用什么调试器取决于内核的架构,STM32是ARM Cortex-M系列的内核,可以选择的调试器包括JLINK、STLINK、CMSIS DAP、ULINK2等,不同仿真器的兼容性、功能性和价格都不同,需要根据具体需求选择购买。

  • JLINK:通用型的ARM内核芯片调试器,支持的芯片和软件开发环境多,兼容性和功能性最强,价格最高。
  • STLINK:由意法半导体推出的针对STM8/STM32芯片的调试器,不支持其它MCU,专门做STM32开发可以选择这款。
  • CMSIS DAP:针对Cortex处理器的开源的标准调试协议,厂商和个人可以基于该协议开发调试器,产品统称CMSIS DAP。缺点是不被STM32CubeIDE和STM32CubeProg支持。价格介于JLINK和STLINK之间,性价比高。
  • ULINK2:专注于Keil平台,支持ARM7/9,Cortex-M0~M4以及8051系列芯片,综合性能不如JLINK。

开发环境

开发环境的搭建主要参考Keil5安装+STM32CubeMX安装+VSCode辅助开发教程

软件安装包:传送门

1
Keil MDK + STM32CubeMX + VsCode辅助代码编辑

Keil MDK

KEIL是一家德国的公司,于05年被ARM收购,主要的产品是针对嵌入式开发的IDE软件Keil µVision。

Keil µVision是一系列Keil IDE的统称,主要有MDK、 C51、 C166、 C251四种IDE,分别针对不同内核架构的开发板,其中Keil MDK针对ARM内核,所以我们使用Keil MDK作为STM32开发的IDE。

Keil µVision目前版本迭代到Keil µVision5,其中的每种IDE也有自己的版本迭代,不过由于被ARM收购,近几年Keil µVision的更新主要集中在Keil MDK,其它几种内核的IDE几乎没怎么更新。

其实是可以让Keil µVision同时兼容多个内核的,后文安装完Keil MDK会介绍怎么兼容Keil C51。

双击安装mdk540.exe,选择安装路径

10

用户信息可以随便输,不输中文就行

11

File选项卡->License Management打开证书管理,复制CID。打开Keygen,填入CID,Target选择ARM,其余不变,点击Generate生成License ID Code。

12

以管理员身份运行Keil MDK,填入LIC后点击Add LIC添加证书

13

双击安装STM32F4X和STM32F1X的芯片支持包Keil.STM32F4xx_DFP.2.12.0.packKeil.STM32F1xx_DFP.2.1.0.pack。芯片支持包可以从Keil官网下载,参考该文章

14

在联网的情况下,也可以通过UV4目录中的Pack包管理工具PackInstaller.exe安装和管理芯片包。Keil也会自动识别工程对应的芯片包,如果没有安装,打开工程时会提醒是否要安装,选择直接安装即可。如图,左侧选择芯片型号,右侧显示所选型号对应的芯片包以及一些通用包,可以安装、更新和删除。

15

Compiler Version5编译器

从Keil MDK5.37开始,编译器由Compiler Version5更新为Compiler Version6,这导致高版本Keil MDK不兼容旧版本的工程文件。所以需要手动安装Compiler Version5编译器。

ARMCC文件夹复制到MDK安装目录的Arm文件夹中

16

打开测试工程

17

添加新编译器,路径是刚刚复制的ARMCC

18

点击魔术棒切换至Compiler Version5编译器

19

编译测试工程进行测试

20

兼容C51(非必要)

双击兼容C51文件夹中的KeilC51安装包c51v959.exe。KeilMDK位于F盘,KeilC51也安装到F盘

21

用户信息和KeilMDK安装的时候相同

22

将C51文件夹复制到Keil5 MDK的安装目录中

23

将KeilC51的UV4目录中所有文件Ctrl+A全选后复制到KeilMDK的UV4目录中,对于同名文件选择跳过

24

将KeilC51中TOOLS.INI的内容全部复制到KeilMDK的TOOLS.INI末尾,将PATH修改为KeilMDK中C51文件夹的路径

25

打开Keil5MDK的License Management,复制CID到Keygen中,Target选择C51,生成LIC

26

以管理员身份打开KeilMDK,打开License Management,复制粘贴后ADD LIC

27

兼容C51成功

STM32CubeMX

STM32CubeMX介绍

HAL库和LL库介绍

STM32四种库对比:寄存器、标准外设库、HAL、LL

STM32开发有四种可选的库,STM32CubeMX工具基于HAL和LL库,具体介绍参考上面的链接

  • STM32Snippets(寄存器)
  • Standard Peripheral Library(SPL,标准外设库)
  • STM32Cube LL
  • STM32Cube HAL

简单来说,STM32CubeMX是一个官方的用于帮助确定STM32 MCU&MPU以及外设的信息并基于STM32Cube LL和HAL库进行初始化C代码、驱动程序、中间件、设备树等代码生成的图形化工具,可以大大缩短开发时间。

28

安装需要jre环境,这里不多介绍。

配置完java环境后双击STM32CubeMX后更改安装目录,一路NEXT即可。

安装完成后点击Manage embedded software packages打开软件包管理界面

29

安装STM32F1x和STM32F4x的软件包

30

VsCode辅助

Keil5的代码开发辅助功能不如Vscode强大,所以我们可以利用Vscode插件把代码编辑的场景从Keil迁移到Vscode,编译和调试依旧使用Keil5。

先安装windows上的c语言编译器,把mingw64文件夹中bin目录的路径添加到系统环境变量,在cmd中输入gcc -v,显示mingw64版本说明安装成功

31

VsCode中安装以下插件

  • c/c++

  • C/C++ Extension Pack

  • Keil Assistant

进入Keil Assistant的设置界面,填入Keil5MDK中的UV4.exe路径,如果完成了兼容C51的操作,可以把C51的也填了

32

安装完成后会出现KEIL UVISION PROJECT选项,选中后点击右侧的图标,选择keil工程文件打开

33

识别成功,左下角可以编译和烧录程序,但是使用的编译器和仿真器等具体的参数需要在Keil MDK中设置,所以只建议使用VsCode作为代码编辑器,编译和烧录依然通过Keil。

34

Reference

STM32F407VET6单片机详解

一文搞明白STM32芯片存储结构

STM32&ARM体系结构(嵌入式学习)

List of ARM processors

JTAG、SWD、DAP、STLink、JLink、ULink这些东西的关系

你了解JLink、ST-Link、ULink、JTAG、SWD、SWIM的区别吗

STM32三种调试工具CMSIS-DAP、J-Link和ST-Link

单片机程序烧录的3种方式(ISP、ICP、IAP)是什么? - 知乎

Keil5安装+STM32CubeMX安装+VSCode辅助开发教程

Keil的发展历史

[[ST官网]STM32F407/417: 相关PDF文档](STM32F407/417: 相关PDF文档)

Keil MDK 与 Keil C51 共存的方法

STM32之CubeMX学习笔记(1)什么是CubeMX 什么是HAL库


嵌入式基础及STM32开发入门
https://lkliki.github.io/2024/11/11/嵌入式基础及STM32开发入门/
作者
0P1N
发布于
2024年11月11日
许可协议