前面学的电容、电阻、电感------都只是零件。
真正的战争,从这里开始。
一颗芯片。全球每年几百亿颗。管着机器的生,也管着机器的死。
单片机(MCU/MPU/SOC)的分类,按指令集体系(ARM / RISC-V / MIPS / 专有架构),位数(8/16/32 位),应用定位(MCU 实时控制 / 应用处理器 / DSP) 。
具体:ARM Cortex-M0/M0+/M3/M4(F)/M7(F)/M23/M33/M52、ARM Cortex-R4(F)/R5(F)/R7/R52、ARM Cortex-A5/A7/A8/A9/A35/A53/A55/A57/A72、ARM7TDMI、ARM9、STAR-MC1、RISC-V 系列(RISC-V2A/2C/3C/4C/4F)、RXv2/RXv3、MIPS32 系列、Xtensa LX6/LX7、C64x+、C28x、51 系列、STM8/STM8A、HC11/HC08/HCS12/HCS12X/S08、M16C/60、R8C、RL78、Z8/eZ8、S1C17、BA22、ES7P/HR7P RISC、KungFu32 、ez80、C166/C166SV2、MSP430(及 CPU16/CPUXV2 变体)、RH850 系列(G3K/G3KH/G4MH)、8051/8052/M8051、F2MC-8L/8FX/16F/16L/16LX/16FX、PIC、dsPIC、FR81S、TMS320C28x/C54x、C674x、ARM926EJ-S、AVR、TriCore、RX、RISC、RISC-V、飞思卡尔系列、其他/其他系列等
直接看规格书:
STM32F103C8T6
内核
■ ARM 32位的Cortex™-M3 CPU
- 最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHz(Dhrystone 2.1)
- 单周期乘法和硬件除法
存储器
■ 存储容量
- 从64K或128K字节的闪存程序存储器
- 高达20K字节的SRAM
时钟、复位和电源管理
■ 供电、复位与振荡
- 2.0V~3.6V供电和I/O引脚
- 上电/断电复位(POR/PDR)、可编程电压监测器(PVD)
- 4MHz~16MHz晶体振荡器
- 内嵌经出厂调校的8MHz的RC振荡器
- 内嵌带校准的40kHz的RC振荡器
- 产生CPU时钟的PLL
- 带校准功能的32kHz RTC振荡器
低功耗
■ 低功耗模式与备份供电
- 睡眠、停机和待机模式
- VBAT为RTC和后备寄存器供电
2个12位模数转换器,1μs转换时间(多达16个输入通道)
■ ADC特性
- 转换范围:0至3.6V
- 双采样和保持功能
- 温度传感器
DMA
■ DMA控制器
- 7通道DMA控制器
- 支持的外设:定时器、ADC、SPI、I2C和USART
多达80个快速I/O端口
■ I/O端口
- 26/37/51/80个I/O口,所有I/O口可以映像到16个外部中断
- 几乎所有端口均可容忍5V信号
调试模式
■ 调试接口
- 串行单线调试(SWD)和JTAG接口
多达7个定时器
■ 定时器资源
- 3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
- 1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器
- 2个看门狗定时器(独立的和窗口型的)
- 系统时间定时器:24位自减型计数器
多达9个通信接口
■ 通信接口
- 多达2个I2C接口(支持SMBus/PMBus)
- 多达3个USART接口(支持ISO7816接口,LIN,IrDA接口和调制解调控制)
- 多达2个SPI接口(18M位/秒)
- CAN接口(2.0B 主动)
- USB 2.0全速接口
CRC计算单元,96位的芯片唯一代码
■ CRC与唯一ID
- CRC计算单元
- 96位的芯片唯一代码
上面的概念结合款图来看
前面学的电容、电阻、电感------都只是零件。
真正的战争,从这里开始。
一颗芯片。全球每年几百亿颗。管着机器的生,也管着机器的死。
单片机(MCU/MPU/SOC)的分类,按指令集体系(ARM / RISC-V / MIPS / 专有架构),位数(8/16/32 位),应用定位(MCU 实时控制 / 应用处理器 / DSP) 。
具体:ARM Cortex-M0/M0+/M3/M4(F)/M7(F)/M23/M33/M52、ARM Cortex-R4(F)/R5(F)/R7/R52、ARM Cortex-A5/A7/A8/A9/A35/A53/A55/A57/A72、ARM7TDMI、ARM9、STAR-MC1、RISC-V 系列(RISC-V2A/2C/3C/4C/4F)、RXv2/RXv3、MIPS32 系列、Xtensa LX6/LX7、C64x+、C28x、51 系列、STM8/STM8A、HC11/HC08/HCS12/HCS12X/S08、M16C/60、R8C、RL78、Z8/eZ8、S1C17、BA22、ES7P/HR7P RISC、KungFu32 、ez80、C166/C166SV2、MSP430(及 CPU16/CPUXV2 变体)、RH850 系列(G3K/G3KH/G4MH)、8051/8052/M8051、F2MC-8L/8FX/16F/16L/16LX/16FX、PIC、dsPIC、FR81S、TMS320C28x/C54x、C674x、ARM926EJ-S、AVR、TriCore、RX、RISC、RISC-V、飞思卡尔系列、其他/其他系列等
直接看规格书:
STM32F103C8T6
内核
■ ARM 32位的Cortex™-M3 CPU
- 最高72MHz工作频率,在存储器的0等待周期访问时可达1.25DMips/MHz(Dhrystone 2.1)
- 单周期乘法和硬件除法
存储器
■ 存储容量
- 从64K或128K字节的闪存程序存储器
- 高达20K字节的SRAM
时钟、复位和电源管理
■ 供电、复位与振荡
- 2.0V~3.6V供电和I/O引脚
- 上电/断电复位(POR/PDR)、可编程电压监测器(PVD)
- 4MHz~16MHz晶体振荡器
- 内嵌经出厂调校的8MHz的RC振荡器
- 内嵌带校准的40kHz的RC振荡器
- 产生CPU时钟的PLL
- 带校准功能的32kHz RTC振荡器
低功耗
■ 低功耗模式与备份供电
- 睡眠、停机和待机模式
- VBAT为RTC和后备寄存器供电
2个12位模数转换器,1μs转换时间(多达16个输入通道)
■ ADC特性
- 转换范围:0至3.6V
- 双采样和保持功能
- 温度传感器
DMA
■ DMA控制器
- 7通道DMA控制器
- 支持的外设:定时器、ADC、SPI、I2C和USART
多达80个快速I/O端口
■ I/O端口
- 26/37/51/80个I/O口,所有I/O口可以映像到16个外部中断
- 几乎所有端口均可容忍5V信号
调试模式
■ 调试接口
- 串行单线调试(SWD)和JTAG接口
多达7个定时器
■ 定时器资源
- 3个16位定时器,每个定时器有多达4个用于输入捕获/输出比较/PWM或脉冲计数的通道和增量编码器输入
- 1个16位带死区控制和紧急刹车,用于电机控制的PWM高级控制定时器
- 2个看门狗定时器(独立的和窗口型的)
- 系统时间定时器:24位自减型计数器
多达9个通信接口
■ 通信接口
- 多达2个I2C接口(支持SMBus/PMBus)
- 多达3个USART接口(支持ISO7816接口,LIN,IrDA接口和调制解调控制)
- 多达2个SPI接口(18M位/秒)
- CAN接口(2.0B 主动)
- USB 2.0全速接口
CRC计算单元,96位的芯片唯一代码
■ CRC与唯一ID
- CRC计算单元
- 96位的芯片唯一代码
上面的概念结合框图来看

