STM32输出比较与输入捕获配置详解
一、问题解构与概念辨析STM32 定时器中最重要的一对功能便是输出比较和输入捕获。二者共用一套硬件通道捕获/比较通道但作用互为反向输出比较是定时器主动向外输出特定波形最常见是 PWM输入捕获是定时器被动测量外部输入的信号波形测频率、脉宽、占空比。功能方向核心目的典型应用输出比较定时器 → 外部引脚产生精确时序波形、PWM电机调速、舵机控制、LED 调光输入捕获外部信号 → 定时器测量信号频率、脉宽、周期红外遥控解码、PWM 输入测量、超声波测距回波测量两者在硬件上共用TIMx_CCRx捕获/比较寄存器由TIMx_CCMRx寄存器的模式位决定该通道工作在捕获模式还是输出比较模式 。二、输出比较配置详解1. 工作原理输出比较模式下定时器将计数器CNT与预设的CCR值进行比较。当两者相等时根据配置的输出模式PWM1、PWM2、强制输出、翻转等改变输出引脚的电平状态 。产生 PWM 最常用的是PWM 模式 1CNT CCR 时输出有效电平CNT ≥ CCR 时输出无效电平由此形成占空比可调的方波 。PWM 的频率由预分频器 PSC 和自动重装载值 ARR 共同决定占空比则由 CCR 与 ARR 的比值决定 。以 STM32F103 为例时基时钟为 72MHz配置公式如下PWM频率 72MHz / ((PSC1) * (ARR1)) PWM占空比 CCR / (ARR1) × 100%2. 配置步骤标准外设库以使用 TIM3 的 CH2PA1输出 20kHz、50% 占空比 PWM 为例使能 TIM3 和 GPIOA 时钟配置 PA1 为复用推挽输出配置 TIM3 时基PSC、ARR配置 TIM3 的 CH2 为 PWM1 模式设置 CCR2使能 TIM3 的 CH2 输出启动 TIM3。3. 代码示例// TIM3_CH2 (PA1) 输出 PWM20kHz50% 占空比 void TIM3_PWM_Init(uint16_t arr, uint16_t psc, uint16_t ccr) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; // 1. 使能时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置 PA1 为复用推挽输出TIM3_CH2 GPIO_InitStructure.GPIO_Pin GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 时基配置PSC3ARR899 → 72MHz/(4*900)20kHz TIM_TimeBaseStructure.TIM_Prescaler psc; // 预分频例如 4-13 TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period arr; // 自动重装载值例如 900-1899 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); // 4. 配置 CH2 为 PWM1 模式 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; // PWM 模式1 TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse ccr; // CCR 值例如 450 TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; // 有效电平为高 TIM_OC2Init(TIM3, TIM_OCInitStructure); // 生效 CCR2 预装载值防止更新瞬间跳变 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); // 5. 启动定时器 TIM_Cmd(TIM3, ENABLE); } // 调用示例输出 20kHz占空比 50% 的 PWM // TIM3_PWM_Init(900-1, 4-1, 450);要点说明预装载保护默认情况下修改 CCR 会立即生效可能导致输出波形在运行中产生瞬间跳变。开启预装载后CCR 的新值会在下一次计数周期更新时生效确保波形平滑 。高级定时器TIM1、TIM8还需要调用TIM_CtrlPWMOutputs()使能 MOE 主输出否则 PWM 引脚无输出 。三、输入捕获配置详解1. 工作原理输入捕获模式下定时器监测指定通道的输入引脚当检测到设定的边沿上升沿/下降沿时将当前计数器的值锁存到 CCRx 寄存器并触发捕获中断 。通过连续两次捕获的计数器差值结合定时器计数频率即可计算信号的周期和脉宽 。频率测量有两种常用方法 测频法在固定时间内统计信号上升沿个数适合高频信号测周法测量一个周期的时长适合低频信号。输入捕获天然适合测周法。若使用 PWM 输入模式从模式选择复位还可以自动测量频率和占空比而无需中断频繁干预 。2. 配置步骤以使用 TIM4_CH1PB6输入捕获测量信号频率为例采用上升沿捕获并且利用定时器更新中断配合溢出计数来测量长周期信号使能 TIM4 与 GPIOB 时钟配置 PB6 为浮空输入若有外部上拉/下拉可配置上拉/下拉输入配置 TIM4 时基设置合适的 PSC 以获得所需分辨率配置 TIM4_CH1 为上升沿捕获使能捕获中断和更新中断配置 NVIC编写中断服务函数在捕获中断中读取 CCR 值在更新中断中统计溢出次数。3. 代码示例volatile uint16_t captured_value 0; // 当前捕获值 volatile uint16_t capture_count 0; // 捕获次数 volatile uint32_t overflow_count 0; // 溢出次数 // TIM4_CH1 (PB6) 输入捕获初始化测量信号周期单位时钟计数 void TIM4_Capture_Init(uint16_t psc) { GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; NVIC_InitTypeDef NVIC_InitStructure; // 1. 时钟使能 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 2. GPIO 配置为浮空输入输入捕获引脚必须是输入模式 GPIO_InitStructure.GPIO_Pin GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOB, GPIO_InitStructure); // 3. 时基配置设置 PSC 以调整计数分辨率 TIM_TimeBaseStructure.TIM_Prescaler psc; // 例72-1计数频率 1MHz TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_Period 0xFFFF; // 16位定时器最大计数值 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInit(TIM4, TIM_TimeBaseStructure); // 4. 配置 CH1 输入捕获上升沿直接映射到 TI1 TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; // 上升沿捕获 TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; // 直接映射 TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; // 不分频每个边沿都捕获 TIM_ICInitStructure.TIM_ICFilter 0x00; // 不滤波 TIM_ICInit(TIM4, TIM_ICInitStructure); // 5. 使能捕获中断和更新中断 TIM_ITConfig(TIM4, TIM_IT_CC1 | TIM_IT_Update, ENABLE); // 6. NVIC 配置 NVIC_InitStructure.NVIC_IRQChannel TIM4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority 2; NVIC_InitStructure.NVIC_IRQChannelSubPriority 0; NVIC_InitStructure.NVIC_IRQChannelCmd ENABLE; NVIC_Init(NVIC_InitStructure); // 7. 启动定时器 TIM_Cmd(TIM4, ENABLE); } // 中断服务函数 void TIM4_IRQHandler(void) { // 处理更新事件计数器溢出 if (TIM_GetITStatus(TIM4, TIM_IT_Update) ! RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_Update); overflow_count; // 溢出次数加一 } // 处理捕获事件检测到上升沿 if (TIM_GetITStatus(TIM4, TIM_IT_CC1) ! RESET) { TIM_ClearITPendingBit(TIM4, TIM_IT_CC1); captured_value TIM_GetCapture1(TIM4); // 读取 CCR1 中的锁存值 capture_count; // 用户代码此时可结合 overflow_count 和 captured_value 计算周期 // 例如总计数 captured_value (uint32_t)overflow_count * 0x10000 // 信号周期 总计数 / 计数频率 } }计算说明假设 PSC 72-1即计数频率为72MHz / 72 1MHz一个计数周期为 1μs若捕获后captured_value 500且期间overflow_count 2则信号周期T (2 × 65536 500) μs ≈ 131.572ms频率约为 7.6Hz 。PWM 输入模式PWMI若想自动同时测量周期和占空比可配置为 PWM 输入模式。此时同一通道的另一个输入会被映射到另一捕获通道两个通道分别捕获周期和脉宽代码配置更复杂但效率更高 。四、输出比较与输入捕获配置要点对比对比项输出比较PWM 输出输入捕获GPIO 模式GPIO_Mode_AF_PP复用推挽输出GPIO_Mode_IN_FLOATING或上拉/下拉输入核心寄存器TIMx_CCR写入比较值TIMx_CCR读出锁存值模式配置寄存器TIMx_CCMR_OCxM输出比较模式TIMx_CCMR_ICxS与ICxF输入捕获选择与滤波触发事件计数到 CCR 产生电平翻转外部边沿触发锁存计数中断来源无专门捕获中断一般由更新中断控制周期TIM_IT_CCx捕获中断 TIM_IT_Update溢出中断预装载功能可开启预装载平滑更新无需预装载锁存即用五、综合应用实例PWM 输出驱动舵机 输入捕获反馈实际项目中输出比较与输入捕获常组合构成闭环系统。例如使用 TIM1 输出 PWM 驱动舵机同时用 TIM2 输入捕获测量舵机角度传感器电位计输出的脉宽信号以实现角度闭环控制 。系统框图STM32 PWM输出TIM1_CH1→ 舵机控制信号 舵机角度反馈信号脉宽 0.5~2.5ms→ TIM2_CH1 输入捕获代码框架// 1. 输出比较TIM1_CH1 输出 50Hz 舵机 PWM周期 20ms void Servo_PWM_Init(void) { // PSC72-1ARR20000-1 → PWM频率 50Hz // CCR 范围 500~2500 对应 0.5ms~2.5ms 脉宽 } // 2. 输入捕获TIM2_CH1 测量反馈脉宽 void Feedback_Capture_Init(void) { // 配置上升沿和下降沿交替捕获或使用 PWM 输入模式 // 捕获到上升沿记录时间 t1下降沿记录 t2脉宽 t2 - t1 } // 3. 主循环中根据反馈调节 PWM 占空比 void servo_control_loop(void) { uint16_t target_pwm 1500; // 期望角度对应脉宽 uint16_t current_pulse get_captured_pulse(); // 实测脉宽 // 简单比例控制 if (current_pulse target_pwm) { CCR1 1; // 增大脉宽 } else if (current_pulse target_pwm) { CCR1 - 1; // 减小脉宽 } }六、常见注意事项输出比较通道与引脚映射TIM3_CH2 默认在 PA1但重映射后可在 PB5 输出。不同型号引脚映射不同必须先查数据手册 。输入捕获滤波对于含噪声的信号可在TIM_ICFilter中设置滤波值0~15滤波值越大越抗干扰但会引入延迟 。捕获溢出处理测量低频信号时计数器可能溢出多次必须通过更新中断统计溢出次数才能正确恢复周期 。PWM 预装载与 CCR 更新建议始终开启预装载功能防止运行中修改 CCR 导致输出波形异常 。高级定时器 PWM 输出TIM1/TIM8 使用 PWM 输出时必须额外使能主输出TIM_CtrlPWMOutputs(TIM1, ENABLE)。通过上述配置方法与代码示例即可独立实现 PWM 输出和频率/脉宽测量的功能并可根据实际工程需求组合运用。参考来源STM32之六TIM通用定时器进阶应用输入捕获与PWM实战STM32学习——输出比较和输入捕获STM32-一文搞懂通用定时器捕获/比较通道STM32 TIM输入捕获stm32的定时器输入捕获与输出比较STM32实现PWM输出与PWM输入捕获HAL库

