STM32 小白实战 05:PWM 输入模式测频率与占空比,彻底理清 CCR1、CCR2 和复位模式
摘要今天完成了 TIM2 输出 PWM、TIM3 输入捕获测量频率与占空比这一整套实验链路的梳理。重点不是死记库函数而是理解TIM2 负责产生 PWMTIM3 通过 PWM 输入模式同时记录完整周期和高电平时间。同时排查了函数声明、函数定义和调用名称不一致造成的隐式声明与 Undefined symbol 链接错误。当前代码逻辑已整理最终 OLED 实测频率和占空比结果标记为“待确认”。开发环境项目配置MCUSTM32F103C8T6IDEKeil μVision 5编译器ARMCC V5.06 update 7固件库STM32F10x 标准外设库PWM输出TIM2_CH1 / PA0输入捕获TIM3_CH1 / PA6实验接线PA0 接 PA6显示OLED一、实验整体链路TIM2 从 PA0 输出 PWM↓ PA0 接 PA6TIM3 从 PA6 测量 PWM↓CCR1 记录完整周期CCR2 记录高电平时间↓计算频率和占空比并显示到 OLEDTIM2 是“信号发生器”TIM3 是“测量仪”。二、PWM 输出参数怎么得到 100 Hz、80% 占空比现象主程序使用 PWM_SetPrescaler(7200-1) 和 PWM_SetCompare(80)PWM 初始化中的 ARR 为 100-1需要确认最终输出参数。原因TIM2 时钟按 72 MHz 计算经过 7200 分频后为 10 kHzARR1 为 100因此输出频率为 100 Hz。CCR 为 80因此占空比为 80%。72 MHz ÷ 7200 10 kHz10 kHz ÷ 100 100 Hz80 ÷ 100 80%周期 10 ms高电平时间 8 ms图1 PWM频率、占空比与PSC/ARR/CCR的关系解决方法保持 PSC 控制计数速度、ARR 控制周期、CCR 控制高电平时间。当前参数保持 ARR99、PSC7199、CCR80。验证结果根据参数计算理论输出为 100 Hz、80% 占空比。实际测量结果待确认。三、调用 PWM 函数时出现隐式声明和 Undefined symbol现象Keil 提示 PWM_SetPrescaler declared implicitly并在链接阶段提示 Undefined symbol PWM_SetCompare。原因PWM.h、PWM.c 和 main.c 中的接口名称没有统一例如 PWM_SetCompare 与 PWM_SetCompare1、PWM_SetPrescaler 与 PWM_Prescaler。解决方法声明、定义、调用统一使用 PWM_SetCompare() 和 PWM_SetPrescaler()。修改头文件后执行 Rebuild all target files。void PWM_SetCompare(uint16_t Compare){TIM_SetCompare1(TIM2, Compare);}void PWM_SetPrescaler(uint16_t Prescaler){TIM_PrescalerConfig(TIM2, Prescaler,TIM_PSCReloadMode_Immediate);}验证结果错误原因已确认。最终重新编译结果待确认。四、TIM3 输入捕获却误初始化了 TIM2现象输入捕获模块开启的是 TIM3但时基初始化曾写为 TIM_TimeBaseInit(TIM2, ...)。原因复制定时器代码后外设实例没有全部替换。这样 TIM2 被再次修改TIM3 没有获得预期的 PSC 和 ARR。解决方法改为 TIM_TimeBaseInit(TIM3, TIM_TimeBaseInitStructure)并逐项检查 IC.c 中所有定时器参数是否均为 TIM3。验证结果代码中的时基对象已修正为 TIM3。实际测频结果待确认。五、输入捕获模块里不需要配置 PWM 输出比较现象IC.c 中同时配置 TIM_OC1Init() 和 TIM_PWMIConfig()。原因TIM_OC1Init() 用于输出比较而 TIM3 在本实验中只负责输入捕获。解决方法删除 TIM_OCInitTypeDef 和整段 TIM_OC1Init() 输出配置PWM 输入模式只保留 TIM_PWMIConfig()。验证结果输入捕获模块职责已整理为“只测量、不输出”。最终运行结果待确认。六、CCR1 和 CCR2 到底记录什么现象PWM 输入模式同时使用 CCR1 和 CCR2容易混淆两者的含义。原因TI1 上升沿作为复位触发源。CH1 直接捕获相邻上升沿之间的完整周期CH2 间接捕获上升沿到下降沿之间的高电平时间。上升沿CNT 清零并开始计时下降沿CCR2 保存高电平时间下一个上升沿CCR1 保存完整周期CNT 再次清零100 Hz、80% 理论值CCR1 ≈ 10000CCR2 ≈ 8000解决方法记住“频率看 CCR1占空比看 CCR2/CCR1”。验证结果CCR1 和 CCR2 的物理含义已经明确。实际捕获值待确认。七、频率和占空比公式现象需要把 TIM3 捕获值换算为可显示的频率和占空比。原因TIM3 按 72 MHz 时钟和 PSC71 配置后计数频率为 1 MHz每个计数约为 1 μs。频率 1000000 ÷ (CCR1 1)占空比 (CCR2 1) × 100 ÷ (CCR1 1)解决方法读取 CCR1、CCR2 后进行计算并对 Period0 做保护避免没有有效输入时产生异常结果。uint32_t IC_GetFreq(void){uint16_t Period TIM_GetCapture1(TIM3);if (Period 0) return 0;return 1000000 / (Period 1);}uint32_t IC_GetDuty(void){uint16_t Period TIM_GetCapture1(TIM3);uint16_t HighTime TIM_GetCapture2(TIM3);if (Period 0) return 0;return (HighTime 1) * 100 / (Period 1);}验证结果理论输入为 100 Hz、80% 时OLED 应接近显示 Freq:00100Hz、Duty:80%。实际显示待确认。八、固定排查清单出现 declared implicitly先检查头文件中的函数声明。出现 Undefined symbol检查源文件中是否存在完全同名的函数定义。声明、定义、调用三处的函数名和参数必须完全一致。配置 TIM3 时检查所有库函数的第一个参数是否误写为 TIM2。输入捕获模块不要混入 TIM_OCxInit() 输出比较配置。使用 TIM_PWMIConfig() 后明确 CCR1 记录周期、CCR2 记录高电平时间。检查 PA0 是否真正连接 PA6。确认输出为 TIM2_CH1输入为 TIM3_CH1。计算频率前确认 TIM3 实际计数频率。没有输入信号时对捕获值为 0 的情况做保护。修改头文件或接口后执行 Rebuild all target files。编译通过后仍要用 OLED 或示波器验证实际结果。