1,芯片右上角开始
可以看到单片机的核心,M3 Fmax:72Mhz,挨在一起的是SW/JTAG,SW/JTAG 一般指嵌入式开发中最常用的两种调试/烧录接口:SWD(Serial Wire Debug,串行线调试)和 JTAG。它们都用于给芯片下载程序、设置断点、单步调试、读写内存和寄存器,常出现在 ARM Cortex-M 等 MCU 的调试配置选项中。
JTAG几乎所有架构都支持,SWD是 ARM 专为 Cortex 内核设计的精简调试协议,属于 CoreSight 调试架构的一部分。
TPIU 是芯片内跟踪数据的格式化输出网关,TRACECLK 是它给外部探头提供的采样时钟,TRACED0:3 是 4 位并行跟踪数据线,三者合起来构成 ETM/ITM 跟踪数据的物理输出通道。要分析复杂时序问题、追踪完整指令执行流(如死机瞬间的执行路径)、性能剖析时才用 ETM + 并行 TPIU 口,需要专用的跟踪探头(如 DSTREAM-ST 支持 4 位 TPIU 跟踪,每信号最高 600 Mbps),目前没有用过。
框图中从内核到芯片引脚,调试/跟踪相关的模块依次是:
Cortex-M3 CPU → Trace Controller(含 ETM/ITM)→ Trace/Trig 端口 → TPIU → TRACECLK / TRACED0:3 引脚
各部分含义:
|---------------------------------|-----------------------------------------------------------------------------------------------------------------------------|
| 框图标注 | 含义 |
| Trace Controller | 片内跟踪控制部分(对应 CoreSight 的 ETM/ITM/DWT 等),产生指令执行流、数据访问等跟踪信息 |
| Trace/Trig | 内部跟踪/触发端口总线,把 Trace Controller 的跟踪数据和触发事件送到 TPIU |
| TPIU | 跟踪端口接口单元,把内部跟踪数据格式化后输出到片外引脚 |
| TRACECLK / TRACED0:3 | TPIU 的物理输出引脚:1 根跟踪时钟 + 4 位并行跟踪数据,需接外部跟踪探头使用;这些引脚与 PB3、PB4、PA13~PA15 等 GPIO 复用(框图中标 "as AF") |
| SW/JTAG | 调试访问口(DAP),即 SWD/JTAG 接口:NJTRST、JTDI、JTCK/SWCLK、JTMS/SWDIO、JTDO 这 5 个引脚(也是 GPIO 复用),用于断点、单步、烧录等"控制"操作 |
| Pbus / Ibus / Dbus / System | Cortex-M3 的总线接口:Pbus 是外设总线(接 APB1/APB2 外设),Ibus 是取指总线,Dbus 是数据总线,System 是系统总线,汇入框图中间的总线矩阵(BusMatrix),连接 Flash、SRAM、DMA 和各外设 |
简单理解
- SW/JTAG 口是"调试通道":烧录程序、打断点、暂停 CPU(日常开发必用,蓝药丸板上的 SWD 只用 PA13/PA14 两根线)
- **TPIU + TRACECLK/TRACED0:3**是"跟踪通道":程序全速运行时把执行流实时吐出去,需要 J-Link/Lauterbach 等专用探头才能用,多数项目用不到这些引脚
- Pbus/Ibus/Dbus/System是内核挂接芯片内部的总线,与调试无关,是框图的数据通路部分
2,Ibus、Flash Interface、OBL
2,Ibus 是内核取指令的总线,Flash Interface 是访问 Flash 的控制层,OBL(选项字节装载器)负责在复位时加载读保护等芯片配置。
Ibus(指令总线)
Cortex-M3 内核的取指总线,把 CPU 的指令预取/取指请求送到 Flash 接口和总线矩阵。内核通过它从 Flash 里读指令执行。
Flash Interface(FLITF,Flash 存储器接口)
内核和 Flash 存储器之间的访问控制器,主要功能包括:
- 预取缓冲(Prefetch Buffer):Flash 访问速度慢于 CPU(72 MHz 时需等待周期),预取缓冲可以提前取后续指令,减少 CPU 等待,配合条件为 CPU 主频达 48 MHz 以上时需设置 Flash 等待周期(STM32F103 @72MHz 需 2 个等待周期)
- 半周期/64 位总线宽度:框图里 Flash 旁边标的 "64 bit" 指内部通过 64 位总线 + 缓冲提高取指效率
- 读保护(RDP)、写保护(WRP):即调试连不上、读不出来的"芯片锁"功能也由它管理
- OBL(Option Byte Loader,选项字节装载器) :这是框图 Flash 接口区域里 "OBL" 标注的含义------芯片复位时自动加载选项字节(Option Bytes) ,把用户保护(RDP 读保护等级、WDG 硬件看门狗、nRSTSTOP 等配置)应用到系统,对应 Flash 控制寄存器里的
OBL_LAUNCH位(软件写入它可触发重新装载选项字节)
3,BusMatrix(总线矩阵)是干什么的
它是框图中央的多主多从互连交换器(ARM 多 AHB 总线矩阵),核心作用:
- 多主并行 :Cortex-M3 的 Ibus/Dbus/System 和 GP DMA(框图中的 7 通道 DMA1、DMA2)都是"总线主设备",BusMatrix 允许它们同时访问不同的从设备,例如 CPU 从 Flash 取指、DMA 同时把 ADC 数据搬进 SRAM,互不抢占
- 仲裁冲突 :当两个主设备访问同一从设备时,由矩阵内的仲裁器按优先级调度(一般 DMA 可配置优先级,CPU 通常不让位太久)
- 路径切换:框图里 CPU 的三路总线(Ibus、Dbus、System)都汇入矩阵,再分配到 Flash、SRAM、AHB2(ADC/GPIO 等在框图中标 AHB2)、APB 桥等目标
System是系统总线(AHB)内核访问 SRAM、外设、外部存储控制器(FSMC),DMA 也用它与内存/外设传输
Dbus 是Cortex-M3 数据总线(AHB-Lite)常量访问、调试访问(如读 Flash 中的数据表)
那为什么CPU指令和数据要走两个路。
因为 Cortex-M3 内核采用的是哈佛(Harvard)总线结构(准确说是"改进型哈佛架构"),取指令和取数据走两条路,正是为了解决"一条路"带来的瓶颈
如果只走一条路(冯·诺依曼结构) CPU 执行一条指令要经历:取指 → 译码 → 执行(可能要读/写数据)。如果指令和数据共用一条总线、一个存储器: 取下一条指令时,总线被占用,数据读/写就得等 执行中的指令要读操作数时,下一条指令的取指也得排队 流水线无法重叠执行------这就是经典的"冯·诺依曼瓶颈" 形象地说:单车道,取指令的车和运数据的车只能一辆一辆过。 分两条路的好处(STM32 的实际做法) Cortex-M3 引出 Ibus(I-Code)、Dbus(D-Code)、System 三条总线: 取指和数据访问并行:CPU 可以一边用 Ibus 从 Flash 取下一条指令,一边用 Dbus 读 Flash 里的查表常量/数据------两件事同一周期发生,流水线能真正重叠起来,吞吐率大幅提高 配合流水线:三级流水线(取指→译码→执行)中,取指用程序空间、执行访存用数据空间,二者同时进行,互不拖累 配合 DMA:System 总线走总线矩阵,CPU 取指的同时 DMA 也能通过矩阵访问 SRAM/外设,多条通路并行不冲突 带宽和延迟特性不同:指令是连续、可预测的流(适合预取缓冲),数据访问是随机、突发式的,分开走各自优化更高效 有个细节值得注意 STM32 是改进型哈佛:软件看到的仍是统一编址的地址空间(这点像冯·诺依曼),只是硬件上取指和取数的通路分开了。而且 Ibus 和 Dbus 虽然逻辑上分开,物理上连的是同一块 Flash,所以实际并行程度还受 Flash 读带宽和等待周期限制------这正是 Flash 接口要配 64 位宽总线 + 预取缓冲的原因
4,SRAM 20KB 也是框图里 BusMatrix 右侧的一个模块标注,指 STM32F103 芯片内部的静态随机存储器(数据存储器),容量为 20 KB
。
4,SRAM 20KB
- Cortex-M3 内核通过 System 总线经 BusMatrix 访问 SRAM;DMA(GP DMA 7 通道)也能直接读写它
- 它与 Flash 的分工:Flash 存指令和常量 (掉电不丢),SRAM 存运行时的变量、栈、堆(速度快但掉电丢失)------这正是前面说的新哈佛架构"程序存储器 + 数据存储器分离"中数据侧的那块存储
20KB 都被什么占用
- 全局变量、静态变量
- 栈(Stack):函数调用、局部变量、中断现场保存
- 堆(Heap):malloc 动态分配
- 启动文件里定义的
_Min_Stack_Size/_Min_Heap_Size都从这 20KB 里划
5,GP DMA 7channels
DMA可以简单理解为水管,设置取数的地址,接数据的地址,打开水闸它就可以搬数据,不过有一点,传输计数器 CNDTR 是 16 位,所以单次传输最多 65535 个数据单元(配置为 32 位宽度时一次最多约 256KB)。所以搭建好通道,如果搬的数据够了,就要重新开始。你可以将串口数据直接搬到I2C,但是一般不这么做,而是在SRAM里面找一段做缓冲,类似蓄水池,因为一般两个外设之间的通信速率不一样,比如,我串口一时间接了很多东西,I2C来不及发出去,就会丢数据。
6,NVIC
上面讲到DMA,比如DMA在搬数据,CPU如何获取任务办的怎么样了,CPU可以直接询问(访问DMA寄存器),但是CPU还要完成取指计算等,一直占用System询问DMA,就干不了其他事情,那通过NVIC实现,配置DMA干活干到一半或者干完了通知CPU,当然还有各种外设,所以STM32F103 有 16 个内核异常(Reset、HardFault、SysTick 等)+ 60 个可屏蔽中断(IRQ 0~59,如 EXTI、TIM、USART、DMA、ADC 的中断)每个中断 8 位优先级寄存器,F103 只用高 4 位 → 16 级优先级。NVIC要判断时间优先级,逐一通知M3 CPU处理。
1,芯片右上角开始
可以看到单片机的核心,M3 Fmax:72Mhz,挨在一起的是SW/JTAG,SW/JTAG 一般指嵌入式开发中最常用的两种调试/烧录接口:SWD(Serial Wire Debug,串行线调试)和 JTAG。它们都用于给芯片下载程序、设置断点、单步调试、读写内存和寄存器,常出现在 ARM Cortex-M 等 MCU 的调试配置选项中。
JTAG几乎所有架构都支持,SWD是 ARM 专为 Cortex 内核设计的精简调试协议,属于 CoreSight 调试架构的一部分。
TPIU 是芯片内跟踪数据的格式化输出网关,TRACECLK 是它给外部探头提供的采样时钟,TRACED0:3 是 4 位并行跟踪数据线,三者合起来构成 ETM/ITM 跟踪数据的物理输出通道。要分析复杂时序问题、追踪完整指令执行流(如死机瞬间的执行路径)、性能剖析时才用 ETM + 并行 TPIU 口,需要专用的跟踪探头(如 DSTREAM-ST 支持 4 位 TPIU 跟踪,每信号最高 600 Mbps),目前没有用过。
框图中从内核到芯片引脚,调试/跟踪相关的模块依次是:
Cortex-M3 CPU → Trace Controller(含 ETM/ITM)→ Trace/Trig 端口 → TPIU → TRACECLK / TRACED0:3 引脚
各部分含义:
|---------------------------------|-----------------------------------------------------------------------------------------------------------------------------|
| 框图标注 | 含义 |
| Trace Controller | 片内跟踪控制部分(对应 CoreSight 的 ETM/ITM/DWT 等),产生指令执行流、数据访问等跟踪信息 |
| Trace/Trig | 内部跟踪/触发端口总线,把 Trace Controller 的跟踪数据和触发事件送到 TPIU |
| TPIU | 跟踪端口接口单元,把内部跟踪数据格式化后输出到片外引脚 |
| TRACECLK / TRACED0:3 | TPIU 的物理输出引脚:1 根跟踪时钟 + 4 位并行跟踪数据,需接外部跟踪探头使用;这些引脚与 PB3、PB4、PA13~PA15 等 GPIO 复用(框图中标 "as AF") |
| SW/JTAG | 调试访问口(DAP),即 SWD/JTAG 接口:NJTRST、JTDI、JTCK/SWCLK、JTMS/SWDIO、JTDO 这 5 个引脚(也是 GPIO 复用),用于断点、单步、烧录等"控制"操作 |
| Pbus / Ibus / Dbus / System | Cortex-M3 的总线接口:Pbus 是外设总线(接 APB1/APB2 外设),Ibus 是取指总线,Dbus 是数据总线,System 是系统总线,汇入框图中间的总线矩阵(BusMatrix),连接 Flash、SRAM、DMA 和各外设 |
简单理解
- SW/JTAG 口是"调试通道":烧录程序、打断点、暂停 CPU(日常开发必用,蓝药丸板上的 SWD 只用 PA13/PA14 两根线)
- **TPIU + TRACECLK/TRACED0:3**是"跟踪通道":程序全速运行时把执行流实时吐出去,需要 J-Link/Lauterbach 等专用探头才能用,多数项目用不到这些引脚
- Pbus/Ibus/Dbus/System是内核挂接芯片内部的总线,与调试无关,是框图的数据通路部分
2,Ibus、Flash Interface、OBL
2,Ibus 是内核取指令的总线,Flash Interface 是访问 Flash 的控制层,OBL(选项字节装载器)负责在复位时加载读保护等芯片配置。
Ibus(指令总线)
Cortex-M3 内核的取指总线,把 CPU 的指令预取/取指请求送到 Flash 接口和总线矩阵。内核通过它从 Flash 里读指令执行。
Flash Interface(FLITF,Flash 存储器接口)
内核和 Flash 存储器之间的访问控制器,主要功能包括:
- 预取缓冲(Prefetch Buffer):Flash 访问速度慢于 CPU(72 MHz 时需等待周期),预取缓冲可以提前取后续指令,减少 CPU 等待,配合条件为 CPU 主频达 48 MHz 以上时需设置 Flash 等待周期(STM32F103 @72MHz 需 2 个等待周期)
- 半周期/64 位总线宽度:框图里 Flash 旁边标的 "64 bit" 指内部通过 64 位总线 + 缓冲提高取指效率
- 读保护(RDP)、写保护(WRP):即调试连不上、读不出来的"芯片锁"功能也由它管理
- OBL(Option Byte Loader,选项字节装载器) :这是框图 Flash 接口区域里 "OBL" 标注的含义------芯片复位时自动加载选项字节(Option Bytes) ,把用户保护(RDP 读保护等级、WDG 硬件看门狗、nRSTSTOP 等配置)应用到系统,对应 Flash 控制寄存器里的
OBL_LAUNCH位(软件写入它可触发重新装载选项字节)
3,BusMatrix(总线矩阵)是干什么的
它是框图中央的多主多从互连交换器(ARM 多 AHB 总线矩阵),核心作用:
- 多主并行 :Cortex-M3 的 Ibus/Dbus/System 和 GP DMA(框图中的 7 通道 DMA1、DMA2)都是"总线主设备",BusMatrix 允许它们同时访问不同的从设备,例如 CPU 从 Flash 取指、DMA 同时把 ADC 数据搬进 SRAM,互不抢占
- 仲裁冲突 :当两个主设备访问同一从设备时,由矩阵内的仲裁器按优先级调度(一般 DMA 可配置优先级,CPU 通常不让位太久)
- 路径切换:框图里 CPU 的三路总线(Ibus、Dbus、System)都汇入矩阵,再分配到 Flash、SRAM、AHB2(ADC/GPIO 等在框图中标 AHB2)、APB 桥等目标
System是系统总线(AHB)内核访问 SRAM、外设、外部存储控制器(FSMC),DMA 也用它与内存/外设传输
Dbus 是Cortex-M3 数据总线(AHB-Lite)常量访问、调试访问(如读 Flash 中的数据表)
那为什么CPU指令和数据要走两个路。
因为 Cortex-M3 内核采用的是哈佛(Harvard)总线结构(准确说是"改进型哈佛架构"),取指令和取数据走两条路,正是为了解决"一条路"带来的瓶颈
如果只走一条路(冯·诺依曼结构) CPU 执行一条指令要经历:取指 → 译码 → 执行(可能要读/写数据)。如果指令和数据共用一条总线、一个存储器: 取下一条指令时,总线被占用,数据读/写就得等 执行中的指令要读操作数时,下一条指令的取指也得排队 流水线无法重叠执行------这就是经典的"冯·诺依曼瓶颈" 形象地说:单车道,取指令的车和运数据的车只能一辆一辆过。 分两条路的好处(STM32 的实际做法) Cortex-M3 引出 Ibus(I-Code)、Dbus(D-Code)、System 三条总线: 取指和数据访问并行:CPU 可以一边用 Ibus 从 Flash 取下一条指令,一边用 Dbus 读 Flash 里的查表常量/数据------两件事同一周期发生,流水线能真正重叠起来,吞吐率大幅提高 配合流水线:三级流水线(取指→译码→执行)中,取指用程序空间、执行访存用数据空间,二者同时进行,互不拖累 配合 DMA:System 总线走总线矩阵,CPU 取指的同时 DMA 也能通过矩阵访问 SRAM/外设,多条通路并行不冲突 带宽和延迟特性不同:指令是连续、可预测的流(适合预取缓冲),数据访问是随机、突发式的,分开走各自优化更高效 有个细节值得注意 STM32 是改进型哈佛:软件看到的仍是统一编址的地址空间(这点像冯·诺依曼),只是硬件上取指和取数的通路分开了。而且 Ibus 和 Dbus 虽然逻辑上分开,物理上连的是同一块 Flash,所以实际并行程度还受 Flash 读带宽和等待周期限制------这正是 Flash 接口要配 64 位宽总线 + 预取缓冲的原因
4,SRAM 20KB 也是框图里 BusMatrix 右侧的一个模块标注,指 STM32F103 芯片内部的静态随机存储器(数据存储器),容量为 20 KB
。
4,SRAM 20KB
- Cortex-M3 内核通过 System 总线经 BusMatrix 访问 SRAM;DMA(GP DMA 7 通道)也能直接读写它
- 它与 Flash 的分工:Flash 存指令和常量 (掉电不丢),SRAM 存运行时的变量、栈、堆(速度快但掉电丢失)------这正是前面说的新哈佛架构"程序存储器 + 数据存储器分离"中数据侧的那块存储
20KB 都被什么占用
- 全局变量、静态变量
- 栈(Stack):函数调用、局部变量、中断现场保存
- 堆(Heap):malloc 动态分配
- 启动文件里定义的
_Min_Stack_Size/_Min_Heap_Size都从这 20KB 里划
5,GP DMA 7channels
DMA可以简单理解为水管,设置取数的地址,接数据的地址,打开水闸它就可以搬数据,不过有一点,传输计数器 CNDTR 是 16 位,所以单次传输最多 65535 个数据单元(配置为 32 位宽度时一次最多约 256KB)。所以搭建好通道,如果搬的数据够了,就要重新开始。你可以将串口数据直接搬到I2C,但是一般不这么做,而是在SRAM里面找一段做缓冲,类似蓄水池,因为一般两个外设之间的通信速率不一样,比如,我串口一时间接了很多东西,I2C来不及发出去,就会丢数据。
6,NVIC
上面讲到DMA,比如DMA在搬数据,CPU如何获取任务办的怎么样了,CPU可以直接询问(访问DMA寄存器),但是CPU还要完成取指计算等,一直占用System询问DMA,就干不了其他事情,那通过NVIC实现,配置DMA干活干到一半或者干完了通知CPU,当然还有各种外设,所以STM32F103 有 16 个内核异常(Reset、HardFault、SysTick 等)+ 60 个可屏蔽中断(IRQ 0~59,如 EXTI、TIM、USART、DMA、ADC 的中断)每个中断 8 位优先级寄存器,F103 只用高 4 位 → 16 级优先级。NVIC要判断时间优先级,逐一通知M3 CPU处理。