跳转至

GPIO、串口总线、中断与定时器|逐题工程答案

本文以常见 MCU 外设为背景。GPIO 电气限制、定时器时钟树、NVIC 行为和 HAL API 均需结合目标芯片系列确认。

1. GPIO 推挽与开漏输出有什么区别?

推挽输出能主动驱动高电平和低电平,适合常规数字输出;开漏输出只能主动拉低,高电平依赖外部或内部上拉。开漏适合多设备共享线路、线与逻辑和部分电平转换场景,I²C 总线就是典型例子。

开漏上拉阻值需同时满足上升时间和灌电流要求。上拉太大,边沿变慢;太小,低电平时器件灌电流可能超限。不能仅凭“开漏更安全”就到处使用,必须检查外部电路与数据手册。

2. UART 为什么要设置波特率?

UART 通常没有独立时钟线,接收端根据起始位检测和自身波特率时钟对数据位采样。双方时钟偏差会随一个字符内的采样时间累积,超过采样容限后就可能出现帧错误或乱码。

排查乱码时应依次确认波特率、数据位、奇偶校验、停止位、逻辑电平、共地、TX/RX 是否交叉、时钟误差和波形质量。先用逻辑分析仪解码,再用示波器检查电平和边沿,能更快区分协议配置错误与电气问题。

3. I²C 为什么需要上拉电阻?

I²C 的 SDA/SCL 通常为开漏结构,设备只能拉低总线,释放总线后由上拉电阻恢复高电平。这样多个设备可以共享总线而不会像推挽输出那样一个拉高、另一个拉低直接冲突。

上拉选择要考虑总线电容、目标速率、允许上升时间和器件灌电流。总线过长、设备过多或电容太大时,上升沿可能达不到时序要求;上拉太强又可能超出器件电流能力。

4. SPI 与 I²C 如何选型?

SPI 通常有时钟、MOSI、MISO 和片选,结构简单、吞吐量高,代价是引脚较多且多从设备通常需要额外片选。I²C 使用两根共享信号线和地址机制,节省引脚,但速率、总线电容和仲裁/时序约束更明显。

选择要看吞吐量、设备数量、引脚预算、线长、EMC、驱动支持和故障恢复。SPI 的高频率不保证实际吞吐一定更高,片选开销、软件搬运、DMA 和设备响应时间也会影响性能。

5. ADC 的采样率、分辨率和精度有什么区别?

采样率表示单位时间采样次数;分辨率表示输出量化级数,例如理想 12 位 ADC 有 4096 个码值;精度还受到参考电压、偏置、增益误差、非线性、噪声、输入源阻抗和布局等因素影响。

12 位 ADC 不一定比 10 位 ADC 更准确。要根据目标信号带宽和动态范围设计采样率,并根据 ADC 采样电容、采样时间和信号源阻抗选择前端。对低电平或高精度测量,还需考虑参考源、滤波、校准和接地。

6. 中断与异常有什么区别?

“异常”常用作处理器内部同步事件及外部中断的总称;在 Cortex-M 语境下,异常号涵盖复位、NMI、Fault、系统异常和外部 IRQ。不同架构的术语和优先级规则不同,必须按内核手册理解。

向量表给出各异常入口。发生异常时,内核执行规定的现场保存与优先级仲裁,之后进入处理函数。若异常发生在屏蔽状态或更高优先级处理期间,响应时刻会推迟。

7. ISR 为什么应该尽量短?

ISR 执行期间可能阻止低优先级中断响应,并增加其他任务的调度延迟。耗时处理还会让系统更难满足最坏响应时间约束。

建议 ISR 只完成必要的状态读取、数据暂存、清除中断源和发出事件通知;复杂解析、日志、阻塞等待和长循环移到任务或主循环处理。要注意清中断标志的时机和方式,避免重复进入或丢失新事件。

8. 中断嵌套有什么风险?

高优先级中断可打断低优先级中断处理,提高紧急事件响应能力,但会增加栈使用、共享数据竞争和最坏执行时间分析难度。若多个 ISR 共用缓冲区,必须定义清晰的所有权和同步方式。

是否启用嵌套应依据响应时间需求、优先级设计、栈预算和驱动限制决定。高优先级 ISR 不应调用可能阻塞、不可重入或依赖低优先级中断完成的函数。

9. NVIC 优先级分组是什么?

在支持相应配置的 Cortex-M NVIC 中,优先级位可分配给抢占优先级和子优先级。抢占优先级决定一个异常能否打断另一个正在执行的异常;子优先级用于同一抢占级别中决定待处理异常的先后顺序。

