STM32核心知识入门指南:标准库、HAL库与STM32CubeMX零基础详解
初识STM32,那肯定要先了解它是什么,长话短说进入正文!
STM32是什么,是一款来自意法半导体公司生产的32位微控制器系列产片,这里小楽就不多介绍了。
那刚接触嵌入式或其他同学就该疑惑了,为什么叫STM32?32位是什么?微控制器(MCU)又是什么?那小楽将一一解答。
各位,各位集中注意力!
一.STM32的介绍
一.微控制器(MCU)是什么
咱来先解决微控制器!
微控制器呢!是一种集成了多种功能模块的 嵌入式专用计算机芯片,广泛应用于各类电子设备的控制场景中。它将很多部件(这里的部件暂时先不急着介绍,容量有点大)集成在单个芯片上,具备完整的最小系统能力,可独立实现特定控制任务。
二.为什么叫STM32与32位是什么
ST:代表意法半导体公司(是世界上最大的半导体公司之一)
M:是 Microelectronics 的缩写,表示微控制器。
32:指的是该微控制器的核心处理器(核心处理器 指的是由 ARM 公司设计的 Cortex-M 系列内核)的数据处理位数
那么想必你也知道了为啥命名为STM32了吧!
哎,同学别急着走,STM32的系列还没介绍呢!这里以STM32F103C8T6为例:
三.STM32系列产品命名规则(上图!)来源于STM32参考手册

一.产品类型补充:
F:通用高性能系列 L:低功耗系列 G:超值型 / 混合信号系列 以及(H,WB,WL,U5)等
二.闪存存储器补充:
这里的存储器是指Flash存储器,是STM32芯片的核心组件之一。
有什么用呢:你们所写的部分代码,还有一些C语言的常量,对各种硬件的配置等会被存储其中,
(主要用于存储用户的程序代码,常量数据以及一些配置信息等)。
至于Flash是一种闪存存储器,是一种非易失性存储器,通俗来讲就是在芯片断电后也能保留存储的数据。
①.存储器补充:SRAM(下文中就不介绍了)
SRAM:静态随机存储器,是一种高速,低功耗的存储器,用于存储程序运行时的临时变量、堆栈数据、函数调用上下文等!
例如以下代码会保存在SRAM中:
int a = 10; // 变量a存储在SRAM中
float buffer[100]; // 数组buffer占用SRAM空间
②.更好的了解Flash和SRAM在STM32存储的内容
/*
Flash 存储内容:
1.程序代码:.c 文件编译后的机器指令
2.只读数据:常量(const修饰的变量)、字符串字面量
3.初始化数据:已初始化的全局变量和静态变量的初始值
*/
/*
SRAM 存储内容:
1.运行时数据:未初始化的全局变量和静态变量
2.栈(Stack):函数调用上下文、局部变量
3.堆(Heap):动态分配的内存(如malloc()分配的空间)。
*/
// main.c,
const int VERSION = 123; // 存储在Flash,这里是常量
int global_init = 456; // 初始值存储在Flash
int global_uninit; // 不占Flash空间,运行时在SRAM
static int static_var = 789; // 初始值存储在Flash
void func(void)
int local = 10; // 存储在栈(SRAM)
static int static_local = 20; // 初始值存储在Flash
const char* msg = "Hello"; // 字符串字面量在Flash,指针在栈
}
int main(void) {
int* heap_ptr = malloc(100); // 堆空间在SRAM
// ...
}
| 变量 / 代码 | 存储区域 | 说明 |
|---|---|---|
VERSION |
Flash | 常量数据 |
global_init初始值 |
Flash | 已初始化全局变量的初始值 |
global_uninit |
SRAM | 未初始化,运行时默认置 0 |
static_var初始值 |
Flash | 静态变量初始值 |
func()和main()代码 |
Flash | 函数机器指令 |
local |
SRAM(栈) | 局部变量 |
static_local初始值 |
Flash | 静态局部变量初始值 |
字符串"Hello" |
Flash | 字符串字面量 |
msg指针 |
SRAM (栈) | 指向 Flash 中的字符串 |
heap_ptr分配的空间 |
SRAM (堆) | 动态分配的内存 |
三.封装补充
封装是对芯片保护的方式,一般不同封装引脚的样式不同(指将芯片或其他电子元件包裹在一个保护壳呢,以提供电器连接、物理保护和散热等功能的技术。)
封装的具体介绍这里就不多说了。
二:STM32的系统结构(重点)
接下来,小楽先着重介绍一下系统结构,先上图!

图自顶向下讲解:
①先介绍组成(各位暂时先了解个大概不用深究,摘抄于STM32参考手册)
不要深究,毕竟小楽也就是整理出来,用到时查资料即可,重点我会在剖析时整理出来。
Cortex-M3便是上文介绍过的核心处理器内核,是芯片的 “大脑”,负责执行指令、处理数据和协调各模块工作 。
| 核心型号 | 性能特点 | 典型应用场景 |
|---|---|---|
| Cortex-M0/M0+ | 低功耗、低成本,主频≤48MHz | 简单控制、传感器节点 |
| Cortex-M3 | 中等性能,支持 RTOS | 工业控制、消费电子 |
| Cortex-M4 | 带 FPU 和 DSP 指令集 | 电机控制、音频处理 |
| Cortex-M7 | 高性能(主频≥200MHz) | 图形处理、复杂算法 |
| Cortex-M33 | 安全架构(TrustZone) | 金融支付、医疗设备 |
| Cortex-M55 | 机器学习加速(Helium 架构) | 边缘计算、AIoT |
1.ICode总线:该总线将Cortex-M3内核的指令总线于闪存指令接口(Flash接口)相连接。指令预取在此总线上完成。
2.DCode总线:该总线将Cortex-M3内核的DCode总线于闪存存储器的数据接口相连接(常量加载和调试访问)
3.System(系统总线):此总线连接Cortex-M3内核的系统总线(外设总线)到总线矩阵,总线助阵协调着内核和DMA间的访问
4.DMA总线:将DMA的AHB主控接口于总线矩阵相联,总线矩阵协调这着CPU的DCode和DMA到SRAM、闪存和外设的访问。
5.总线矩阵(Bus Matrix)是:STM32 微控制器内部的核心通信枢纽,负责协调多个主设备(如 CPU、DMA 控制器)对存储器和外设的访问
6.FSMC(Flexible Static Memory Controller,灵活静态存储控制器)是: STM32 系列中部分高性能型号(如 STM32F4、STM32F7)提供的外部存储扩展接口,支持连接多种静态存储器,如 SRAM、NOR Flash、NAND Flash 和 LCD 控制器等。
7.AHB(Advanced High-performance Bus)系统总线:ARM Cortex-M 系列微控制器(如 STM32)内部的高速数据传输通道,负责连接 CPU、存储器和高性能外设。
8.APB1(Advanced Peripheral Bus 1)和 APB2 是:STM32 微控制器内部的两条低速外设总线,负责连接中低性能外设。
(外设部分先了解一下,后续讲解)
9.SDIO(Secure Digital Input/Output)是:一种广泛应用于嵌入式系统的通信接口,主要用于连接安全数字(SD)存储卡、SDIO 外设(如 Wi-Fi 模块、蓝牙模块)等。
10.桥接(Bridge) 是连接不同总线(如高速 AHB 与低速 APB)的关键组件,负责实现数据传输的速率适配、协议转换和时序协调。
11.RCC(Reset and Clock Control,复位与时钟控制)是 STM32 微控制器的核心组件,负责管理系统时钟源、外设时钟分配及复位控制。
②对STM32系统结构浅浅剖析
首先呢,小楽需要给各位,将这个图分成几个部分进行讲解。
上图:

这里可以把双箭头看成两个线,有发送有接收嘛。
I(Instruction)Code:指令总线
D(Data)Code:数据总线
Flash接口:即是Flash接口控制器FPEC(Flash Programming and Erase Controller),用于管理内部Flash存储器擦除和编程操作的硬件模块,它提供了一套寄存器接口,允许Cortex-M类内核通过特定时序和命令对Flash进行操作。
这一部分所表示的含义:内核通过两个总线(ICode,DCode总线)依托Flash接口分别对Flash取指令和访问数据,实现读写程序,读写指令的功能。
就小楽的一句话:有了Flash接口,便有了一个工具让内核能够正确通过指令和数据总线读写一些内容,从而处理数据,执行指令,控制整个系统运行。

先介绍总线矩阵:它没有什么具体含义,但是却具备很重要的功能,它是这个系统的交通枢纽负责管理各个总线的访问,主要用于管理多个主设备和从设备之间的总线访问冲突,内部有仲裁机制来决定哪个主设备先获得总线控制权。
就是,当有多个主设备(CPU,DMA控制器等)访问一个从设备(Flash,SRAM,外设寄存器等),这个从设备就不知道该接收哪个主设备的访问了,这时总线矩阵就该发挥它的作用,来,咱先做个仲裁,看谁的个子高(通常来看是优先级)谁就先访问从设备,来达到主从设备之间的数据传输有序进行,防止数据冲突导致,数据错乱。
这个图来看:总线矩阵接收来自CPU(Cortex-M3)的System,DMA,DCode,DMA1,DMA2等总线的请求,可以向(图未展示,可参考上面的系统结构图)Flash接口,SRAM,FSMC等存储和控制单元分配总线使用权。
看完这两个图,就要明确,无论是ICode,DCode,System,DMA总线,还是未曾讲述过的AHB系统总线等,这些总线是为了传输数据,从而向存储单元,外设寄存器等读取和写入数据。起着传输数据的作用。
各位可以将总线简单的看成传输数据的线,总线矩阵控制传输的数据不发生错乱。
继续上图!

用这个图简单梳理一下。前面的内核,DMA1,DMA2暂时就先不放在图片中了。
1.内核可以通过ICode总线来借助Flash接口读取Flash中的指令(至于内核是如何具体访问Flash,这里暂时就先不讲解了)。
2.内核可以通过DCode总线,同样借助Flash接口访问flash中的常量数据(可以联系上文讲到的flash存储哪些数据)
3.内核可以通过System总线,连接SRAM,flash,外设等一些组件,用于运行时数据交互
4.DMA总线是直接内存访问总线,在通过总线矩阵的仲裁后,可以直接访问Flash,SRAM,外设寄存器的数据,为内核分担工作量(内核在运行时往往要做很多事情,DMA的出现可以使内核减少一些工作量,例如读取某些外设寄存器中的内容便可由DMA来完成,内核就省了这份心),提升数据传输效率。
5.至于flash,SRAM,FSMC等知道它们是存储器便可。
6.AHB,APB1,2可以查看相关定义。(但是,重要的部分反而就是挂载在APB2,APB1上的外设),这里就是看成APB2,APB1的外设某些寄存器等的内容需要通过AHB总线与内核,与存储器进行信息交互。
以上,粗略的介绍完毕,了解即可!(汗。感觉逻辑混乱,这篇本意是复习加深巩固,以应对面试,同时作为笔记来记录,感谢观看)
明天是标准库,hal库环境的搭建!
作者:yuaiyue