第三批复习总结.md 9.7 KB

第三批 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 固件

三、综合练习题(答完再对答案)

判断题(对/错 + 一句话理由)

  1. 中断里,抢占优先级高的中断一定打断抢占优先级低的中断。答: 对。数字小 = 抢占高,抢占级高的能打断正在跑的低抢占级中断(嵌套)。
  2. 同一分组下,子优先级只决定同抢占级中断的排队顺序,不能打断。答: 对。抢占优先级相同,根据子优先级的大小来确定相应的顺序,而不会发生打断(嵌套)。
  3. DMA 搬运完成前 CPU 可以干别的,搬运完成时进回调。答: 对。DMA 由 DMA 控制器搬数据,CPU 零参与,搬完才进 1 次完成中断/回调。
  4. DMA 循环模式主要用于一次性大块数据搬运。答: 错,一次性大块数据搬运使用普通模式,循环模式主要用于需要连续搬运数据的场景,比如采样。
  5. HSI 是外部高速晶振。答: 错,HSE是外部高速晶振
  6. 所有外设都挂在 APB1 总线上。答: 错,需要根据外设是否需要高速总线来进行任务,才能决定是否在 APB1 或者是 APB2 这个高速总线上。
  7. HAL 库比 LL 库运行效率更高。答: 错, LL寄存器效率更高,HAL库对硬件的抽象, 效率比较低
  8. SPI 是全双工、4 根线,靠片选 CS 选从机。答: 对
  9. I2C 是异步通信。答: 错,是同步
  10. UART 通信双方必须约定相同的波特率。答: 对
  11. 要提高 PWM 频率,改 CCR 寄存器。答: 错,一般而言,修改 ARR
  12. PWM 占空比 = CCR/(ARR+1) × 100%。答: 对
  13. 全局变量的初值存放在 RAM 里。答: 错, 初值不为0的是存储在 Flash 中
  14. RAM 掉电后数据还在。答:错,这个 Flash 掉电数据还在
  15. 串口乱码、怀疑波特率问题,用 printf 排查就够了。答: 错,使用逻辑分析仪或者示波器
  16. 交叉编译出来的 .exe 可以直接在电脑上运行调试。答: 错,交叉编译的,只在目标芯片上才能使用

填空题

  1. NVIC 优先级数字越小,优先级越 ____。答: 高
  2. STM32 时钟树里,SYSCLK 通常由 ____ 倍频而来。答: PLL
  3. DMA 三种搬运方向:M2P、____、M2M。答: P2M
  4. HAL 库的三种处理模式:轮询、____、DMA。答: 普通 → 应填 中断(HAL 三模式:轮询 / 中断 / DMA)
  5. SPI 的四根线:MOSI、MISO、SCK、____。答: CS
  6. PWM 占空比公式 = ____ / (ARR+1) × 100%。答: CCR
  7. 程序运行时全局变量的当前值存放在 ____。答: 静态区
  8. 在 ISR 里排查问题不能用 ____(阻塞 + 慢,破坏实时性)。答: printf

场景 / 代码判断

  1. 场景:ADC 连续高频采样,每轮都要搬运数据并通知主程序 → DMA 用什么模式?答: 循环
  2. 场景:设备的校准参数要掉电保存、重启后还在 → 存哪?能不能每秒更新一次?答:Flash,不能每秒更新
  3. 场景:FreeRTOS 任务 A 抢不到 CPU,怀疑调度问题 → 用什么调试手段?为什么不能打断点?答:使用 printf 打印 RTOS 提供的接口内容,不能打断点,断点会打断调度导致时序错乱。
  4. 场景:在 Windows 上用 Keil 编译 STM32 程序 → 交叉编译还是本地编译?答: 交叉编译

四、答案(已分离)

答案解析已单独存放,避免自测时不小心看到答案:

第三批复习总结-答案.md(同目录)——完成全部 28 题后再翻开对照。


复习目标:每条规则能自己讲出"为什么",不只记住结论。