0.1 STM32和51单片机区别
✅ 一句话总结:
STM32 是基于 ARM Cortex-M 内核的 32 位高性能微控制器,而 51 单片机是早期 8 位架构的经典入门级 MCU,适合教学和简单应用。
🔍 核心区别对比一览表:
对比项 | STM32(如 STM32F103) | 51 单片机(如 AT89C51) |
---|---|---|
内核架构 | ARM Cortex-M3/M4(32 位) | 8051(8 位) |
指令宽度 | 32 位 | 8 位 |
主频 | 一般 72MHz~480MHz | 通常 12MHz(最高几十 MHz) |
运算能力 | 强,支持乘法、除法、移位、浮点 | 弱,复杂运算效率低 |
FLASH/RAM | 几十 KB 到几 MB | 通常几十 KB 以内 |
外设丰富度 | 多(定时器、ADC、USART、USB、DMA、CAN、SPI、I2C、FPU) | 少(基本定时器、UART) |
低功耗能力 | 强,有 sleep/stop/standby 模式 | 较弱 |
开发工具 | KEIL、STM32CubeMX、IAR、HAL/LL库 | Keil + 汇编或简单C语言 |
价格 | 稍贵,通常几元到十几元不等 | 极便宜,几毛钱或几元 |
学习门槛 | 稍高,需要理解寄存器、ARM 架构 | 简单,适合入门 |
应用场景 | 工业控制、智能设备、电机驱动、IoT、汽车电子等 | 简单控制器、教学、电路实验 |
主频(主时钟频率,Clock Frequency) 指的是微控制器或处理器每秒钟振荡多少次,单位是 MHz(百万次每秒)或 GHz(十亿次每秒)。
✅ 一句话解释:
主频表示 CPU 每秒执行的基本操作节拍数量,频率越高,单位时间内理论上能处理的数据和指令越多。
0.2 MCU和CPU
STM32 不是单纯的 CPU,它是一个“MCU”(微控制器),内部集成了一个 ARM Cortex-M 系列的 CPU 核心,以及各种外设和功能模块。
🔍 概念区分:
概念 | 解释 |
---|---|
CPU | 中央处理单元,只负责“运算”和“逻辑判断” |
MCU | 微控制器,是一个小型系统,集成了 CPU + RAM + ROM + 外设(ADC、PWM、UART 等) |
STM32 | 是一个 MCU,内部的 “核心”是 ARM Cortex-M 系列 CPU |
┌────────────────────────────┐
│ STM32 MCU │
├────────────────────────────┤
│ ARM Cortex-M CPU 内核 │ ← 处理器核心
│ Flash(程序存储) │
│ SRAM(数据存储) │
│ ADC、PWM、UART、SPI 等外设 │
│ NVIC 中断控制器 │
│ 时钟系统 RCC │
│ GPIO(IO 控制) │
└────────────────────────────┘
0.3 Cortex
Cortex 是 ARM 公司推出的一系列处理器核心的品牌名称,是目前绝大多数嵌入式芯片(尤其 MCU)使用的主流内核。
✅ 一句话解释:
Cortex 是 ARM 架构下的处理器核心系列,按用途分为 Cortex-A(高性能)、Cortex-R(实时)、Cortex-M(微控制器)。
📚 Cortex 系列分类总览:
系列 | 主要用途 | 举例芯片 | 特点简介 |
---|---|---|---|
Cortex-A | 高性能应用处理器 | 手机、树莓派、Android 系统 | 支持操作系统(Linux、Android)、高主频 |
Cortex-R | 实时处理器(Real-time) | 汽车 ECU、工业安全控制 | 强实时性,低延迟,高可靠性 |
Cortex-M | 微控制器(MCU)核心 | STM32、GD32、NXP等 | 低功耗、低成本,嵌入式控制最常见 |
Cortex-M3的应用
1.Cortex-M3广泛应用于工业控制、消费电子、医疗设备等领域。
2.STM32是Cortex-M3应用最多的芯片之一,运行在75MHz时,中断延迟仅为80到160纳秒。
3.STM32的引脚都支持中断功能,设计更灵活。
STM32的特点
1.STM32采用Cortex-M3内核,具有高性能、高集成度、高代码密度和内嵌MVIC等特点。
2.STM32具有动态电源管理和待机低功耗模式,以及电池供电时的低电压工作能力。
3.STM32有两条外设总线,一条高速(APB2)和一条低速(APB1)。
4.STM32包含大部分外设,如CAN总线、USB、摄像头、麦克风等,适用于汽车电子、工业控制等领域。
5.STM32提供免费的库和良好的C语言支持,开发容易。
STM32的命名规则
1.STM32的命名包括公司名称(STM)、内核类型(M)、位数(32位)、是否支持内部flash等。
2.STM32的型号包括F系列(内部flash)和L系列(外部flash)。
3.STM32的型号命名如STM32F103C6T6,其中F103表示增强型系列,C表示内部flash,6表示闪存大小,T6表示封装类型。
0.4 dsp和arm的关系
✅ 简洁回答:
DSP 是一种专门用于“数字信号处理”的处理器类型;ARM 是一种通用处理器架构。两者是不同的设计路线,但现代 ARM 也支持 DSP 指令(比如 Cortex-M4/M7)并逐步融合了 DSP 功能。
🔍 二者核心区别
项目 | ARM 处理器(Cortex-M) | DSP 处理器(如 TI C2000) |
---|---|---|
定位 | 通用 MCU, | 带控制 + DSP 功能 专用于实时数字信号处理 |
指令集 | 通用指令 + 部分 DSP 指令 | 专为信号处理设计的 MAC/循环指令 |
速度优化 | 不一定针对特定算法 | 针对 FIR、FFT、控制算法优化结构 |
开发生态 | 大量厂商支持,库丰富 | TI 自主体系(Code Composer Studio) |
使用场景 | 电机控制、BMS、工业控制等 | 高频采样/滤波/伺服电机控制等精密场合 |
🧠 更直白点说:
ARM 是“通才”,越来越强(像 Cortex-M4、M7 支持 DSP 指令 + FPU,也能跑电机算法)。
DSP 是“专才”,硬件级支持 MAC、循环展开、流水线,非常适合复杂算法如 FOC、SVPWM、FFT。
🔬 举例说明:
控制任务 | 传统做法 | 现在常用方案 |
---|---|---|
简单电机控制(有刷/FOC) | TI DSP(C28x) | STM32F4(Cortex-M4)、GD32F450 等 |
高频信号处理(音频/雷达) | TI DSP | TI DSP 或 ARM A 系列 + 专用外设 |
BMS 主控 | 8位/ARM M3/M4 | STM32G4、NXP KEA、GD32F303 等 |
0.5 time定时器的分类以及功能介绍
0.5.1 定时器功能介绍
定时器是一种非常重要的外设,它用于生成精确的时间延迟。测量时间间隔,产生周期性的中断信号以及执行各种时间相关的任务
a. 时间延迟生成:定时器可以用来生成精确的时间延迟,这在需要等待特定时间间隔后执行某些操作的场合非常有用。
b.周期性事件触发:定时器可以配置为在固定的时间间隔内触发中断,这对于需要周期性执行的任务(如数据采集、更新显示等)至关重要。
c.脉冲宽度调制(PWM):许多定时器具有PWM输出功能,这对于控制电机速度、LED亮度调节等应用非常重要。
d.时间测量:定时器可以用来测量外部事件的时间间隔,如测量输入信号的频率或脉冲宽度。
e.实时时钟(RTC):在某些MCU中,定时器可以配置为实时时钟,提供日期和时间信息。
0.5.2 定时器分类以及具体功能
a.基本定时器:具有定时、计数功能,为其他内部外设提供时钟源。
b.通用定时器:具有定时、计数功能,输入信号计数、capture输入捕获、PWM输出、编码器接口、霍尔传感器接口、触发/更新事件。
c.高级定时器:具体定时、计数功能,输入信号计数、capture输入捕获、编码器接口、霍尔传感器接口、6路PWM通过控制MOS从而进行电机换相、互补输出、中心对齐、死区设置等,触发/更新事件。
d.低功耗定时器:可以进入低功耗模式,通过外部触发条件唤醒。具有编码器接口、PWM输出。
0.5.3 定时器功能总结
a.输入捕获、定时、计数
b.各种PWM输出。
c.触发/更新事件触发其他外设(ADC等)
d.编码器接口
e.霍尔传感器接口
0.5.4 高级定时器
0.5.4.1 高级定时器的刹车是什么
✅ 一句话定义:
刹车功能(Break)是高级定时器(如 TIM1、TIM8)用于在发生外部故障或内部异常时,立即关闭 PWM 输出通道的一种紧急保护机制。
🔧 为什么只有“高级定时器”有这个功能?
因为只有 高级定时器(TIM1、TIM8 支持:
特性 | 说明 |
---|---|
带互补输出(CHx + CHxN) | 适用于三相电机的上下桥臂控制 |
死区控制(Dead Time) | 防止桥臂同时导通 |
刹车输入(Break Input) | 支持硬件外部引脚或内部比较器控制强制关断 |
自动输出恢复 | 故障解除后可自动恢复输出 |
主从触发和组合通道控制 | 用于高复杂多通道同步应用 |
🧩 Break 功能的典型应用场景
场景 | 原因 | 触发 Break |
---|---|---|
电机过流 | 检测到电流超过保护阈值 | 比较器输出高电平 |
过压 / 欠压 | 电压异常,保护电源 | 比较器 + 模拟前端 |
MOS 温度过高 | 热敏传感器检测异常 | 外部 IO 输入高电平 |
MCU Lockup | 程序卡死 | 用 Cortex-M lockup signal |
手动急停按钮 | 用户触发外部 IO | GPIO 触发刹车引脚 |
🧠 工作原理示意
TIMx_BRK(Break)输入可以由:
时钟安全事件
外部 GPIO 引脚(如 PB12)
内部模拟比较器 COMP
Lockup 信号(程序异常保护)
PVD(电源电压检测器)
✅ 总结:高级定时器刹车的作用
功能 | 说明 |
---|---|
安全保护 | 检测异常立即关闭 PWM,防止电路炸毁 |
响应极快 | 硬件级响应,不依赖中断或软件逻辑 |
外部+内部输入 | 可接入 IO、比较器、电压监控、MCU lockup |
可自动恢复 | 故障解除后可选自动恢复 PWM(或保持关闭) |
工程常用 | 电机驱动、PFC控制、逆变器系统、UPS保护等场景都用得到 |
0.5.4.2 如果分频不是1,就会乘以2,那得到的这个结果是哪一个定时器,后面如果需要频率更低的定时器,那就继续分频吗?那乘不乘2这个分频是根据哪一个分频来计算的。
✅ 1. “乘以2”的前提是什么?
前提是:APB 总线的分频 ≠ 1
具体来说:
当你设置 RCC 的时钟结构时,如果你把 APB1 或 APB2 的分频设置为 2、4、8、16…,那么挂在该总线上的定时器就会“乘以2”。
如果 APB1/APB2 分频 == 1,那就不乘2
这个规则是 硬件电路级写死的,在 ARM Cortex-M3/M4 架构手册中说明如下:
“The timer clock frequency is set to twice the bus clock frequency when the APB prescaler is not 1.”
✅ 2. 哪些定时器会乘以2?
这个要看定时器挂在哪条总线上(APB1 还是 APB2):
定时器 | 所属总线 | 会不会乘2 |
---|---|---|
TIM1 | APB2(高级定时器) | 看 APB2 的分频 |
TIM8 | APB2 | 看 APB2 的分频 |
TIM2~7 | APB1(通用定时器) | 看 APB1 的分频 |
TIM15~17 | APB2(小型定时器) | 看 APB2 的分频 |
👉 所以你设置 APB1_Prescaler ≠ 1,就会影响 TIM2~TIM7 | ||
你设置 APB2_Prescaler ≠ 1,就会影响 TIM1/TIM8/TIM15… |
✅ 3. 我想让定时器频率更低,怎么办?继续分频吗?
是的!这是完全独立于“乘以2”逻辑的第二层分频,即你自己给定时器设定的“Prescaler(PSC)”值:
🧩 定时器实际频率计算公式:
TIMx_CLK = APBx × 2(如果分频≠1)
PWM频率 = TIMx_CLK / ((PSC + 1) × (ARR + 1))
所以,如果你觉得 PWM 频率太高:
第一步:可以把 TIMx 的 PSC(预分频器)加大
第二步:也可以把 ARR(自动重装载值)加大
示例:
假设 TIMx 输入频率为 108 MHz:
PSC = 107 // 预分频 108 → 1MHz
ARR = 999 // 计数到1000
则 PWM频率 = 1MHz / 1000 = 1kHz
所以你可以 用预分频器(PSC)+ 计数器周期(ARR)自由调节 PWM 周期或输出频率,而不需要“再级联别的定时器”。
✅ 4. “乘以2”是以哪个分频器为依据?
👉 是以你在 RCC 时钟配置中的 APB1_Prescaler 或 APB2_Prescaler 为依据。
在 SystemInit() 或 SystemClock_Config() 中你会看到类似:
// 设置 APB1 分频为 2
RCC->CFGR |= RCC_CFGR_PPRE1_DIV2;
// 设置 APB2 分频为 1
RCC->CFGR |= RCC_CFGR_PPRE2_DIV1;
那么:
APB1 总线频率 = HCLK / 2
挂在 APB1 上的 TIM2~5 的时钟输入 = APB1 × 2 = HCLK(108MHz)
⚠️ 注意这个倍频是隐含的,不是你显式乘的,是芯片硬件自动补偿的!
✅ 总结结构图:你可以这样理解
┌────────────┐
SYSCLK →│ AHB总线 │→ CPU
└────────────┘
↓
┌──────────────────────┐
↓ ↓
APB1(可分频) APB2(可分频)
↓ ↓
┌─────────────┐ ┌─────────────┐
│ TIM2~7, DAC… │ │ TIM1, TIM8… │
└─────────────┘ └─────────────┘
↓ ↓
若分频 ≠1,则定时器输入时钟 ×2(硬件自动)
0.5.4.3 什么是计数频率
一、计数频率的定义
计数频率(通常记为
定时器的计数器(Counter)每秒钟递增或递减的次数,单位是 Hz(次/秒)。
它由 输入时钟频率和 预分频器(Prescaler) 共同决定:
fclk: 定时器的输入时钟源频率(如STM32中APB总线提供的时钟)。
Prescaler:预分频系数(寄存器配置值,通常为0~65535之间的整数)。
+1:硬件设计决定(例如配置Prescaler=0表示1分频,Prescaler=1表示2分频)。
0.6 所谓“外设”,指的是什么?
类型 | 常见外设 |
---|---|
数字外设 | GPIO、USART、SPI、I2C、TIM、DMA |
模拟外设 | ADC(模数转换器)、DAC(数模转换器)、OPA(运放) |
控制类外设 | Watchdog、SysTick、NVIC、RTC |
22. 通用同步异步收发器(USART)
22.1 同步或异步通信
同步通信
定义:
同步通信指发送方发送数据后会等待接收方处理完成后再继续进行下一步操作,通信双方需要时间上的同步。
特点:
阻塞式:发送方发送数据后会阻塞,直到接收到确认或响应。
实时性强:适用于对响应时间有严格要求的场景。
双方必须同时在线。
举例:
电话通话:两人必须同时在线才能交流。
I2C、SPI 总线通信(多数实现是同步的)
函数调用:调用函数后必须等待返回结果才能执行下一步。
异步通信
定义:
异步通信指发送方发送数据后不需要等待接收方回应,可以继续执行后续操作,通信双方时间上不必同步。
特点:
非阻塞式:发送方发送完数据就可以继续工作。
容错性好,效率高。
不要求双方同时在线,可采用缓冲机制或消息队列。
举例:
电子邮件:发送方发送后,不需要等对方立即读取。
UART 串口通信:数据以帧形式发送,接收方自适应。
网络编程中的消息队列、事件驱动机制(如 MQTT、WebSocket)
23 DMA
DMA(Direct Memory Access,直接内存访问)是一种硬件机制,允许外设或某些硬件模块在不经过CPU干预的情况下,直接访问内存进行数据传输,从而提高系统效率并释放CPU资源。
24 全双工通信
通信方式 | 特点 | 示例 |
---|---|---|
单工 | 只能单方向传输数据A → B | 广播、电视 |
半双工 | 双向通信,但不能同时进行A ↔ B,但需轮流 | 对讲机、RS-485 |
全双工 | 双向通信且可同时进行A ↔ B,同步读写 | 电话、以太网、CAN-FD 等 |
25 支持硬件流控RTS CTS
基本概念
📌 RTS(Request to Send)
发送请求。
表示“我(发送方)准备发送数据,可以给我发吧”。
📌 CTS(Clear to Send)
可以发送。
表示“我(接收方)准备好接收数据,你可以发了”。
工作机制:
RTS 引脚:由接收方控制。
当接收方准备好接收数据时,它将 RTS 拉低(有效),告诉发送方“我可以接收数据”。
CTS 引脚:由发送方读取。
发送方在发送数据前检查 CTS 是否为有效电平,若无效则暂停发送。
🧠 这是一种双线控制方式,需要额外的两根串口引脚(RTS 和 CTS),除了 TX、RX 外总共 4 根线。
26 支持 LIN 模式
总结
项目 | 说明 |
---|---|
LIN 是什么 | 一种汽车低速串行总线协议,适合低成本、低实时性场合 |
支持 LIN 模式含义 | UART/USART 可直接处理 LIN 帧结构(如 Break、Sync、ID) |
与你工作关系 | 电机边缘模块、低端从设备常使用 LIN 与主控通信 |
开发注意事项 | 需加收发器 + 协议栈,部分 MCU 支持主从一体 |
27 SysTick 寄存器
寄存器名称 | 说明 |
---|---|
CTRL | 控制寄存器:启用、使能中断、选择时钟源 |
LOAD | 重装载值寄存器:计数器从这里开始递减 |
VAL | 当前值寄存器:当前计数器值 |
CALIB | 校准值寄存器(通常可忽略) |
🧪 示例:在 STM32 中配置 SysTick 每 1ms 触发一次中断
假设系统时钟为 72MHz,我们希望 1ms 触发一次:
SysTick_Config(SystemCoreClock / 1000); // 72000000 / 1000 = 72000
这个函数等价于:
SysTick->LOAD = 72000 - 1; // 设置重装值
SysTick->VAL = 0; // 清除当前计数器值
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk | // 使用 HCLK
SysTick_CTRL_TICKINT_Msk | // 使能中断
SysTick_CTRL_ENABLE_Msk; // 启动计数器
28 ARM
ARM 通常指的是一种处理器架构(CPU架构),也可以指设计这种架构的公司 ARM Ltd.(原名 Acorn RISC Machine)。
✅ 一句话解释:
ARM 是一种高效、低功耗的精简指令集架构(RISC),广泛应用于嵌入式系统、手机、平板、微控制器等设备中。
虽然 ARM 本质是架构(设计方案),但我们说“ARM 处理器”时,指的是 基于 ARM 架构设计的处理器,而不是 ARM 公司自己制造的芯片。
📦 ARM 的典型特征:
特性 | 说明 |
---|---|
RISC 架构 | 指令精简、执行速度快 |
低功耗设计 | 特别适合移动设备、嵌入式系统 |
模块化授权 | ARM 公司授权 IP,芯片厂商(如 STM、NXP、高通)做 SoC |
高度可配置 | 各种 ARM 核可按需裁剪、组合,如内核+MMU+FPU+Debug 单元 |
丰富生态 | 有 Cortex-M、Cortex-A、Cortex-R 等多个系列,配套开发工具成熟 |
🧬 ARM 架构的主要分类:
系列 | 适用场景 | 代表芯片或产品 |
---|---|---|
Cortex-M | 微控制器(MCU)、低功耗嵌入式 | STM32、NXP LPC、GD32 |
Cortex-A | 高性能应用处理器 | 手机、树莓派、高通芯片 |
Cortex-R | 实时处理器 | 汽车 ECU、硬盘控制器等 |