STM32 ——嵌入式 存储系统、时钟系统(F407 系列)

引言

本文基于 STM32F407 系列芯片,详细拆解嵌入式系统核心的存储系统与时钟系统。存储系统是数据和程序的 "仓库",时钟系统是设备同步工作的 "节拍器",两者共同支撑嵌入式设备稳定运行。文中将补充细节说明、规范格式,并优化代码可读性,适合嵌入式开发入门及实战参考。

2.1 嵌入式存储系统概述

存储系统是嵌入式计算机系统的核心组成部分,用于满足不同类型数据的临时或永久存储需求,是程序运行和数据处理的基础。

2.1.1 核心作用

  • 存储程序代码:嵌入式设备上电后,CPU 会从存储介质中读取指令并顺序执行。

  • 存储运行时数据:包括程序运行过程中产生的变量、堆栈数据,以及传感器采集的临时数据。

  • 存储持久化信息:系统配置参数、用户自定义设置等,要求掉电后数据不丢失。

2.1.2 存储介质分类

嵌入式存储介质按 "掉电后数据是否保留" 分为易失性存储器非易失性存储器两大类,具体分类及特性如下:

1. 易失性存储器(RAM)

随机访问存储器(RAM)掉电后数据立即丢失,按存储机制分为 DRAM 和 SRAM:

特性 DRAM(动态随机存储器) SRAM(静态随机存储器)
存储原理 利用电容存储电荷(电荷有无代表 1/0) 利用触发器电路存储数据
存取速度 较慢 较快
集成度 较高 较低
生产成本 较低 较高
是否需要刷新 是(定期补充电容电荷) 否(电路稳定保持数据)
常见类型 DDR SDRAM、DDR2/3 SDRAM 等 片内 SRAM、缓存 Cache 等
2. 非易失性存储器

掉电后数据长期保留,核心类型包括 ROM、Flash、机械硬盘、光盘等,其中 Flash 是嵌入式系统的主流选择:

存储类型 核心特性 典型应用场景
MASK ROM 出厂时固化数据,不可修改 批量生产的固定程序存储
OTPROM 一次可编程,写入后不可修改 低成本、固定参数存储
PROM 可一次性编程,需专用设备 早期工业控制设备
EPROM 可擦除重写(需紫外线照射) 早期开发板、实验设备
EEPROM 电可擦除重写,字节级操作 小容量配置参数存储(如 I2C 接口)
NOR Flash 支持随机访问,读取速度快 固件、操作系统、配置数据存储
NAND Flash 不支持随机访问,容量密度高 大数据存储(音视频、文件系统)
机械硬盘 / 光盘 容量大、成本低,速度较慢 外部扩展存储(如嵌入式 PC)

注意:STM32F407 系列默认使用 NOR Flash,支持随机访问特性,因此程序可直接在 Flash 中运行(无需拷贝到 RAM)。

2.1.3 STM32F407 片内存储详情

STM32F407VET6 芯片内置 192KB SRAM,按功能划分为三部分,各司其职:

  • 主 SRAM(128KB):最常用的存储区域,用于存放全局变量、局部变量、函数堆栈等运行时数据。

  • CCM RAM(64KB):内核专属 RAM,不经过总线矩阵,访问速度更快。需通过关键字指定变量存储位置,示例代码:

    cpp 复制代码
    // 定义存储在CCM RAM中的高速缓冲区
    uint32_t __attribute__((section(".ccmram"))) high_speed_buffer[1024];
  • 备份 SRAM(16KB):需通过备份域供电,掉电后可通过备用电源(如纽扣电池)保持数据,适合存储关键配置参数。

2.1.4 嵌入式存储体系架构

嵌入式存储系统以 CPU 为核心,融合片内和片外存储资源,形成 "速度递减、容量递增、成本递减" 的分层架构:

  1. 缓存(Cache):速度最快、容量最小,用于缓存 CPU 频繁访问的指令和数据,减少主存访问延迟。
  2. 主存储器(SRAM/SDRAM):速度较快,用于存放程序运行时的变量、堆栈等临时数据。
  3. 程序存储器(Flash):速度中等,用于存储固件、操作系统等可执行代码。
  4. 外部扩展存储器(eMMC、SD 卡等):容量大、成本低,用于存储大量用户数据、大型应用程序。
存储体系工作流程
  • 系统上电后,CPU 从程序存储器(如 NOR Flash)的固定地址取出第一条指令。
  • 指令和高频访问数据被加载到 Cache 和 CPU 寄存器中,提升执行效率。
  • 程序运行时产生的变量、堆栈数据实时写入主存储器(SRAM/SDRAM)。
  • 当需要运行大型应用或访问海量数据时,系统从外部扩展存储器(如 eMMC)读取数据到主存供 CPU 处理。

2.2 嵌入式时钟系统

时钟系统是嵌入式设备的 "心脏节拍器",为 CPU 和外设提供同步工作的时间基准,没有时钟信号,CPU 和外设无法协调运行。

2.2.1 时钟信号的定义

时钟信号是具有固定周期的方波信号,通过高低电平的周期性交替,为数字电路提供同步时序。信号的周期决定时钟频率,频率越高,CPU 执行指令的速度越快。

2.2.2 时钟系统的核心作用