相关新闻

揭秘升讯威微信营销系统架构:核心组件与代码实现原理详解

揭秘升讯威微信营销系统架构:核心组件与代码实现原理详解

揭秘升讯威微信营销系统架构:核心组件与代码实现原理详解 【免费下载链接】Sheng.WeixinConstruction 升讯威微信营销系统(第三方微信平台)完整源代码。包括了面向线下商家的诸多营销功能。【吸粉】 投票、定期抽奖、聚人气抽奖、摇一摇抽奖、…

2026/10/7 3:18:43 阅读更多 →
GPT-5.6百万token低至2.4元!还有免费大模型无限制调用!

GPT-5.6百万token低至2.4元!还有免费大模型无限制调用!

2026/7/13通知:新增kiro反代Claude渠道、GPT 5.6 Sol 优惠价格官网1/15左右,无掺水。支持最强fable5模型! 可免费 使用 基于Agnes2.0 模型的高性能femto中转模型,以及qwen系列模型网站base URL(官网地址)&a…

2026/10/7 3:18:40 阅读更多 →
systemd-docker 安全指南:容器隔离、权限管理与安全最佳实践

systemd-docker 安全指南:容器隔离、权限管理与安全最佳实践

systemd-docker 安全指南:容器隔离、权限管理与安全最佳实践 【免费下载链接】systemd-docker Wrapper for "docker run" to handle systemd quirks 项目地址: https://gitcode.com/gh_mirrors/sy/systemd-docker 在容器化部署日益普及的今天&…

2026/10/9 6:29:44 阅读更多 →

最新新闻

二叉树进阶攻略:递归、迭代、层序与经典题型全解析

二叉树进阶攻略:递归、迭代、层序与经典题型全解析

算法训练营第十四天:二叉树(2) 到了第十三天,我们基本上把二叉树的"骨架"摸清了:节点结构、树的定义、递归遍历的套路。那十四天干嘛?两个字:深化。二叉树(2)…

2026/10/12 14:48:18 阅读更多 →
卫星通信入网三关:物理连通、协议接入与业务可用性验证

卫星通信入网三关:物理连通、协议接入与业务可用性验证

简介:本资源是一份面向通信工程专业学生、卫星地面站建设工程师及网络测试技术人员的实务型教学课件,系统讲解卫星通信网络从建站、入网验证到系统测试的全流程规范与关键技术。内容覆盖新地球站入网申请审批(国内经原邮电部电信总局、国际由…

2026/10/12 14:48:18 阅读更多 →
Agent记忆系统实战:上下文窗口限制与MCP统一工具记忆

Agent记忆系统实战:上下文窗口限制与MCP统一工具记忆

1. 先理解Agent为什么“记不住”:上下文窗口的边界与失真1.1 上下文窗口是工作台,不是仓库我最早做Agent原型时犯过一个很天真的错误:以为模型能记住对话里出现过的所有信息。后来被现实狠狠教育了一课——上下文窗口更像一张有限大小的办公桌…

2026/10/12 14:48:18 阅读更多 →
Keras复现YOLOv1:从零训练自己的数据集实战指南

Keras复现YOLOv1:从零训练自己的数据集实战指南

简介:这份资源面向希望上手目标检测的深度学习研究者与开发者,围绕Keras版YOLOv1算法,提供训练自有数据集的完整配套材料。YOLOv1将检测视为回归问题,速度优势明显,而Keras高层API降低了实现门槛,二者结合便…

2026/10/12 14:48:18 阅读更多 →
MATLAB读取RINEX观测文件:从解析到定位解算的完整指南

MATLAB读取RINEX观测文件:从解析到定位解算的完整指南

简介:这份资源面向从事GNSS数据处理、测绘与导航定位方向的科研人员和工程技术人员,提供了一套用MATLAB读取RINEX格式GPS观测文件的程序,并附带测试数据用于验证解析结果。RINEX作为接收机独立交换格式,广泛用于GPS、GLONASS、Gal…

2026/10/12 14:48:18 阅读更多 →
WorkBuddy低代码工作流实战:从单点任务到业务闭环

WorkBuddy低代码工作流实战:从单点任务到业务闭环

1. 这不是一场普通征稿:WorkBuddy 应用指南征集背后的“真实战场”你点开这个标题,第一反应可能是——又一个企业发的软广?领积分、换周边?听起来像行政部发的季度团建通知。但如果你真这么想,就错过了一个正在 quietl…

2026/10/12 14:47:16 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →