STM32学习笔记

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 DSPTI DSP 或 ARM A 系列 + 专用外设
BMS 主控8位/ARM M3/M4STM32G4、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
手动急停按钮用户触发外部 IOGPIO 触发刹车引脚

🧠 工作原理示意
在这里插入图片描述

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
TIM1APB2(高级定时器)APB2 的分频
TIM8APB2APB2 的分频
TIM2~7APB1(通用定时器)APB1 的分频
TIM15~17APB2(小型定时器)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、硬盘控制器等
### STM32学习资源推荐 对于希望深入学习STM32微控制器的开发者来说,获取高质量的学习资料至关重要。以下是几个方向可以帮助找到适合的学习材料: #### 官方文档 STMicroelectronics 提供了详尽的技术手册和数据表,这些官方文档涵盖了从基础到高级的各种主题[^1]。通过访问 ST 的官方网站,可以下载最新的芯片规格书、应用笔记以及固件库。 #### 社区分享与博客文章 网络上存在大量由经验丰富的工程师撰写的STM32学习笔记,例如提到的“Stm32学习笔记,3万字超详细”的内容就非常有价值。这类笔记通常会结合实际项目经历来解释复杂的概念,并提供实用的操作指南。此外,“【笔记STM32篇”这样的记录也强调了实践的重要性——鼓励读者亲自尝试编码过程以加深理解[^2]。 #### 开发环境搭建指导 为了顺利开展基于STM32项目的开发工作,熟悉如何配置IDE(如Keil MDK或者STM32CubeIDE),安装必要的驱动程序也是必不可少的一环。许多在线教程都会详细介绍这一流程并附带截图说明以便于新手快速上手。 #### 中断处理函数解析 针对具体功能模块比如外部中断线(EXTI),需要注意不同版本API间可能存在的细微差异。虽然有说法指出`EXTI_ClearFlag` 和 `EXTI_ClearITPendingBit` 在某些实现里表现一致但实际上它们各自承担着不同的职责,在特定场景下选用合适的清除方法能够提高系统的稳定性和效率。 ```c // 示例代码展示如何正确使用上述两个宏定义 void EXTI0_IRQHandler(void){ if(__HAL_GPIO_EXTI_GET_FLAG(GPIO_PIN_0)!=RESET){ __HAL_GPIO_EXTI_CLEAR_FLAG(GPIO_PIN_0); // 使用此方式清标志位更直观些 /* Add your application code here */ } } ``` #### PDF资源整合建议 如果偏好纸质阅读体验,则可以通过搜索引擎查找关键词组合:“stm32 学习 教程 pdf”,这样往往能找到一些整理成册的手册文件可供离线查看。不过要注意甄别来源可靠性以免误信过期信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值