STM32基础知识学习笔记:ICODE、DCODE、DMA等常见名词的解释
基于AI生成内容。
ICODE
ICODE:指令总线(Instruction Bus) 主要用于处理 CPU 对程序指令的读取操作。它是 STM32 存储架构中重要的组成部分,与数据总线(DCODE)、系统总线(System Bus)等共同构成了内部存储访问机制。
ICODE 的核心作用
指令读取专用通道
STM32 的 CPU(如 Cortex-M 系列)通过 ICODE 总线从程序存储器(通常是 Flash)中读取指令,实现指令的预取和执行。这一总线与数据访问的 DCODE 总线分离,采用哈佛架构设计,可同时进行指令读取和数据操作,提高了系统运行效率。连接程序存储器
ICODE 总线主要连接到 STM32 的内置 Flash 存储器(程序区),也可能通过外部存储器接口(如 FMC)扩展到外部 Flash,用于读取存储在外部的程序指令。与指令缓存(ICache)配合
部分高性能 STM32 型号(如 STM32H7 系列)配备了指令缓存(ICache),ICODE 总线的数据会先经过 ICache,减少对 Flash 的直接访问次数,提升指令执行速度(尤其在高频运行时)。
与 ICODE 相关的 STM32 存储架构
STM32 的存储架构中,ICODE 与其他总线的分工明确:
- ICODE:指令读取(从 Flash 或外部程序存储器)。
- DCODE:数据读取(从 Flash 中的常量数据区或只读数据)。
- 系统总线(System Bus):访问 SRAM、外设寄存器等。
- DMA 总线:DMA 控制器的数据传输专用通道。
这种分离架构避免了指令和数据访问的冲突,提高了 CPU 效率,尤其适合实时性要求高的嵌入式应用。
DCODE
DCODE: 数据指令总线(Data Code Bus),是 STM32 存储架构中专门用于读取常量数据的总线,与负责读取程序指令的 ICODE 总线共同构成了哈佛架构的指令和数据分离访问机制。
DCODE 的核心作用
常量数据读取专用通道
DCODE 总线主要用于 CPU 从程序存储器(通常是 Flash)中读取只读数据(常量),例如代码中定义的全局常量、字符串字面量等(存储在 Flash 的.rodata
段)。
这种设计与 ICODE 总线(读取指令)分离,实现了指令读取和数据读取的并行操作,提升了系统效率。与 Flash 数据区的交互
在 STM32 中,Flash 不仅存储程序指令,还存储常量数据。当 CPU 需要访问这些数据时(而非执行指令时),会通过 DCODE 总线进行读取,避免与 ICODE 总线的访问冲突。支持数据缓存(若有)
部分高性能 STM32 型号(如 STM32H7 系列)配备了数据缓存(DCache),DCODE 总线的数据访问会经过 DCache,减少对 Flash 的直接访问,提升常量数据的读取速度。
与其他总线的分工
STM32 的总线架构中,DCODE 与其他总线各司其职:
- ICODE:读取程序指令(从 Flash 的代码区)。
- DCODE:读取 Flash 中的常量数据(如全局常量、字符串)。
- 系统总线(System Bus):访问 SRAM、外设寄存器、片上外设等。
- DMA 总线:DMA 控制器的数据传输专用通道,不经过 CPU。
这种分离设计充分利用了哈佛架构的优势,使指令流和数据流可以并行处理,提高了 CPU 的执行效率。
SRAM
SRAM(Static Random Access Memory,静态随机存取存储器) 是一种常见的半导体存储器,在 STM32 等嵌入式系统中作为运行时数据存储器使用,具有读写速度快、无需刷新的特点,是系统运行的核心存储部件之一。
SRAM 的核心特点
静态存储
与需要定期刷新的 DRAM(动态 RAM)不同,SRAM 通过触发器电路(由晶体管组成)保存数据,只要供电正常,数据就会一直保持,无需刷新操作,简化了硬件设计。高速访问
SRAM 的读写速度远快于 DRAM 和 Flash,通常与 CPU 主频匹配,可直接作为 CPU 的高速缓存或主数据存储器,适合存储需要频繁访问的临时数据(如变量、堆栈、程序运行时的中间结果等)。结构与容量
- 每个存储单元由多个晶体管(通常 6 个)组成,结构复杂,集成度低,相同面积下容量远小于 DRAM 或 Flash。
- STM32 内置 SRAM 容量通常从几 KB(如 STM32F0 系列)到几百 KB(如 STM32H7 系列),若需更大容量,可通过 FSMC 等接口扩展外部 SRAM。
易失性
SRAM 是易失性存储器,断电后数据会立即丢失,因此无法用于长期存储程序或数据(需依赖 Flash 等非易失性存储器)。
SRAM 在 STM32 中的作用
程序运行时数据区
STM32 执行程序时,全局变量、局部变量、函数堆栈等动态数据均存储在内部 SRAM 中,CPU 通过系统总线高速访问这些数据,保证程序高效运行。外设数据缓存
对于需要高速处理的外设数据(如 ADC 采样数据、DMA 传输的缓冲区),通常会暂存在 SRAM 中,减少 CPU 等待时间。扩展外部 SRAM
当内置 SRAM 容量不足时(如处理大量图像数据、复杂算法缓存),可通过 FSMC 接口扩展外部 SRAM,扩展容量可达数十 MB(取决于 STM32 的地址线数量)。
STM32 中 SRAM 的类型与布局
部分 STM32 型号(如 F4、H7 系列)的内置 SRAM 分为多个块,支持不同访问特性,例如:
- 普通 SRAM:用于一般数据存储,可被 CPU 和 DMA 访问。
- CCM SRAM(Core Coupled Memory):与 CPU 内核紧密耦合的 SRAM,仅能被 CPU 访问(不支持 DMA),访问延迟更低,适合存储对速度要求极高的数据(如实时算法的临时变量)。
实际开发中的注意事项
容量规划
开发时需根据程序对动态内存的需求(如变量数量、堆栈大小、缓冲区尺寸)选择合适 SRAM 容量的 STM32 型号,避免内存溢出(可通过编译器优化或外部扩展解决)。访问效率
- 内置 SRAM 访问速度最快(通常与 CPU 同频),优先使用。
- 外部 SRAM 受 FSMC 总线速度和时序限制,访问速度略低,适合存储非实时性数据。
低功耗管理
在 STM32 的低功耗模式(如 STOP 模式)下,可配置 SRAM 是否断电:- 保留 SRAM 供电:数据不丢失,但功耗较高。
- 关闭 SRAM 供电:数据丢失,但功耗更低。需根据应用的低功耗需求选择。
外部 SRAM 扩展
若扩展外部 SRAM,需通过 FSMC 配置正确的时序(地址建立时间、读写脉冲宽度等),并确保硬件连接的信号完整性(尤其高频场景)。
与其他存储器的对比
存储器类型 | 特点 | 用途 |
---|---|---|
SRAM | 高速、静态(无需刷新)、易失性、容量小 | 运行时数据存储(变量、堆栈、缓存) |
DRAM | 低速、需刷新、易失性、容量大 | 大容量数据存储(如计算机内存) |
Flash | 中速、非易失性、可擦写次数有限 | 存储程序代码、常量、配置信息 |
总之,SRAM 是 STM32 中负责高速临时数据存储的核心部件,其性能直接影响系统的运行效率,合理规划和使用 SRAM 是嵌入式开发中的重要环节。
Flash
Flash:闪存,是核心存储部件之一,主要用于存储程序代码、常量数据以及用户配置信息等,具有非易失性(断电后数据不丢失)的特点。它的性能和特性直接影响 STM32 的运行效率、功能扩展和可靠性。
STM32 Flash 的主要特点
存储类型与功能
- 主 Flash 区:用于存储用户应用程序代码,是 STM32 启动后执行程序的主要区域。
- 系统存储区(System Memory):固化了 STM32 的 bootloader(如 ISP 程序),用于通过 UART、SPI 等接口烧录程序(出厂时已由 ST 官方写入,不可修改)。
- 选项字节(Option Bytes):存储芯片配置信息(如读写保护、复位配置、时钟安全系统等),可通过特定指令修改。
容量与分区
- 容量范围广泛,从几 KB(如 STM32F0 系列)到数 MB(如 STM32H7 系列)不等,满足不同应用场景需求。
- 部分型号支持扇区(Sector) 或页(Page) 级分区,不同分区的大小可能不同(例如,小容量 STM32 的扇区可能为 1KB~16KB,大容量型号可能为 2KB~256KB)。
读写特性
- 编程(写入):需先解锁 Flash 控制器,按扇区 / 页擦除后才能写入(Flash 为 “先擦后写” 机制,擦除后默认值为 0xFF)。
- 擦除:支持扇区擦除、全片擦除(部分型号),擦除和写入操作需要特定的电压和时钟条件(参考数据手册)。
- 速度:写入和擦除速度受芯片型号、供电电压、时钟频率影响,通常写入速度为几 KB/ms,擦除速度为几十 ms / 扇区。
保护机制
- 读写保护(RDP):通过选项字节配置,防止未经授权读取或修改 Flash 内容(如 Level 1 保护禁止读取,Level 2 保护会锁定芯片)。
- 写保护(WRP):可对特定扇区设置写保护,防止意外擦除或写入。
低功耗特性
- 部分型号支持 Flash 在低功耗模式下的断电或部分断电,减少待机功耗。
Flash 操作的关键步骤(以编程为例)
在 STM32 中通过代码操作 Flash(如写入用户数据)的基本流程如下:
- 解锁 Flash:通过写入特定密钥(KEY1=0x45670123,KEY2=0xCDEF89AB)解锁 Flash 控制寄存器(FLASH_CR),否则无法进行擦除 / 写入操作。
- 擦除扇区 / 页:配置擦除目标扇区,触发擦除命令,等待操作完成。
- 写入数据:按半字(16 位)或字(32 位)为单位写入数据,等待写入完成。
- 锁定 Flash:操作完成后锁定 Flash,防止误操作。
实际开发中的注意事项
- 地址映射:STM32 的 Flash 地址从 0x08000000 开始(主 Flash 区),系统存储区和选项字节有独立的地址范围(参考具体型号数据手册)。
- 程序执行:STM32 复位后默认从 Flash 启动,程序在 Flash 中可直接执行(无需复制到 RAM),但部分高频场景可能需要将代码搬运到 RAM 运行以提升速度。
- 擦写寿命:Flash 的擦写次数有限(通常 10 万次以上),频繁擦写的场景(如存储日志)需设计磨损均衡算法。
- 中断与异常:Flash 操作期间应关闭中断(或确保操作不被打断),否则可能导致操作失败或数据损坏。
工具支持:可通过 ST-Link、J-Link 等调试器烧写 Flash,也可通过 bootloader 实现 OTA(空中升级)。
AHB
AHB(Advanced High-performance Bus,高级高性能总线) 是 ARM 公司提出的 AMBA(Advanced Microcontroller Bus Architecture,高级微控制器总线架构)中的高性能总线,主要用于连接高性能模块,承担高带宽、低延迟的数据传输任务。
AHB 系统总线的核心特点
高性能设计
AHB 支持突发传输、流水线操作和多主设备访问,数据宽度通常为 32 位(可扩展至 64 位或 128 位),传输速率高,能满足 CPU、DMA、高速外设等对带宽的需求。主要连接对象
在 STM32 中,AHB 总线通常连接系统中性能要求较高的模块,例如:- CPU 内核(如 Cortex-M 系列)
- 片内 SRAM 和 Flash 控制器(通过 AHB 访问存储器)
- DMA 控制器(直接存储器访问,减轻 CPU 负担)
- 高速外设(如 USB、以太网、SDIO 等)
- 总线矩阵(用于管理多主设备的访问仲裁)
总线层次结构
为平衡性能与复杂度,STM32 的 AHB 通常分为多层结构:- AHB 系统总线(AHB System Bus):连接 CPU、存储器控制器和总线矩阵,是系统核心传输通道。
- AHB 外设总线(AHB Peripheral Bus):扩展连接高速外设,部分型号通过 AHB-to-APB 桥接器连接低速的 APB(Advanced Peripheral Bus)外设。
仲裁与传输机制
AHB 支持多主设备(如 CPU 和 DMA 同时请求总线),通过总线仲裁器(Arbiter)按优先级分配总线使用权,确保高优先级任务(如实时中断服务)优先获得带宽。- 高效数据交互:作为系统核心总线,AHB 负责 CPU 与存储器、高速外设之间的快速数据传输,是 STM32 高性能运行的基础。
- 支撑实时性:通过流水线和突发传输机制,减少数据传输延迟,满足嵌入式系统对实时响应的要求。
- AHB vs APB:AHB 面向高速设备,APB 面向低速外设(如 UART、SPI、GPIO 等),两者通过桥接器通信,形成 “高速核心 + 低速扩展” 的总线架构。
APB
APB(Advanced Peripheral Bus,高级外设总线) 是 ARM 公司 AMBA(Advanced Microcontroller Bus Architecture)总线架构中的低速外设总线,主要用于连接 STM32 等微控制器中对传输速率要求不高的外设,与高性能的 AHB 总线配合,形成 “高速核心 + 低速外设” 的分层总线结构。
APB 的核心特点
低速低成本设计:APB 采用简单的时序逻辑,不支持突发传输和流水线操作,数据宽度通常为 32 位,传输速率较低(远低于 AHB),但硬件实现简单、功耗低,适合连接低速外设。
主要连接对象
在 STM32 中,APB 总线通常连接对带宽需求不高的外设,例如:
- 通用 I/O(GPIO)
- 串口(UART、USART)
- 同步通信接口(SPI、I2C)
- 定时器(TIM)、计数器
- 模数转换器(ADC)、数模转换器(DAC)
- 看门狗、实时时钟(RTC)等
总线层次与桥接
APB 本身不直接与 CPU 或高速存储器连接,而是通过AHB-APB 桥接器(如 STM32 中的 APB1 桥、APB2 桥)与 AHB 总线相连,实现高低速总线之间的数据交互。
部分 STM32 型号(如 F1、F4 系列)将 APB 分为两条总线:
- APB1:连接更低速的外设(如 UART、SPI、I2C 等),最大时钟频率通常为 36MHz(因型号而异)。
- APB2:连接相对高速的外设(如 GPIO、ADC、定时器等),最大时钟频率通常为 72MHz 或更高。
- 传输机制:APB 采用单周期传输模式,每次传输需等待前一次完成,时序简单:包含地址相位和数据相位,通过片选信号(SEL)、使能信号(ENABLE)等控制外设访问。
APB 在 STM32 中的作用
- 适配低速外设:为不需要高速传输的外设提供简单、低成本的连接方式,避免占用 AHB 总线的带宽。
- 简化外设设计:APB 时序简单,降低了外设控制器的硬件复杂度,适合大规模集成。
- 分层总线管理:通过 AHB-APB 桥隔离高低速设备,使系统设计更灵活,兼顾性能与功耗。
与 AHB 的对比
特性 | AHB | APB |
---|---|---|
传输速率 | 高(支持高频、突发传输) | 低(单周期传输,无突发) |
连接对象 | CPU、存储器、高速外设(USB 等) | 低速外设(GPIO、UART 等) |
复杂度 | 高(支持流水线、多主设备) | 低(简单时序,单主设备) |
功耗 | 较高 | 较低 |
总之,APB 是 STM32 中负责低速外设连接的 “辅助通道”,与 AHB 总线分工协作,既保证了系统核心的高性能,又兼顾了外设的低成本和低功耗需求,是嵌入式微控制器总线架构的重要组成部分。
DMA
DMA(Direct Memory Access,直接存储器访问) 是一种无需 CPU 干预,直接在外设与存储器之间或存储器与存储器之间传输数据的技术。它能显著减轻 CPU 负担,提高数据传输效率,尤其适用于需要高频数据交换的场景(如 ADC 采样、UART 通信、SPI 数据传输等)。
DMA 的核心作用
解放 CPU
传统数据传输需要 CPU 逐条指令处理(读取外设数据→存入内存,或反之),而 DMA 可独立完成整个传输过程,CPU 只需在传输开始前配置 DMA 参数,传输结束后通过中断(可选)得知结果,期间可执行其他任务。高效数据传输
DMA 直接通过总线与外设、存储器交互,传输速率仅受总线带宽和外设速度限制,适合大数据量、高频率的传输场景(如摄像头图像采集、音频处理等)。
STM32 中 DMA 的主要特性
多通道与请求源
STM32 的 DMA 控制器通常包含多个独立通道(如 STM32F1 系列有 DMA1 的 7 个通道和 DMA2 的 5 个通道),每个通道可对应不同的外设请求(如 ADC、SPI、UART、TIM 等),支持同时处理多个外设的数据传输。传输方向
支持三种基本传输方向:- 外设→存储器(如 ADC 数据存入 SRAM)
- 存储器→外设(如 SRAM 数据通过 SPI 发送)
- 存储器→存储器(如 SRAM 内部数据复制)
传输模式
- 单次传输:传输完成后停止,需重新配置才能再次传输。
- 循环传输:传输完成后自动重新开始,适合连续数据流(如 ADC 循环采样)。
数据宽度与地址增量
- 支持 8 位、16 位、32 位数据宽度,可灵活匹配外设和存储器的数据格式。
- 可配置地址是否自增(如传输数组时,存储器地址自动 + 1),支持外设地址固定(如外设寄存器)或存储器地址固定。
优先级管理
当多个 DMA 通道同时请求传输时,可通过软件配置优先级(高 / 中 / 低)或硬件默认优先级(通道号越小优先级越高)进行仲裁。
FSMC
FSMC(Flexible Static Memory Controller,灵活的静态存储器控制器) 是一种用于扩展外部存储器的接口控制器,支持连接多种静态存储设备,为 STM32 提供了灵活的外部存储扩展能力,适用于需要大容量存储或高速数据访问的场景(如嵌入式显示、数据日志记录等)。
FSMC 的核心功能与特点
支持多种存储器类型
FSMC 可兼容多种静态存储设备,包括:- SRAM(静态随机存取存储器):用于扩展临时数据存储空间。
- NOR Flash:用于存储程序或只读数据(支持 XIP,即 Execute In Place,程序可直接在 NOR 中运行)。
- NAND Flash:用于大容量数据存储(如日志、固件等)。
- PSRAM(伪静态随机存取存储器):结合了 DRAM 的密度和 SRAM 的接口特性。
- LCD 控制器:部分 STM32 型号(如 F1、F4 系列)的 FSMC 可直接驱动并行接口 LCD(通过特殊时序配置)。
灵活的时序配置
FSMC 允许通过寄存器配置多种时序参数(如地址建立时间、数据保持时间等),以匹配不同速度的外部存储器,确保数据传输的稳定性。多存储块划分
FSMC 将外部存储空间划分为 4 个独立的存储块(Bank),每个存储块可连接不同类型的存储器,且有独立的地址范围和配置寄存器,方便同时扩展多种存储设备。高速数据传输
基于 AHB 总线(通常为 AHB1),FSMC 支持高速数据传输,速率取决于系统时钟和外部存储器性能,可满足大多数嵌入式应用的带宽需求。
FSMC 的典型应用场景
- 扩展程序存储器:当 STM32 内置 Flash 容量不足时,可通过 FSMC 连接外部 NOR Flash 存储程序。
- 扩展数据存储器:通过连接 SRAM 或 PSRAM,扩展系统运行时的数据缓存空间。
- 大容量数据存储:利用 NAND Flash 的高容量特性,存储日志、图像、固件升级包等。
- 驱动并行 LCD:通过 FSMC 的特殊配置,直接控制并行接口的 LCD 显示屏(节省专用 LCD 控制器成本)。
FSMC 的基本工作原理
地址映射:FSMC 为每个存储块(Bank)分配固定的地址范围(如 Bank1 为 0x60000000~0x9FFFFFFF),CPU 访问这些地址时,FSMC 会自动将请求转换为外部存储器的读写操作。
时序控制:根据连接的存储器类型,配置 FSMC 的时序寄存器(如地址建立时间、数据保持时间、读写脉冲宽度等),确保与外部设备的时序匹配。
数据传输:CPU 通过 AHB 总线访问 FSMC 映射的地址,FSMC 将地址、数据和控制信号(如片选、读写使能)发送到外部存储器,完成数据交互。
示例配置思路(连接外部 SRAM)
硬件连接:将 STM32 的 FSMC 地址线(如 FSMC_A0~A18)、数据线(FSMC_D0~D15)、控制信号(如 FSMC_NWE、FSMC_NRD、FSMC_NE1)与外部 SRAM 的对应引脚连接。
初始化 FSMC:
- 使能 FSMC 时钟(通过 RCC 寄存器)。
- 配置 GPIO 为复用功能(连接 FSMC 的引脚)。
- 选择存储块(如 Bank1),配置存储器类型为 SRAM。
- 设置时序参数(根据 SRAM 数据手册的读写时序要求)。
访问外部 SRAM:直接通过指针操作 FSMC 映射的地址,例如:
// 外部SRAM在FSMC的映射地址(假设为Bank1的0x60000000) #define EXTERN_SRAM_ADDR ((uint32_t)0x60000000)// 向外部SRAM写入数据 uint16_t *sram_ptr = (uint16_t *)EXTERN_SRAM_ADDR; *sram_ptr = 0x1234; // 写入数据// 从外部SRAM读取数据 uint16_t data = *sram_ptr;
实际开发中的注意事项
- 时序匹配:FSMC 的时序配置是关键,需严格按照外部存储器的数据手册设置参数,否则可能导致数据读写错误。
- 硬件设计:外部存储器的布局、布线需考虑信号完整性(尤其高速传输时),避免信号干扰。
- 容量限制:不同 STM32 型号的 FSMC 支持的最大地址线数量不同,需根据需求选择合适的芯片(如需要扩展大容量 SRAM,需确保地址线足够)。
- LCD 驱动:若用于驱动 LCD,需将 FSMC 配置为 “虚拟 SRAM” 模式,通过特定时序模拟 LCD 的并行接口协议(如 8080 或 6800 时序)。
总之,FSMC 是 STM32 扩展外部存储器的重要接口,其灵活性和兼容性使其能适应多种存储设备,为需要大容量存储或特殊外设连接的嵌入式系统提供了便利。不同 STM32 系列(如 F1、F4、H7)的 FSMC 功能可能略有差异,实际开发中需参考具体型号的参考手册。
SDIO
SDIO(Secure Digital Device Interface,安全数字输入输出) 是一种专门用于与 SD 卡、MMC 卡(多媒体卡)及相关存储设备通信的高速接口,支持多种存储介质和通信速率,广泛应用于需要外部存储扩展的嵌入式系统(如数据记录仪、多媒体设备、便携式仪器等)。
SDIO 的核心功能与特点
支持多种存储介质
SDIO 接口兼容多种存储卡标准,包括:- SD 卡:标准 SD 卡(SD、SDHC、SDXC),支持大容量存储(最大可达 2TB 以上)。
- MMC 卡:多媒体卡,早期常用的小型存储介质。
- SDIO 卡:带 IO 功能的特殊 SD 卡(如 Wi-Fi 模块、蓝牙模块等,通过 SDIO 总线通信)。
高速传输能力
SDIO 支持多种通信模式,速率随模式提升:- SPI 模式:兼容 SPI 总线,速率较低(最高约 25MHz),但硬件实现简单。
- 1 位 SD 模式:使用 1 条数据线传输,速率较高(最高约 50MHz)。
- 4 位 SD 模式:使用 4 条数据线并行传输,速率可达 50MHz(部分型号支持高速模式,速率更高)。
高速模式下可满足大量数据的快速读写(如高清图像存储、日志记录等)。
与 STM32 的集成
STM32 多数中高端型号(如 F1、F4、H7 系列)内置 SDIO 控制器,通过 AHB 总线与 CPU 连接,支持 DMA 传输(减轻 CPU 负担),并可通过中断通知传输状态(如读写完成、错误等)。
SDIO 的典型应用场景
- 外部存储扩展:通过 SD 卡存储大量数据(如传感器日志、配置文件、固件升级包)。
- 多媒体数据处理:读取 SD 卡中的图像、音频文件并进行实时处理。
- 便携式设备:在手持仪器、数据采集终端中作为可移动存储接口。
SDIO 的基本工作原理
硬件连接:STM32 的 SDIO 接口通过专用引脚(如 CLK 时钟线、CMD 命令线、D0~D3 数据线)与 SD 卡连接,通常需要外接上拉电阻保证信号稳定。
通信协议:SDIO 基于命令 - 响应机制,通过 CMD 线发送命令(如初始化卡、读写数据),存储卡通过 CMD 线返回响应,数据通过 D0~D3 线传输。
数据传输流程:
- 初始化:上电后,STM32 通过 SDIO 控制器发送初始化命令,识别存储卡类型(SD/MMC)、容量、支持的速率等。
- 读写操作:通过命令指定读写地址和数据长度,数据通过数据线传输(可配置 DMA 自动完成)。
- 状态反馈:存储卡通过响应信号返回操作结果(成功 / 失败),STM32 可通过中断处理异常(如卡拔出、读写错误)。
实际开发中的注意事项
时钟配置:SDIO 时钟需根据存储卡支持的速率配置(通常由 PLL 分频得到),过高或过低都会导致通信失败。
电源管理:SD 卡工作时电流较大(尤其读写瞬间),需确保电源稳定,必要时增加电源滤波电容。
热插拔处理:若支持 SD 卡热插拔,需通过检测引脚(如卡检测开关)监控卡的插入 / 拔出状态,并在拔出时及时停止传输,避免数据损坏。
RCC
RCC(Reset and Clock Control,复位和时钟控制) 是一个核心的外设模块,负责管理整个芯片的时钟系统和复位功能。它通过配置不同的时钟源、分频系数和时钟分配,为 CPU、外设、总线等提供稳定的时钟信号,同时控制芯片的复位行为,是 STM32 正常工作的基础。
RCC 的核心功能
时钟管理
STM32 的时钟系统复杂但灵活,RCC 的主要作用是对时钟进行配置和分配,包括:- 时钟源选择:从多种时钟源(如内部 RC 振荡器、外部晶体振荡器、PLL 锁相环等)中选择合适的源。
- 时钟分频与倍频:通过分频器(如 AHB 分频器、APB 分频器)和 PLL(倍频器)调整时钟频率,满足不同模块的需求。
- 时钟分配:将处理后的时钟信号分配到 CPU、AHB 总线、APB 总线及各个外设(如 UART、SPI、ADC 等)。
复位控制
管理芯片的复位机制,包括:- 系统复位:触发整个芯片的复位(如外部复位引脚、看门狗复位、软件复位等)。
- 外设复位:单独复位某个外设(不影响其他模块),用于外设初始化或故障恢复。
STM32 的主要时钟源
RCC 支持多种时钟源,不同型号可能略有差异,常见的包括:
- HSI(High-Speed Internal Clock,高速内部时钟):内部 RC 振荡器,频率通常为 8MHz(部分型号更高),无需外部元件,启动快但精度较低。
- HSE(High-Speed External Clock,高速外部时钟):外部晶体 / 陶瓷振荡器(4~26MHz)或外部时钟信号,精度高,适合对时钟精度要求高的场景(如 USB、以太网)。
- LSI(Low-Speed Internal Clock,低速内部时钟):内部 RC 振荡器,频率通常为 40kHz,用于看门狗(IWDG)和实时时钟(RTC)。
- LSE(Low-Speed External Clock,低速外部时钟):外部 32.768kHz 晶体,用于 RTC,提供高精度的实时时钟基准。
- PLL(Phase-Locked Loop,锁相环):不是独立时钟源,而是将 HSI 或 HSE 的频率倍频(如 8MHz→72MHz、16MHz→180MHz),为系统提供高频时钟。
时钟树结构(以 STM32F1 为例)
STM32 的时钟通过 “时钟树” 进行分配,核心路径如下:
- 选择 HSE 或 HSI 作为 PLL 输入,经 PLL 倍频后生成PLLCLK(如 72MHz)。
- PLLCLK 作为SYSCLK(系统时钟) 的来源,直接驱动 CPU 内核。
- SYSCLK 经AHB 分频器生成HCLK(AHB 总线时钟),驱动 AHB 总线及连接的外设(如 SRAM、DMA)。
- HCLK 经APB1 分频器生成PCLK1(APB1 总线时钟),驱动低速外设(如 UART、I2C,最大 36MHz)。
- HCLK 经APB2 分频器生成PCLK2(APB2 总线时钟),驱动高速外设(如 GPIO、ADC,最大 72MHz)。
实际开发中的注意事项
- 时钟源选择:根据应用需求选择(如需要高精度时钟用 HSE,需快速启动用 HSI)。
- 频率限制:不同外设和总线有最大频率限制(如 APB1≤36MHz),配置时不可超限。
- Flash 延迟:高频时钟下需配置 Flash 读延迟(如 72MHz 时需 2 个等待周期),否则 Flash 访问会出错。
- 低功耗优化:可关闭未使用外设的时钟(通过 RCC 寄存器),降低系统功耗。
- 动态时钟调整:部分型号支持运行中切换时钟源(如从 HSI 切换到 HSE),用于低功耗场景。
总之,RCC 是 STM32 的 “时钟与复位中枢”,其配置直接影响系统的性能、稳定性和功耗,是嵌入式开发中必须掌握的核心模块。不同 STM32 系列(如 F1、F4、H7)的时钟树细节可能不同,需参考具体型号的参考手册。
GPIO
GPIO(General-Purpose Input/Output,通用输入 / 输出) 是最基础且应用最广泛的外设之一,用于实现微控制器与外部设备的数字信号交互(如高低电平检测、开关控制、LED 驱动等)。每个 GPIO 引脚可通过软件配置为输入或输出模式,并支持多种工作方式,灵活性极高。
GPIO 的核心特性
多引脚与端口分组
STM32 的 GPIO 引脚通常按 “端口” 分组(如 GPIOA、GPIOB、GPIOC 等),每个端口包含 16 个引脚(PA0~PA15、PB0~PB15 等),不同型号的 STM32 提供的端口数量不同(从几个到十几个不等)。灵活的模式配置
每个 GPIO 引脚可独立配置为多种模式:- 输入模式:
- 浮空输入(Floating Input):引脚电平由外部信号决定,无内部上下拉。
- 上拉输入(Pull-Up Input):内部接电阻上拉,无外部信号时为高电平。
- 下拉输入(Pull-Down Input):内部接电阻下拉,无外部信号时为低电平。
- 模拟输入(Analog Input):用于 ADC 采样,引脚直接连接到模拟电路。
- 输出模式:
- 推挽输出(Push-Pull):可输出高低电平,驱动能力强(如直接驱动 LED)。
- 开漏输出(Open-Drain):仅能输出低电平,高电平需外部上拉电阻(适合电平转换、I2C 总线等)。
- 复用功能模式:引脚作为外设功能(如 UART 的 TX/RX、SPI 的 SCLK/MOSI 等),而非通用 IO。
- 中断功能:部分引脚支持外部中断(如上升沿、下降沿、双边沿触发),用于检测外部事件(如按键按下)。
- 输入模式:
输出速度控制
输出模式下可配置引脚的切换速度(如 2MHz、10MHz、50MHz),平衡信号完整性和功耗(高速模式适合高频信号,低速模式降低 EMI 干扰)。
GPIO 的典型应用场景
- 数字输入:检测按键、传感器(如光电开关、限位开关)的高低电平状态。
- 数字输出:控制 LED、继电器、蜂鸣器、电机驱动模块等。
- 复用功能:作为外设接口(如 UART、SPI、I2C、TIM 等)的物理引脚。
- 中断输入:通过外部中断快速响应按键触发、传感器信号变化等事件。
GPIO 的配置流程(基于 HAL 库)
- 使能 GPIO 时钟:GPIO 属于 APB2 外设(部分型号为 AHB),需先通过 RCC 模块使能对应端口的时钟。
- 配置 GPIO 参数:设置引脚号、模式(输入 / 输出 / 复用)、上下拉、输出速度等。
- 初始化 GPIO:应用配置参数,完成引脚初始化。
AFIO
AFIO(Alternate Function I/O,复用功能 I/O) 是用于管理 GPIO 引脚复用功能和外部中断映射的特殊外设模块。它的核心作用是将 GPIO 引脚分配给特定的外设功能(如 UART、SPI、TIM 等),并配置外部中断的引脚映射,解决引脚功能复用的冲突问题。
AFIO 的核心功能
复用功能引脚重映射(Remap)
STM32 的许多外设(如 USART、SPI、TIM、ADC 等)都有默认的 GPIO 引脚分配,但部分型号支持 “重映射” 功能 —— 通过 AFIO 将外设功能映射到其他 GPIO 引脚,增加硬件设计的灵活性。
例如:- USART1 默认映射到 PA9(TX)和 PA10(RX),通过 AFIO 可重映射到 PB6(TX)和 PB7(RX)。
- TIM2 默认引脚可能为 PA0~PA3,重映射后可使用 PB10~PB13 等引脚。
重映射分为部分重映射(部分引脚改变)和完全重映射(所有引脚改变),具体支持哪些重映射需参考对应型号的数据手册。
外部中断 / 事件线映射
STM32 的外部中断(EXTI)控制器支持 16 条中断线(EXTI0~EXTI15),每条中断线可对应多个 GPIO 引脚(如 EXTI0 可对应 PA0、PB0、PC0...PG0),但同一时刻只能选择一个引脚作为中断源。
AFIO 通过EXTI 配置寄存器管理这种映射关系,例如将 EXTI0 映射到 PA0 还是 PB0。调试端口配置
部分 STM32 型号中,AFIO 可配置 JTAG/SWD 调试端口的引脚功能(如关闭 JTAG 功能,释放相关引脚作为普通 GPIO 使用)。
AFIO 的典型应用场景
- 硬件布局优化:当默认外设引脚与其他电路(如传感器、接口)冲突时,通过重映射将外设功能转移到空闲引脚。
- 外部中断灵活配置:为不同 GPIO 引脚分配中断线,实现多按键、多传感器的中断触发。
- 节省引脚资源:通过重映射功能,让有限的 GPIO 引脚支持更多外设功能。
实际开发中的注意事项
- 时钟使能:配置 AFIO 前必须先使能其时钟(
RCC_APB2Periph_AFIO
),否则所有重映射和中断映射配置无效。 - 重映射限制:并非所有外设都支持重映射,且重映射后的引脚功能与默认引脚完全一致(仅物理引脚不同)。
- 中断线唯一性:每条 EXTI 中断线同一时刻只能映射到一个 GPIO 引脚(如 EXTI0 不能同时映射到 PA0 和 PB0)。
- 调试端口冲突:若使用 JTAG/SWD 调试,需注意部分引脚(如 PA13、PA14、PA15)默认作为调试端口,若需用作普通 GPIO,需通过 AFIO 关闭调试功能(如
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE)
仅保留 SWD 调试)。 - 型号差异:不同 STM32 系列(如 F1、F4、H7)的 AFIO 功能可能不同,部分高端型号将重映射功能整合到 GPIO 模块中,无需单独配置 AFIO。
总之,AFIO 是 STM32 引脚功能管理的 “调度中心”,通过灵活配置重映射和中断映射,可显著提高硬件设计的灵活性,解决引脚资源紧张或冲突问题。实际开发中需结合具体型号的数据手册,确认支持的重映射方式和引脚分配。
ADC
ADC(Analog-to-Digital Converter,模数转换器) 是用于将模拟信号(如电压)转换为数字信号的外设,广泛应用于传感器数据采集(如温度、压力、光照等)、模拟量控制等场景。STM32 的 ADC 具有高精度、多通道、灵活触发等特点,能满足不同嵌入式应用的需求。
ADC 的核心特性
高精度转换
STM32 的 ADC 通常为 12 位逐次逼近型转换器(部分型号支持 16 位),转换结果为无符号整数(范围 0~4095,对应 0~VREF + 电压),精度满足多数嵌入式场景(误差通常在 ±1LSB 以内)。多通道采集
支持多个模拟输入通道(如 STM32F1 系列有 18 个通道),包括:- 外部通道:连接到 GPIO 引脚(如 PA0~PA7、PB0~PB1 等),用于采集外部模拟信号。
- 内部通道:采集芯片内部信号(如温度传感器、参考电压 VREFINT、电池电压监测等)。
灵活的转换模式
- 单次转换:触发一次转换一个通道,完成后停止。
- 连续转换:一次触发后持续转换同一通道,直到手动停止。
- 扫描模式:按顺序转换多个通道(如通道 0→通道 1→通道 2...),适合多传感器同时采集。
- 间断模式:将多个通道分成组,每组转换完成后暂停,等待下一次触发。
多种触发方式
转换可通过软件触发(直接调用函数)或硬件触发(如定时器溢出、外部中断、PWM 信号等),适合定时采集或同步触发场景。DMA 支持
转换结果可通过 DMA 自动传输到存储器(如 SRAM 缓冲区),无需 CPU 干预,提高系统效率(尤其高频连续采集时)。
ADC 的基本工作原理
模拟信号输入:外部模拟信号(如传感器输出的 0~3.3V 电压)通过 GPIO 引脚接入 ADC 通道,需确保信号在 ADC 的输入电压范围(通常 0~VREF+,VREF + 一般接 3.3V)内。
转换过程:ADC 通过内部比较器将输入电压与参考电压(VREF+)比较,经过多次迭代生成 12 位数字量(公式:
数字值 = (输入电压 / 参考电压) × 4095
)。结果存储:转换完成后,结果存入 ADC 数据寄存器(ADC_DR),若开启 DMA,自动传输到指定内存地址。
中断通知:转换完成、溢出等事件可触发中断,CPU 可在中断服务程序中处理数据。
实际开发中的注意事项
参考电压:ADC 的转换精度依赖参考电压(VREF+)的稳定性,若对精度要求高,需确保 VREF + 稳定(可外接高精度基准源)。
采样时间:采样时间越长,转换精度越高,但速度越慢(需在精度和速度间平衡)。例如,55.5 个时钟周期适合高精度场景,1.5 个时钟周期适合高速场景。
通道隔离:不同通道的输入信号可能相互干扰,尤其高阻抗信号源,建议在信号输入端增加 RC 滤波电路。
校准:STM32 的 ADC 支持自校准功能,可通过
HAL_ADCEx_Calibration_Start()
函数校准,减少硬件误差(建议上电后执行一次)。DMA 缓冲区:使用 DMA 时,缓冲区地址需满足对齐要求(如 32 位对齐),且循环模式下需注意数据覆盖问题(及时处理缓冲区数据)。
多通道同步:扫描模式下,多个通道转换有先后顺序,若需严格同步,可考虑使用 ADC 注入通道或多 ADC 同步模式(部分型号支持)。
总之,ADC 是 STM32 采集模拟信号的核心外设,其灵活性和精度使其能适应多种传感器和模拟量采集场景。实际开发中需根据需求配置转换模式、触发方式和采样参数,兼顾精度、速度和系统效率。
DAC
DAC(Digital-to-Analog Converter,数模转换器) 是用于将数字信号转换为模拟电压信号的外设,主要应用于需要输出模拟量的场景(如波形生成、电压控制、音频输出、传感器校准等)。STM32 的 DAC 通常具有双通道、12 位精度和多种输出模式,能满足多数嵌入式系统的模拟量输出需求。
DAC 的核心特性
12 位精度转换
STM32 的 DAC 为 12 位电压输出型转换器,支持两种数据对齐方式:- 右对齐:12 位有效数据存储在 16 位寄存器的低 12 位。
- 左对齐:12 位有效数据存储在 16 位寄存器的高 12 位。
转换范围通常为 0~VREF+(参考电压,一般为 3.3V),输出电压与数字量的关系为:输出电压 = (数字值 / 4095) × VREF+
(12 位满量程为 4095)。
双通道独立输出
多数 STM32 型号(如 F1、F4 系列)的 DAC 包含两个独立通道(DAC1 和 DAC2),可同时输出不同的模拟电压,通道对应引脚通常为 PA4(DAC1_OUT1)和 PA5(DAC1_OUT2)。灵活的触发与输出模式
- 触发方式:支持软件触发(直接写入数据)或硬件触发(如定时器更新、外部中断、SPI 等),适合周期性波形输出(如正弦波、三角波)。
- 输出模式:
- 普通模式:直接输出转换后的模拟电压。
- 缓冲模式:通过内部运算放大器缓冲输出,提高驱动能力(部分型号支持)。
- 波形生成:支持生成噪声波和三角波(通过配置 DAC 控制寄存器实现),或通过 DMA 传输实现自定义波形(如正弦波、方波)。
DMA 支持
可通过 DMA 自动传输数字量到 DAC 数据寄存器,实现高频、连续的模拟波形输出(无需 CPU 干预),适合生成复杂波形。
DAC 的基本工作原理
- 数字量输入:CPU 或 DMA 将 12 位数字量写入 DAC 数据寄存器(DAC_DHRx)。
- 数模转换:DAC 内核将数字量转换为对应的模拟电压,转换时间通常为几微秒(取决于型号)。
- 模拟输出:转换后的电压通过专用引脚(如 PA4、PA5)输出,输出范围受 VREF + 电压限制(通常 0~3.3V)。
实际开发中的注意事项
参考电压稳定性:DAC 的输出精度依赖 VREF + 的稳定性,若需高精度输出,需确保 VREF + 电压稳定(可外接低噪声基准源)。
输出驱动能力:STM32 的 DAC 输出电流较小(通常最大几百 μA),驱动外部负载(如运放、扬声器)时需外接运算放大器提高驱动能力。
噪声与滤波:DAC 输出可能包含高频噪声,可在输出引脚增加 RC 低通滤波电路(如 1kΩ 电阻 + 100nF 电容)平滑波形。
触发同步:硬件触发模式下,需确保触发源频率与波形输出频率匹配(如生成 1kHz 正弦波需 1kHz 触发信号)。
双通道独立性:两个 DAC 通道可独立配置(不同触发源、不同输出模式),但共用 VREF+,因此参考电压变化会同时影响两个通道。
总之,DAC 是 STM32 生成模拟信号的核心外设,其灵活性使其能适应从简单电压控制到复杂波形生成的多种场景。实际应用中需根据精度、速度和波形复杂度需求,选择合适的工作模式和外部电路设计。
SPI
SPI(Serial Peripheral Interface,串行外设接口) 是一种高速同步串行通信协议,用于微控制器与外部设备(如传感器、存储器、显示屏等)之间的短距离数据传输。SPI 采用主从架构,支持全双工通信,具有传输速度快、协议简单的特点,广泛应用于嵌入式系统中。
SPI 的核心特性
通信架构
SPI 采用主从(Master-Slave)模式,通常由一个主设备(如 STM32)和一个或多个从设备组成。通信时需 4 根信号线(部分场景可简化):- SCLK(Serial Clock):时钟线,由主设备产生,控制数据传输节奏。
- MOSI(Master Out Slave In):主设备输出 / 从设备输入线,主设备向从设备发送数据。
- MISO(Master In Slave Out):主设备输入 / 从设备输出线,从设备向主设备返回数据。
- NSS(Negated Slave Select):从设备选择线(低电平有效),主设备通过该线选中特定从设备(多从设备时必需)。
全双工通信
SPI 支持同时发送和接收数据(全双工),主从设备通过 MOSI 和 MISO 线并行传输,传输效率高,适合高频数据交换(如读取摄像头数据、高速传感器)。灵活的配置参数
- 时钟极性(CPOL):SCLK 空闲时的电平(0 或 1)。
- 时钟相位(CPHA):数据采样时刻(第一个时钟沿或第二个时钟沿)。
- 数据帧格式:8 位或 16 位数据帧。
- 数据传输顺序:高位在前(MSB)或低位在前(LSB)。
- 时钟频率:通常可配置为系统时钟的分频(如 fPCLK/2、fPCLK/4 等),最高可达数十 MHz(取决于设备支持)。
多从设备支持
通过多个 NSS 引脚或菊花链方式,STM32 的 SPI 可连接多个从设备,主设备通过 NSS 线单独选中某个从设备进行通信。
SPI 的通信过程
- 选中从设备:主设备拉低目标从设备的 NSS 线(置为低电平),表示开始通信。
- 同步传输:主设备产生 SCLK 时钟,在每个时钟周期内,主从设备通过 MOSI 和 MISO 线同时交换一位数据。
- 结束通信:数据传输完成后,主设备拉高 NSS 线(置为高电平),释放从设备。
整个过程中,数据传输以帧为单位(通常 8 位),每传输一帧数据,主从设备都会完成一次双向数据交换。
实际开发中的注意事项
时序匹配:主设备的 SPI 时序(CPOL、CPHA)必须与从设备一致,否则会导致数据传输错误(需参考从设备数据手册)。
NSS 控制:
- 硬件 NSS(SPI_NSS_HARD):由 SPI 控制器自动控制 NSS 引脚,适合单从设备场景。
- 软件 NSS(SPI_NSS_SOFT):需手动控制 GPIO 引脚,灵活度高,适合多从设备场景,但需注意手动控制的及时性。
速率选择:SPI 时钟频率不宜超过从设备支持的最大速率(如某些传感器仅支持 1MHz 以下),否则会导致通信失败。
中断与 DMA:大量数据传输时(如读取 Flash、显示屏刷新),建议使用 SPI 中断或 DMA 模式,减少 CPU 占用率。
信号完整性:高频传输时(如 10MHz 以上),需注意 PCB 布线(短且直),避免信号干扰导致数据错误。
全双工与半双工:多数场景使用全双工模式,若只需单向传输(如仅发送或仅接收),可配置为单线模式(SPI_DIRECTION_1LINE_TX/RX)。
总之,SPI 是 STM32 与外部设备高速通信的重要接口,其简单的协议和灵活的配置使其在嵌入式系统中应用广泛。实际开发中需重点关注时序匹配和硬件连接,确保通信稳定可靠。
I2C
I2C(Inter-Integrated Circuit,集成电路间总线) 是一种低成本、低速率的串行通信协议,用于短距离连接多个设备(如传感器、EEPROM、OLED 显示屏等)。I2C 采用两线制(SDA 数据线和 SCL 时钟线),支持多主多从架构,硬件实现简单,适合对传输速率要求不高的场景。
I2C 的核心特性
两线制通信
仅需两根线即可实现数据传输:- SCL(Serial Clock):时钟线,由主设备产生,控制数据传输节奏。
- SDA(Serial Data):数据线,用于双向传输数据(主到从或从到主)。
两根线均需通过上拉电阻(通常 4.7kΩ)接电源,默认保持高电平。
多主多从架构
- 支持多个主设备(如多个 STM32)和多个从设备,通过从设备地址区分不同设备(7 位或 10 位地址)。
- 主设备负责发起通信、产生时钟和终止通信;从设备被动响应主设备的请求。
传输速率
支持三种速率模式:- 标准模式(Standard-mode):100kbps
- 快速模式(Fast-mode):400kbps
- 高速模式(Fast-mode Plus):1Mbps(部分型号支持)
速率远低于 SPI,但足以满足多数传感器和低速外设的需求。
数据帧格式
每次传输以字节(8 位)为单位,每个字节后跟随一个应答位(ACK/NACK),表示接收成功与否。通信过程包含起始信号、地址帧、数据帧和停止信号。
I2C 的通信过程
- 起始信号(S):主设备拉低 SDA 线(此时 SCL 为高电平),表示通信开始。
- 地址帧:主设备发送 7 位(或 10 位)从设备地址 + 1 位读写位(0 表示写,1 表示读)。
- 应答位(ACK):从设备收到地址后,若地址匹配,则拉低 SDA 线产生应答(ACK)。
- 数据传输:主从设备通过 SDA 线传输数据(每次 1 字节),每传输 1 字节后接收方需发送 ACK。
- 停止信号(P):主设备拉高 SDA 线(此时 SCL 为高电平),表示通信结束。
实际开发中的注意事项
上拉电阻:SDA 和 SCL 线必须外接上拉电阻(典型值 4.7kΩ),确保总线在空闲时保持高电平,否则通信会失败。
地址冲突:多从设备场景下,需确保每个从设备的地址唯一(可通过硬件引脚配置部分从设备的地址)。
时钟拉伸:从设备可通过拉低 SCL 线延长时钟(时钟拉伸),主设备需等待 SCL 线释放后再继续传输(STM32 的 I2C 控制器默认支持)。
应答位处理:若从设备未返回 ACK(如地址错误或忙碌),主设备应终止通信并处理错误。
速率匹配:主设备的时钟速率不可超过从设备支持的最大速率(如某些传感器仅支持 100kbps)。
中断与 DMA:大量数据传输时(如读取 EEPROM),可使用 I2C 中断或 DMA 模式,避免阻塞 CPU。
总线仲裁:多主设备场景下,I2C 支持总线仲裁(通过 SDA 线竞争),确保只有一个主设备控制总线,但实际应用中较少使用多主模式。
总之,I2C 是一种简单、经济的低速通信协议,适合连接多个低速率外设。STM32 的 I2C 控制器支持灵活配置,能满足多数嵌入式场景的需求,实际开发中需重点关注硬件连接(上拉电阻)和地址管理。
USART
USART(Universal Synchronous Asynchronous Receiver Transmitter,通用同步异步收发器) 是一种功能强大的串行通信外设,支持异步通信(如标准 UART)和同步通信模式,可用于与外部设备(如电脑、传感器、蓝牙模块等)进行数据交换。USART 在嵌入式系统中应用极为广泛,是最常用的通信接口之一。
USART 的核心特性
支持同步与异步模式
- 异步模式(UART):无需时钟线,通过预先约定的波特率实现数据同步(最常用)。
- 同步模式:使用时钟线(CK)实现严格同步,适合高速、高精度通信。
全双工通信
通过两根独立的信号线(TX 发送、RX 接收)实现同时发送和接收数据,互不干扰。丰富的功能扩展
- 硬件流控制:支持 RTS(请求发送)和 CTS(清除发送)信号,实现数据传输的流量控制,避免数据溢出。
- 奇偶校验:可配置奇校验、偶校验或无校验,用于检测数据传输错误。
- 中断与 DMA:支持发送 / 接收完成、接收缓冲区非空等事件的中断,也可通过 DMA 实现高速数据传输(减少 CPU 占用)。
- 多机通信:支持地址标记模式,可实现一个主设备与多个从设备的通信。
灵活的波特率
波特率(数据传输速率)可通过软件配置,常见值包括 9600、19200、38400、115200、1Mbps 等,最高可达数十 Mbps(取决于 STM32 型号)。
USART 的通信过程(异步模式)
数据帧格式
异步模式下,数据以 “帧” 为单位传输,每帧包含:- 1 个起始位(低电平,标志帧开始)。
- 8/9 个数据位(实际传输的有效数据)。
- 0/1 个奇偶校验位(用于错误检测)。
- 1/1.5/2 个停止位(高电平,标志帧结束)。
通信流程
- 发送端:将并行数据转换为串行帧格式,按波特率逐位发送。
- 接收端:根据波特率检测起始位,同步接收后续位,重组为并行数据。
- 双方需预先约定相同的波特率、数据位、校验位和停止位(俗称 “波特率一致”)。
实际开发中的注意事项
波特率计算:USART 的波特率由系统时钟分频得到,需确保计算准确(误差需 < 3%),否则会导致通信错误。STM32 的 HAL 库会自动计算分频系数,无需手动配置。
引脚复用:USART 的 TX/RX 引脚通常为复用功能(如 USART1 的 TX=PA9,RX=PA10),需在初始化时配置 GPIO 为复用推挽输出(TX)和浮空输入(RX)。
中断优先级:使用中断模式时,需合理配置 USART 中断优先级,避免高优先级任务被频繁的串口中断打断。
数据缓冲:接收数据时建议使用缓冲区(如环形缓冲区),尤其在高频数据传输场景,防止数据丢失。
抗干扰设计:异步通信对噪声敏感,长距离传输时建议使用电平转换芯片(如 MAX232)转为 RS232 电平,或使用差分信号(如 RS485)。
调试工具:开发时可通过 USB 转串口模块将 STM32 的 USART 连接到电脑,使用串口调试助手(如 XCOM、TeraTerm)查看或发送数据,方便调试。
总之,USART 是 STM32 中最常用的通信接口之一,其灵活性和易用性使其成为嵌入式系统与外部设备交互的首选方案。无论是简单的调试信息输出,还是复杂的设备通信,USART 都能满足需求。