第4章 单片机外设:GPIO、定时器、中断、PWM
本章导学:外设操作是单片机面试的实战场,面试官通过你对GPIO、定时器、中断、PWM的理解,判断你是否能独立驱动硬件。掌握配置流程、中断响应机制、时序参数和常见陷阱是拿分关键。
面试问答卡(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调速与编码器中断测速
| 项目名称 | 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参数配置和实时控制的理解。” |
面试建议:外设问题通常隐藏在项目深挖中。主动展示“配置流程 -> 中断响应 -> 参数计算 -> 异常处理”的闭环思维,远强于背诵寄存器名称。多用“我首先考虑时钟源,然后配置…,最后在回调中做…”的结构性表达。