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/7/26 21:39:00 阅读更多 →
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/7/26 17:01:49 阅读更多 →
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/7/26 21:39:02 阅读更多 →

最新新闻

Go代码混淆实战:使用Garble保护API密钥与敏感配置

Go代码混淆实战:使用Garble保护API密钥与敏感配置

1. 项目概述:为什么Go开发者需要关注代码混淆?最近在几个Go语言社区里,经常看到有朋友在讨论API密钥泄露的问题。有人把带密钥的代码误提交到了公开仓库,没过多久就收到了云服务商的异常账单提醒;也有人发现自己的后端…

2026/7/27 7:34:27 阅读更多 →
“我现在这样,是不是以后也会一直这样?”

“我现在这样,是不是以后也会一直这样?”

这个问题背后,隐藏的是对未来的恐惧:我现在的状态,会不会变成我的命运?答案是: 不会。 但改变也不会自动发生。第一层:为什么大脑会产生“以后也会这样”的感觉? 因为大脑倾向于根据过去预测未来…

2026/7/27 7:34:27 阅读更多 →
Frida在游戏逆向中的核心应用:动态Hook、反调试对抗与实战技巧

Frida在游戏逆向中的核心应用:动态Hook、反调试对抗与实战技巧

1. 项目概述:为什么游戏逆向绕不开Frida? 如果你在游戏安全、外挂检测或者移动应用安全这个圈子里混过一段时间,肯定会反复听到一个名字: Frida 。它早已不是某个小圈子里的秘密武器,而是成为了动态分析领域的“瑞士…

2026/7/27 7:34:27 阅读更多 →
计算机视觉在水果质量检测中的算法优化与实践

计算机视觉在水果质量检测中的算法优化与实践

1. 水果质量检测的行业痛点与技术背景水果分选是农产品加工中至关重要的环节,直接影响产品附加值和消费者体验。传统人工分选方式存在三大致命缺陷:首先,人工分选效率低下,熟练工人每小时最多处理800-1000个水果,而现代…

2026/7/27 7:34:27 阅读更多 →
AI编程与英语学习的创新融合实践

AI编程与英语学习的创新融合实践

1. 项目概述:当AI编程遇上英语学习去年在GitHub上看到一个中学生用30行Python代码实现的单词记忆程序,让我突然意识到——编程和语言学习的结合点远比我们想象的要多。现在把这个思路升级后做成了一套完整解决方案,核心是用AI技术把枯燥的英语…

2026/7/27 7:34:27 阅读更多 →
Llama 3.1 405B大模型API调用指南与实战

Llama 3.1 405B大模型API调用指南与实战

1. 认识Llama 3.1 405B语言模型Llama 3.1 405B是目前开源领域最强大的语言模型之一,由知名研究机构发布。这个拥有4050亿参数的庞然大物,在多项基准测试中表现接近GPT-4级别,为开发者提供了一个强大的开源替代方案。作为一款前沿的大语言模型…

2026/7/27 7:33:27 阅读更多 →

日新闻

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于SpringBoot的社区智能垃圾管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →
SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

SPI实战指南:从时钟模式到寄存器配置,解决嵌入式通信难题

1. 项目概述:从寄存器手册到实战指南 如果你手头有一份类似德州仪器(TI)TMS320x240xA系列DSP的SPI模块技术手册,看着里面密密麻麻的寄存器位定义、时序图和公式,是不是感觉头大?这份资料虽然权威&#xff0…

2026/7/27 0:00:54 阅读更多 →
【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

【JAVA毕设源码分享】基于springboot的水果购物管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/27 0:00:54 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/27 4:33:59 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/27 6:31:56 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/27 4:01:12 阅读更多 →

月新闻