相关新闻

01序列间隔检查:一次遍历解决力扣1437边界问题

01序列间隔检查:一次遍历解决力扣1437边界问题

前几天有读者在后台问我一道看起来很简短的题:给你一个01序列,以及一个整数k,要判断是不是所有1都至少间隔k个元素。这不光是力扣1437的原题(英文名 Check If All 1s are at Least Length K Places Away),也…

2026/10/11 7:15:42 阅读更多 →
代码智能体从零上手:实操配置与开发效率提升指南

代码智能体从零上手:实操配置与开发效率提升指南

1. 从零上手代码智能体:为什么我决定认真折腾这套工具第一次听说“代码智能体”这个词,是在一个开发者社群里。当时有人丢了一张截图,说自己在编辑器里敲了一行注释,几秒钟之后一整段带异常处理的函数就自动补全了,连单…

2026/10/11 7:15:42 阅读更多 →
工程视角下的Transformer:训练策略、推理优化与全流程避坑指南

工程视角下的Transformer:训练策略、推理优化与全流程避坑指南

2. 为什么这场分享要从“工程”切入Transformer最近整理笔记时,重新翻出某位资深AI工程师在一所高校做的技术分享录音,主题是AI工程实践与Transformer架构。说来也巧,市面上讲Transformer的教程不少,但大多停留在“看懂注意力公式…

