# 第三批 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 可以直接在电脑上运行调试。答: 错,交叉编译的,只在目标芯片上才能使用 ### 填空题 17. NVIC 优先级数字越小,优先级越 ____。答: 高 18. STM32 时钟树里,SYSCLK 通常由 ____ 倍频而来。答: PLL 19. DMA 三种搬运方向:M2P、____、M2M。答: P2M 20. HAL 库的三种处理模式:轮询、____、DMA。答: ~~普通~~ → 应填 **中断**(HAL 三模式:轮询 / 中断 / DMA) 21. SPI 的四根线:MOSI、MISO、SCK、____。答: CS 22. PWM 占空比公式 = ____ / (ARR+1) × 100%。答: CCR 23. 程序运行时全局变量的当前值存放在 ____。答: 静态区 24. 在 ISR 里排查问题不能用 ____(阻塞 + 慢,破坏实时性)。答: printf ### 场景 / 代码判断 25. 场景:ADC 连续高频采样,每轮都要搬运数据并通知主程序 → DMA 用什么模式?答: 循环 26. 场景:设备的校准参数要掉电保存、重启后还在 → 存哪?能不能每秒更新一次?答:Flash,不能每秒更新 27. 场景:FreeRTOS 任务 A 抢不到 CPU,怀疑调度问题 → 用什么调试手段?为什么不能打断点?答:使用 printf 打印 RTOS 提供的接口内容,不能打断点,断点会打断调度导致时序错乱。 28. 场景:在 Windows 上用 Keil 编译 STM32 程序 → 交叉编译还是本地编译?答: 交叉编译 --- ## 四、答案(已分离) 答案解析已单独存放,避免自测时不小心看到答案: > **`第三批复习总结-答案.md`**(同目录)——完成全部 28 题后再翻开对照。 --- _复习目标:每条规则能自己讲出"为什么",不只记住结论。_