不同芯片实现的优先级位数不同,数值越小通常表示优先级越高。使用 HAL/RTOS 时要确认优先级分组与 RTOS 可调用 API 的中断优先级限制一致,不要直接套用其他系列的配置值。

10. 临界区是什么?为什么 ISR 与任务中的保护方式不同?

临界区是必须避免并发访问的代码段。单核系统中,短临界区可能通过屏蔽相关中断保护;RTOS 任务间还可以使用互斥量、资源锁或消息传递。多核系统则需要跨核同步机制,单纯关本核中断通常无法阻止另一核访问共享数据。

在 ISR 中不能随意调用阻塞式互斥量,因为 ISR 无法像普通任务那样等待调度。具体保护方式取决于访问者集合、优先级、内核和硬件架构。

11. 定时器溢出时发生了什么?

计数器按照时钟和分频设置递增或递减,到达自动重装载条件时更新计数值,并可能置位更新标志、产生中断或触发 DMA/其他外设事件。实际行为取决于向上/向下计数、中心对齐、预分频器和更新事件配置。

不要把“定时器中断频率”简单等同于系统时钟频率。应从定时器实际输入时钟、PSC、ARR、计数模式和更新事件计算,并用示波器或逻辑分析仪测量验证。

12. 通用定时器与高级定时器有什么差别?

高级定时器常提供互补 PWM 输出、死区插入、刹车输入和重复计数等电机控制功能;通用定时器通常用于定时、输入捕获、输出比较和常规 PWM。具体功能因 MCU 型号而异。

半桥/全桥驱动中,互补输出和死区时间配置错误可能导致上下桥臂直通。必须参考芯片手册、驱动器要求和安全设计,先在受控条件下验证波形,再连接真实功率级。

13. PWM 频率和占空比如何计算?

边沿对齐、向上计数的常见计数器,若定时器输入时钟为 f_timer,预分频寄存器为 PSC,自动重装载寄存器为 ARR,则常见更新频率近似为:

f_PWM = f_timer / ((PSC + 1) × (ARR + 1))

比较寄存器 CCR 决定有效占空比,具体比例取决于 PWM 模式和计数配置。中心对齐模式、定时器倍频规则和高级定时器重复计数可能改变公式。计算前先确认 f_timer,而不是盲目使用 CPU 主频。

14. 输入捕获与输出比较分别做什么?

输入捕获在外部边沿到来时把计数器值锁存到捕获寄存器,常用于测量周期、脉宽、频率或编码器信号。输出比较在计数器达到设定值时改变输出或产生事件,适合精确时刻触发。

测量时要考虑计数器溢出、输入滤波、边沿极性、同步延迟和捕获溢出。频率很高时,可结合 DMA 或硬件编码器接口减少 ISR 开销。

15. 看门狗如何帮助恢复故障?

看门狗通过独立或受监控的计时机制检测软件未按预期服务的情况,超时后可能复位系统或触发故障动作。它不能证明软件功能正确,也不能单独检测所有死锁或数据错误。

喂狗应与系统健康状态关联,例如关键任务完成检查、调度活性和通信状态,而不是在一个高频定时器中无条件喂狗。窗口看门狗还可检测过早服务;外部看门狗可能提供独立时钟与额外监控。

16. 如何排查 I²C 设备不应答?

  1. 用示波器确认供电、共地和 SDA/SCL 空闲电平。
  2. 确认上拉电阻、总线速率和引脚复用。
  3. 核对 7 位地址与 HAL API 对地址参数的要求,避免把读写位混入地址。
  4. 检查设备上电等待时间、复位状态和地址选择脚。
  5. 逐个断开设备,排除地址冲突或某器件持续拉低总线。
  6. 检查时钟拉伸、总线恢复流程和超时配置。
  7. 用逻辑分析仪解码 START、地址、ACK/NACK 和 STOP。

17. UART 数据乱码如何定位?

先检查波特率、数据位、奇偶校验和停止位,再检查电平标准、共地和信号极性。用逻辑分析仪观察位宽并解码,可以确认配置是否匹配;用示波器确认上升沿、过冲、振铃和电平阈值。

若仅在高负载时丢字节,进一步检查中断延迟、FIFO 溢出、DMA 缓冲区所有权、环形缓冲区并发和缓存一致性,而不是一味降低波特率。

18. 如何系统验证外设初始化?

建立“时钟—引脚复用—电气连接—外设寄存器—中断/DMA—上层协议”的检查链。每一步记录可观测证据:时钟配置值、GPIO 模式、波形、状态寄存器、DMA 计数和协议解码结果。

优先使用最小化测试程序单独验证外设,再集成到 RTOS 或业务应用中。这样可以区分硬件、电气、时钟、驱动和业务逻辑问题。