2026/10/11 7:15:42 阅读更多 →

最新新闻

Linux C++符号混淆实战:从符号泄露到崩溃还原

Linux C++符号混淆实战:从符号泄露到崩溃还原

上个月处理一个发布版Linux软件被逆向的排查,第一次动手就发现一个很扎心的现象:那个C项目没做任何符号层面的处理,对手一条nm命令下来,整个项目的内部函数名、类名、全局变量全部原样躺在那里。软件里有一块自研的核心算法&#…

2026/10/11 13:08:48 阅读更多 →
MFC下载器开发实战:WinInet、进度条与自绘界面

MFC下载器开发实战:WinInet、进度条与自绘界面

简介:这是一份MFC单文档/对话框框架下的文件下载工程源码包,面向Win32桌面应用初学者与需要实现HTTP下载、进度反馈和自定义界面的C开发者。包内包含完整的工程文件、界面位图资源、说明文档及编译生成文件,涵盖CInternetSession/CHttpFile的…

2026/10/11 13:08:48 阅读更多 →
VS2019 MFC双人五子棋实战:编译环境配置与核心代码解析

VS2019 MFC双人五子棋实战:编译环境配置与核心代码解析

简介:基于MFC框架的双人五子棋完整工程,已配好VS2019编译环境,适合有一定C基础、正在学习Windows界面编程或博弈算法实现的开发者。程序使用纯图形界面,支持黑白双方轮流落子、自动判断胜负、悔棋,以及棋局的保存与打开…

2026/10/11 13:08:48 阅读更多 →
BWO-KELM预测:白鲸优化调参提升KELM泛化能力

BWO-KELM预测:白鲸优化调参提升KELM泛化能力

简介:本资源是一套基于MATLAB实现的智能优化算法与机器学习融合的回归预测方案,面向高校研究生、科研人员及工程技术人员,解决小样本非线性回归建模中模型参数调优难、泛化能力弱等实际问题。压缩包共6个文件(4个核心m脚本、1个加…

2026/10/11 13:08:48 阅读更多 →
商品评论情感分析毕业设计:Python数据清洗到GUI模型部署全流程

商品评论情感分析毕业设计:Python数据清洗到GUI模型部署全流程

简介:一套基于Python的机器学习商品评论情感分析毕业设计完整项目,采用SVM与LSTM算法,并提供GUI可视化界面,适合计算机相关专业学生完成大作业、毕业设计及项目实战练习。项目经导师指导并评审通过,评分98分&#xff0…

2026/10/11 13:08:48 阅读更多 →
ImageJ Windows版从闪退到批量出图:内存设置、宏批处理与插件安装全攻略

ImageJ Windows版从闪退到批量出图:内存设置、宏批处理与插件安装全攻略

简介:这款ImageJ Windows版本采用64位Java 8捆绑,开箱即用,适合生物医学、材料科学等领域研究人员进行图像分析与测量。资源共430个文件,压缩包约47.72MB,以ijm宏、dll动态库、jar插件和java源码为主,同时内…

2026/10/11 13:07:48 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →