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 微控制器内部的两条低速外设总线,负责连接中低性能外设。

(外设部分先了解一下,后续讲解)

  • APB1:连接低功耗、低速外设,如 USART2-5、I2C、SPI2/3、RTC、看门狗等。
  • APB2:连接高速外设,如 USART1、SPI1、ADC、高级定时器(TIM1/TIM8)等。
  • 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

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32核心知识入门指南:标准库、HAL库与STM32CubeMX零基础详解

    发表回复