第三批 STM32 / 硬件八股 · 复习总结(9 主题)
使用说明:先自测「判别规则速查表」,遮住右列自答;再做「综合练习题」,最后对答案。
面试前只翻本目录,不背题。
一、判别规则速查表(遮右自测)
| # | 主题 | 一句话判别规则 |
| -- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| 32 | 中断优先级 | NVIC:数字小优先;抢占优先级管打断、子优先级管排队;分组(位数)一次定死 |
| 33 | DMA | 大块/高速数据搬移、要释放 CPU → DMA;普通搬一次、循环搬到底;M2P/P2M/M2M 看方向;搬完进回调 |
| 34 | 时钟树 | 内部HSI 8M / 外部 HSE 起振 → PLL 倍频 → SYSCLK → AHB → APB1(慢)/ APB2(快);外设挂哪条总线查手册 |
| 35 | HAL vs LL | 要可移植/抽象/快速开发 → HAL;要极致性能/直接控寄存器 → LL;两者可混用 |
| 36 | I2C vs SPI vs UART | 有SCK 时钟 = 同步,无 = 异步(UART);I2C 2 线带地址慢、SPI 4 线 CS 寻址快全双工、UART 2 线约定波特率 |
| 37 | PWM | 频率 = CK/(PSC+1)/(ARR+1);占空比 = CCR/(ARR+1)×100%;改占空比 → 改 CCR,改频率 → 改 PSC/ARR |
| 38 | RAM/ROM/Flash | 掉电要留 → Flash;运行反复改 → RAM;RW-data 初值在 Flash 拷到 RAM,ZI-data 直接 RAM |
| 39 | 调试方法 | 逻辑/变量 →printf 或断点;波形/时序/波特率 → 逻辑分析仪;ISR 别 printf、实时系统别断点 |
| 40 | 交叉编译 | 编译器与目标平台架构不同 = 交叉;芯片跑不动编译器 →PC 编好烧进去;产物架构不匹配跑不了(x86 跑不了 ARM 的 bin) |
二、易混对比集中营(高频考点串讲)
抢占优先级 vs 子优先级(NVIC)
|
抢占优先级 |
子优先级 |
| 管什么 |
能不能打断正在跑的中断 |
同抢占级时的排队顺序 |
| 数字小 |
优先(小 = 高优先级) |
先响应 |
| 典型场景 |
高抢占级打断低抢占级,处理完回来 |
两中断同抢占级,谁先谁后 |
DMA 普通 vs 循环
|
普通模式 |
循环模式 |
| 搬运 |
搬完指定长度就停 |
搬完自动重装,持续搬到底 |
| 适用 |
一次性大块(如读 Flash) |
持续采样(ADC 连续采样/定时器触发) |
| 回调 |
每次搬完进一次 |
每轮搬完都进 |
五大时钟源(STM32)
| 源 |
是什么 |
精度/用途 |
| HSI |
内部 RC,8MHz |
快但精度一般,上电默认 |
| HSE |
外部晶振 |
准,常用 PLL 的输入 |
| PLL |
锁相环倍频 |
把低频倍到 SYSCLK 高频 |
| LSI |
内部低速(约 40KHz) |
看门狗/独立 RTC |
| LSE |
外部 32.768KHz 晶振 |
RTC 低功耗计时 |
HAL vs LL
|
HAL |
LL |
| 层级 |
高层抽象,函数封装 |
寄存器级轻封装 |
| 可移植 |
好(抽象) |
差(贴芯片) |
| 性能 |
调用开销大,慢 |
直接写寄存器,快 |
| 三模式 |
轮询 / 中断 / DMA |
不区分,裸寄存器操作 |
I2C vs SPI vs UART(一张表)
|
I2C |
SPI |
UART |
| 同步 |
同步(有 SCL) |
同步(有 SCK) |
异步(无时钟) |
| 线数 |
2(SDA+SCL) |
4(MOSI/MISO/SCK/CS) |
2(TX/RX) |
| 双工 |
半双工 |
全双工 |
全双工 |
| 寻址 |
7 位地址 |
CS 片选 |
无(约定即可) |
| 速度 |
慢(KHz 级) |
快(MHz 级) |
中(看波特率) |
PWM 三兄弟(ARR/PSC/CCR 各管什么)
| 寄存器 |
管什么 |
改它影响什么 |
| PSC |
预分频 |
计数时钟频率 |
| ARR |
计数上限 |
周期/频率 |
| CCR |
比较值 |
占空比 |
RAM vs Flash
|
RAM(SRAM) |
Flash |
| 掉电 |
丢(易失) |
保持(非易失) |
| 速度 |
快 |
慢 |
| 写入 |
随便写,无次数限制 |
先擦整块、寿命约 10 万次 |
| 放啥 |
变量/堆栈/运行数据 |
代码/常量/掉电保存的数据 |
printf vs 断点 vs 逻辑分析仪
| 工具 |
看什么 |
适合 |
禁忌 |
| printf |
变量/流程/状态 |
软件逻辑 |
ISR 里别用 |
| 调试器(断点) |
运行现场(变量/栈/寄存器) |
逻辑错/崩溃定位 |
实时系统别打断点 |
| 逻辑分析仪 |
波形/时序/波特率 |
协议/信号问题 |
看不到变量 |
交叉编译 vs 本地编译
|
本地编译 |
交叉编译 |
| 在哪编 |
电脑上 |
电脑上 |
| 给谁跑 |
同一台电脑 |
另一台机器(ARM 芯片) |
| 工具链 |
gcc |
arm-none-eabi-gcc 整套 |
| 典型 |
Linux 编 Linux |
Keil 编 STM32 固件 |
三、综合练习题(答完再对答案)
判断题(对/错 + 一句话理由)
- 中断里,抢占优先级高的中断一定打断抢占优先级低的中断。答: 对。数字小 = 抢占高,抢占级高的能打断正在跑的低抢占级中断(嵌套)。
- 同一分组下,子优先级只决定同抢占级中断的排队顺序,不能打断。答: 对。抢占优先级相同,根据子优先级的大小来确定相应的顺序,而不会发生打断(嵌套)。
- DMA 搬运完成前 CPU 可以干别的,搬运完成时进回调。答: 对。DMA 由 DMA 控制器搬数据,CPU 零参与,搬完才进 1 次完成中断/回调。
- DMA 循环模式主要用于一次性大块数据搬运。答: 错,一次性大块数据搬运使用普通模式,循环模式主要用于需要连续搬运数据的场景,比如采样。
- HSI 是外部高速晶振。答: 错,HSE是外部高速晶振
- 所有外设都挂在 APB1 总线上。答: 错,需要根据外设是否需要高速总线来进行任务,才能决定是否在 APB1 或者是 APB2 这个高速总线上。
- HAL 库比 LL 库运行效率更高。答: 错, LL寄存器效率更高,HAL库对硬件的抽象, 效率比较低
- SPI 是全双工、4 根线,靠片选 CS 选从机。答: 对
- I2C 是异步通信。答: 错,是同步
- UART 通信双方必须约定相同的波特率。答: 对
- 要提高 PWM 频率,改 CCR 寄存器。答: 错,一般而言,修改 ARR
- PWM 占空比 = CCR/(ARR+1) × 100%。答: 对
- 全局变量的初值存放在 RAM 里。答: 错, 初值不为0的是存储在 Flash 中
- RAM 掉电后数据还在。答:错,这个 Flash 掉电数据还在
- 串口乱码、怀疑波特率问题,用 printf 排查就够了。答: 错,使用逻辑分析仪或者示波器
- 交叉编译出来的 .exe 可以直接在电脑上运行调试。答: 错,交叉编译的,只在目标芯片上才能使用
填空题
- NVIC 优先级数字越小,优先级越 ____。答: 高
- STM32 时钟树里,SYSCLK 通常由 ____ 倍频而来。答: PLL
- DMA 三种搬运方向:M2P、____、M2M。答: P2M
- HAL 库的三种处理模式:轮询、____、DMA。答:
普通 → 应填 中断(HAL 三模式:轮询 / 中断 / DMA)
- SPI 的四根线:MOSI、MISO、SCK、____。答: CS
- PWM 占空比公式 = ____ / (ARR+1) × 100%。答: CCR
- 程序运行时全局变量的当前值存放在 ____。答: 静态区
- 在 ISR 里排查问题不能用 ____(阻塞 + 慢,破坏实时性)。答: printf
场景 / 代码判断
- 场景:ADC 连续高频采样,每轮都要搬运数据并通知主程序 → DMA 用什么模式?答: 循环
- 场景:设备的校准参数要掉电保存、重启后还在 → 存哪?能不能每秒更新一次?答:Flash,不能每秒更新
- 场景:FreeRTOS 任务 A 抢不到 CPU,怀疑调度问题 → 用什么调试手段?为什么不能打断点?答:使用 printf 打印 RTOS 提供的接口内容,不能打断点,断点会打断调度导致时序错乱。
- 场景:在 Windows 上用 Keil 编译 STM32 程序 → 交叉编译还是本地编译?答: 交叉编译
四、答案(已分离)
答案解析已单独存放,避免自测时不小心看到答案:
第三批复习总结-答案.md(同目录)——完成全部 28 题后再翻开对照。
复习目标:每条规则能自己讲出"为什么",不只记住结论。