时钟信号是 STM32 各模块协同工作的 "时间基准",主要承担以下角色:

  • CPU 指令执行 :Cortex-M4 内核执行指令分为取指令、译码、执行三个阶段,时钟信号控制执行节奏。若一个周期执行一条指令,频率越高则单位时间内执行的指令数越多。
  • 外设控制:STM32 的 GPIO、UART、定时器等所有外设均通过寄存器操作,寄存器值修改、外设功能触发必须在时钟信号配合下完成。
  • 数据传输同步:串行通信(如 UART、SPI)需依赖时钟同步收发双方,确保数据正确传达。
  • 定时与计数:时钟是 "时间的标尺",通过计数时钟周期可实现定时(如定时器中断)和计数功能。

2.2.3时钟源分类

为解决功耗浪费 (外设时钟无用时持续耗电)和速度兼容(不同外设工作频率差异大)问题,STM32 采用 "多时钟源 + 按需分配" 设计。四类核心时钟源对比如下:

时钟源 名称 材质 / 实现 频率范围 典型应用
HSE 外部高速振荡时钟 石英晶体(精度高) 4-26MHz(常用 8MHz) 系统主时钟(经 PLL 倍频)
LSE 外部低速振荡时钟 石英晶体 32.768KHz RTC 实时时钟、低功耗定时
HSI 内部高速振荡时钟 RC 振荡电路(精度低) 16MHz 系统时钟备份、启动阶段时钟
LSI 内部低速振荡时钟 RC 振荡电路 32KHz 独立看门狗、低功耗模式时钟

2.2.4时钟树与 PLL 锁相环

时钟树概念

微控制器的时钟传输路径如同 "大树的养分流动":从外部晶振输入开始,经分频、倍频后分配到 CPU、外设、总线等各模块,这一路径称为时钟树

PLL 锁相环(倍频核心)

PLL(锁相环)是 "倍频" 核心,可将 HSE/HSI 的低频信号放大到高频。例如,STM32F407 的 168MHz 系统主频即由8MHz HSE + PLL 倍频实现。

2.2.5RCC - 时钟的总控制器

RCC(Reset and Clock Control,复位与时钟控制)是管理 STM32 "时钟" 与 "复位" 的核心外设,通过寄存器集合实现所有时钟操作。

RCC 寄存器结构(关键模块)

cpp 复制代码
typedef struct {
  __IO uint32_t CR;        // 时钟控制:使能HSE/HSI、检测时钟就绪
  __IO uint32_t PLLCFGR;   // PLL配置:设置分频/倍频系数(M/N/P/Q)
  __IO uint32_t CFGR;      // 时钟配置:选择系统时钟源、总线预分频
  __IO uint32_t CIR;       // 时钟中断:使能时钟就绪中断
  __IO uint32_t AHB1RSTR;  // AHB1外设复位
  __IO uint32_t AHB2RSTR;  // AHB2外设复位
  __IO uint32_t AHB3RSTR;  // AHB3外设复位
  uint32_t RESERVED0;      // 保留位
  __IO uint32_t APB1RSTR;  // APB1外设复位
  __IO uint32_t APB2RSTR;  // APB2外设复位
  uint32_t RESERVED1[2];   // 保留位
  __IO uint32_t AHB1ENR;   // AHB1外设时钟使能(如GPIOA、DMA)
  __IO uint32_t AHB2ENR;   // AHB2外设时钟使能
  __IO uint32_t AHB3ENR;   // AHB3外设时钟使能
  uint32_t RESERVED2;      // 保留位
  __IO uint32_t APB1ENR;   // APB1外设时钟使能(如UART2、TIM2)
  __IO uint32_t APB2ENR;   // APB2外设时钟使能(如UART1、TIM1)
  // 低功耗、备份域等寄存器略
} RCC_TypeDef;

RCC 的核心功能

  1. 使能时钟源 :通过CR寄存器操作(如RCC->CR |= RCC_CR_HSEON使能 HSE)。
  2. 配置 PLL :通过PLLCFGR设置分频系数(M)、倍频系数(N)、系统时钟分频系数(P)。
  3. 使能外设时钟 :通过AHBxENR/APBxENR(如RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN使能 GPIOA 时钟)。
  4. 选择系统时钟源 :通过CFGR寄存器选择 PLL、HSE 或 HSI 作为 SYSCLK。
相关推荐
llilian_162 小时前
晶振有什么好用的检测仪器?石英晶振测试仪 晶体测试仪
服务器·单片机·嵌入式硬件·其他
FreakStudio3 小时前
串口协议解析实战:以 R60ABD1 雷达为例,详解 MicroPython 驱动中数据与业务逻辑的分离设计
python·单片机·pycharm·嵌入式·面向对象·硬件·电子diy
brave and determined3 小时前
可编程逻辑器件学习(day24):异构计算:突破算力瓶颈的未来之路
人工智能·嵌入式硬件·深度学习·学习·算法·fpga·asic
ACP广源盛139246256736 小时前
GSV2201S(1201S)@ACP#支持嵌入式 MCU 的 DisplayPort 1.4 到 HDMI 2.0 转换器
单片机·嵌入式硬件·电脑·音视频
d111111111d6 小时前
MPU6050简介(学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习
芯岭技术14 小时前
不到一块钱的带USB 2.4G收发 SOC芯片,集成2.4G射频 32位MCU
单片机·嵌入式硬件
普中科技15 小时前
【普中DSP28335开发攻略】-- 第 15 章 外部中断实验
单片机·嵌入式硬件·开发板·外部中断·dsp28335·普中科技
IT阳晨。15 小时前
【STM32】ADC
stm32·单片机·嵌入式硬件
纳祥科技17 小时前
方案分享:一款基于高性能单片机的落日灯方案
单片机·嵌入式硬件