第4章 单片机外设:GPIO、定时器、中断、PWM

本章导学:外设操作是单片机面试的实战场,面试官通过你对GPIO、定时器、中断、PWM的理解,判断你是否能独立驱动硬件。掌握配置流程、中断响应机制、时序参数和常见陷阱是拿分关键。
中断响应面试回答框架 ① 明确中断源 ② 配置中断优先级 ③ 外设初始化(时钟/IO) ④ 编写中断服务函数 ⑤ 清除标志位 / 退出 加分区:说明中断响应时间、重入问题、临界区保护

面试问答卡(3个核心问题)

Q1:请简述STM32的GPIO配置流程,并说明推挽输出与开漏输出的区别。

考察点① 是否理解GPIO模式;② 配置步骤完整性;③ 应用场景判断
回答框架1) 使能GPIO时钟 → 2) 配置模式(输入/输出速度) → 3) 设置上下拉 → 4) 输出电平/输入读取。对比:推挽输出可强驱动高低电平;开漏输出只能拉低,高电平需外接上拉电阻,用于OD门多设备共享总线
示例回答“先使能GPIOA时钟,选择输出模式为推挽输出,可选速度50MHz,不上拉不下拉,初始化后输出高电平。推挽输出同时输出高低电平,驱动能力强;开漏输出只能拉低,需外接上拉电阻,常用于I²C或电平转换场景。” (约85字)
可能追问① 如何配置复用功能? ② 开漏输出为什么可以线“与”? ③ 上下拉电阻的典型值?
避坑提醒不要遗漏时钟使能;复用功能时配置为复用推挽而非普通推挽;开漏输出输出高电平时必须外接上拉电阻,否则输出浮空。

Q2:如何配置定时器产生1ms中断?写出关键寄存器或HAL库步骤。

考察点① 定时器时钟与分频;② 自动重装值计算;③ 中断使能与回调
回答框架1) 使能定时器时钟 → 2) 配置PSC分频与ARR重装值(PSC=时钟频率/1000-1, ARR=1000-1)→ 3) 使能更新中断 → 4) 编写HAL_TIM_PeriodElapsedCallback
示例回答“若时钟72MHz,PSC分频系数设为72-1,则计数频率1MHz,ARR设为1000-1,即可每隔1000个计数(1ms)触发一次中断。HAL库中调用HAL_TIM_Base_Start_IT(&htim2),在回调函数中翻转LED。” (约70字)
可能追问① 如何避免中断频繁影响主循环? ② 定时器溢出时间公式? ③ 如何产生PWM?
避坑提醒PSC和ARR均为16位寄存器(若定时器16位);ARR+1和PSC+1才对应实际值;溢出中断回调中不要执行耗时函数,否则会阻塞后续中断。

Q3:中断中能否使用延时函数或printf?为什么?

考察点① 中断实时性理解;② 中断重入与阻塞;③ 临界区保护
回答框架不能。原因:1) 中断服务应快速响应,延时浪费CPU时间;2) printf通常使用轮询或阻塞式输出,若优先级低可能死锁;3) 若进入中断后再开中断可能引发重入。如需输出应采用DMA或队列机制。
示例回答“中断内不应使用阻塞延时或printf。延时会使CPU空转,影响其他中断;printf通常为串口轮询输出,若串口中断优先级低于当前,则无法发出数据造成死锁。正确做法是设置标志位或使用环形缓冲区,在主循环中处理。” (约75字)
可能追问① 什么情况下可以在中断用printf?② 如何实现中断中带超时的等待?③ 中断嵌套如何处理?
避坑提醒不要在中断中调用HAL_Delay(),因为它依赖SysTick中断,若SysTick中断优先级低于当前中断就会死锁;中断中改变全局变量记得加volatile并考虑原子操作。

项目案例:智能小车直流电机PWM调速与编码器中断测速

STAR 项目表达框架 S 情境 智能小车竞赛 T 任务 精确调速+测速反馈 A 行动 PWM驱动+LPTIM编码器中断 R 结果 速度精度±2%,无丢步 核心技术:TIM_PWM + 外部中断(编码器) + PID控制 规模:双电机驱动,2路PWM,2路编码器A/B相,50Hz中断
项目名称STM32智能小车双路电机PWM调速与增量式编码器中断测速
业务背景大学生智能车竞赛,要求小车在1m×2m赛道内循迹并保持速度稳定,经过弯道时电机需平滑调速
规模指标双直流电机(12V),PW<0xE2><0x82><0x80>频率20kHz;编码器每转400个脉冲,中断响应≤5μs;速度控制周期50ms
技术栈STM32F103C8T6, HAL库, TIM2_CH1/CH2 PWM输出, GPIO外部中断(编码器A相), 滴答定时器计时, PID(位置式)
核心难点① 编码器脉冲上升沿与下降沿均触发中断,产生4倍频计数,需合理设置中断优先级防止丢失脉冲;② PWM频率与电机电感匹配,避免噪声;③ PID输出限幅防止电机饱和
面试高频追问1. 如何计算实际转速?
2. 编码器为什么用外部中断而不是定时器编码器模式?
3. 中断服务函数中如何与PID更新同步?
4. PWM占空比与电机电压的关系?
可迁移回答话术“我在智能车项目中通过定时器输出固定频率PWM驱动电机,同时利用编码盘每转400个脉冲的特点,在GPIO外部中断服务中累计脉冲数。每50ms用定时器中断触发一次速度计算,用比例积分(PI)控制器调整占空比,最终速度波动控制在±2%以内。这验证了我对中断优先级管理、PWM参数配置和实时控制的理解。”
面试建议:外设问题通常隐藏在项目深挖中。主动展示“配置流程 -> 中断响应 -> 参数计算 -> 异常处理”的闭环思维,远强于背诵寄存器名称。多用“我首先考虑时钟源,然后配置…,最后在回调中做…”的结构性表达。