发布时间:2026/8/21 7:13:46
STM32-TIM 02 定时器简介TIM定义对输入的时钟进行计数并在计数值达到设定值时触发中断TIM:时基单元16位计数器预分频器自动重装寄存器分类高级定时器 通用定时器 基本定时器计数模式 向上计数模式cnt arr溢出 向下计数 cnt arr - 0 溢出 中央对齐模式cnt arrcnt arr - 0注意中央对齐模式先向上计数再向下计数定时器溢出效应 更新中断 更新事件 影子寄存器更新将预装载寄存器的值立即更新到影子寄存器中包括ARR、PSC和比较值CCR 中心对齐模式计数器计数方向改变注意影子寄存器是实际起作用的寄存器预装载寄存器供读写定时器时钟源选择 内部时钟源系统时钟 外部时钟模式1 外部时钟模式2TIM2_ETR引脚注意stm32f103c8t6的TIM2_ETR引脚位PA0各时钟频率 基准计数时钟频率(内外时钟源) 计数器计数时钟频率(基准计数时钟分频后) 计数器溢出频率基准计数时钟/分频系数1/重装载值1定时器函数时基单元初始化函数函数使用 函数TIM_TimeBaseInit 入参定时器 结构体指针 返回值无注意 为了寄存器重载函数内部会让定时器产生一个更新事件同时伴随更新中断这样板子一上电定时器就会进入一次中断 措施调用TIM_ClearFlag(TIM2, TIM_IT_Flag);TIM_TimeBaseInitTypedef结构体成员 TIM_ClockDivision 配置滤波器时钟,对时基单元无影响 TIM_CKD_DIV1 / TIM_CKD_DIV2 / TIM_CKD_DIV4 TIM_CounterMode 计数器模式TIM_CounterMode_Up / TIM_CounterMode_Down TIM_Period ARR数值 TIM_Prescaler 预分频系数 TIM_RepetitionCounter 高级定时器控制更新中断的发生频率时基单元初始化函数调用示例TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_TimeBaseInitStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_Period 10000 - 1; TIM_TimeBaseInitStructure.TIM_Prescaler 7200 - 1; TIM_TimeBaseInitStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM2, TIM_TimeBaseInitStructure);定时器配置外部时钟模式2函数函数使用 函数TIM_ETRClockMode2Config 入参定时器 外部时钟分频 外部触发极性 外部触发滤波器 返回值无入参解析 外部时钟分频 TIM_ExtTRGPSC_OFF / TIM_ExtTRGPSC_DIV2 / TIM_ExtTRGPSC_DIV4 / TIM_ExtTRGPSC_DIV8 外部触发极性 TIM_ExtTRGPolarity_Inverted 上升沿触发 / TIM_ExtTRGPolarity_NonInverted 下降沿触发 外部触发滤波器外部触发滤波器函数调用示例TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x0F);定时器中断使能函数函数使用 函数TIM_ITConfig 入参定时器 待使能的中断标志位 ENABLE/DISABLE 返回值无定时器中断使能函数调用示例TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);定时器使能函数函数使用 函数TIM_Cmd 入参定时器 ENABLE/DISABLE 返回值无定时器使能函数调用示例TIM_Cmd(TIM2, ENABLE);定时器查询CNT函数函数使用 函数TIM_GetCounter 入参定时器 返回值CNT值定时器使能函数调用示例uint16_t cnt TIM_GetCounter(TIM2);定时器标志位TIM_GetITStatus函数 TIM_IT_Update定时器产生更新中断定时器中断服务函数EXTI中断服务函数示例 void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update)) { //中断处理事件 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }定时器输出比较简介OC前置英文 OC:输出比较 IC:输入捕获 CCR:捕获/比较寄存器, OC:比较寄存器 IC:捕获寄存器OC定义通过比较CNT与CCR寄存器值的关系对输出电平进行置1置0操作用于输出一定占空比的PWM波OC模式PWM模式1PWM波 定义 配置不同占空比的PWM波等效模拟参量参数计算 周期定时器中断周期 占空比OC值 / ARR值 分辨率1 / ARR 1高级定时器PWM波 需调用PWM波输出使能函数TIM_CtrlPWMOutputs(TIM1, ENABLE);定时器输出比较函数OC初始化函数函数使用 函数:TIM_OC1Init 入参定时器 结构体指针 返回值返回值注意OC1借用TIM2_CH1输出TIM_OCInitTypedef结构体成员变量 TIM_OCMode PWM1模式 TIM_OCMode_PWM1 TIM_OCPolarity 输出极性 TIM_OCPolarity_High / TIM_OCPolarity_Low 输出高低电平取反 TIM_OutputState 输出使能 TIM_OutputState_Enable / TIM_OutputState_Disable TIM_Pulse OC值函数调用示例TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCStructInit(TIM_OCInitStructure); TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; TIM_OC2Init(TIM2, TIM_OCInitStructure);输出比较模式修改OC值函数函数使用 函数TIM_SetCompare1 入参定时器 OC值 返回值无函数调用示例TIM_SetCompare1(TIM2, 33);定时器输入捕获简介IC前置测量频率的方法 测频法时基1s内的数波形有多少个上升沿波形数就是频率 测周发波形俩个上升沿按一定频率fc数N次fc/N就是频率IC定义通道输入引脚出现指定电平跳变时当前CNT的值将被锁存到CCR中IC通道 定时器输出比较与输入捕获共用4个通道OC1 OC2 OC3 OC4 IC1 IC2 IC3 IC4,同一通道输出比较与输入捕获不可同时进行输入捕获模式测频率 TIM2_CH1通道输入的PWM波给单片机的输入滤波器和边沿检测器得到TI1FP1信号再经过分频器进行分频每来一个触发信号CNT值锁存到CCR1中后清零根据CNT的驱动时钟频率fc得频率fc/CNT注意若fc频率过低可能导致CNT溢出输入捕获模式测PWM波频率占空比PWMI模式 TIM2_CH1通道输入的PWM波经过单片机的输入滤波器和边沿检测器得到TI1FP1与TI2FP2俩路信号 IC1配置为上升沿触发直连捕获TI1FP1上升沿IC2配置为下降沿触发交叉捕获TI1FP1下升沿 再经过分频器进行分频TI1FP1来一个上升沿CNT值锁存到CCR1中后清零TI2FP2来一个下降沿CNT锁存到CCR2中 根据CNT的驱动时钟频率fc得频率fc/CCR1 得占空比CCR2/CCR1注意TI1FP1与TI2FP2相同的信号只不过被不同的通道捕获 CCR1就是一个周期的计数值CCR2就是高电平的计数值定时器输入捕获函数输入捕获初始化函数函数使用 函数TIM_ICInit 入参定时器 结构体指针 返回值无TIM_ICInitTypedef结构体成员变量 TIM_Channel 选择IC通道 TIM_Channel_1 / TIM_Channel_2 / TIM_Channel_3 / TIM_Channel_4 TIM_ICFilter 触发锁存边沿 TIM_ICPolarity_Rising / TIM_ICPolarity_Falling / TIM_ICPolarity_BothEdgeTIM_ICPrescaler 捕获预分频选择不分频每次信号都触发捕获TIM_ICPSC_DIV1 / TIM_ICPSC_DIV2 / TIM_ICPSC_DIV4 / TIM_ICPSC_DIV8TIM_ICSelection 输入信号交叉与否 TIM_ICSelection_DirectTI 只测频率 / TIM_ICSelection_IndirectTI 测频率与占空比函数调用示例TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICFilter 0xF; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; TIM_ICInit(TIM3, TIM_ICInitStructure);PWMI模式配置函数函数使用 函数TIM_PWMIConfig 入参定时器 结构体指针 返回值无注意仅支持通道1与通道2的配合使用函数调用示例TIM_ICInitTypeDef TIM_ICInitStructure; TIM_ICInitStructure.TIM_Channel TIM_Channel_1; TIM_ICInitStructure.TIM_ICFilter 0xF; TIM_ICInitStructure.TIM_ICPolarity TIM_ICPolarity_Rising; TIM_ICInitStructure.TIM_ICPrescaler TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICSelection TIM_ICSelection_DirectTI; TIM_PWMIConfig(TIM3, TIM_ICInitStructure);注意TIM_PWMIConfig()内部会调用一次IC_init在配置通道1为上升沿触发、直连的同时会将通道2自动配置为下降沿触发并将其输入选择为“间接”从通道1获取信号以实现对同一PWM信号周期和脉宽的测量。输入触发源选择函数函数使用 函数TIM_SelectInputTrigger 入参定时器 输入触发源 返回值无函数调用示例TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);从模式选择函数函数使用 函数TIM_SelectSlaveMode 入参定时器 从模式 返回值无函数调用示例TIM_SelectInputTrigger(TIM3, TIM_TS_TI1FP1); TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);注意前面TI1FP1配置为上升沿触发这里表示每来一个上升沿作为触发源都会引发从模式把CNT计数值清0CCR寄存器读取函数函数使用 函数TIM_GetCapture1 入参定时器 返回值CCR值函数调用示例uint16_t ccr TIM_GetCapture1(TIM3);定时器输入捕获模块函数void IC_Init(void){ RCC_APB1PeriphClockCmd//开启TIM3的时钟 RCC_APB2PeriphClockCmd//开启GPIOA的时钟 GPIO_Init//将PA6引脚初始化为上拉输入 TIM_TimeBaseInit TIM_PWMIConfig TIM_SelectInputTrigger//触发源选择TI1FP1 TIM_SelectSlaveMode//从模式选择复位 TIM_Cmd }uint32_t IC_GetFreq(void){ return 1000000 / (TIM_GetCapture1(TIM3)); //测周法得到频率fx fc / N }uint32_t IC_GetDuty(void){ return (TIM_GetCapture2(TIM3) 1) * 100 / (TIM_GetCapture1(TIM3) 1); }定时器编码器接口编码器接口前置正交编码器 输出A B俩相波形俩个波形相位相差90度正转波形A相波形上升沿B相低电平A相波形下降沿B相高电平B相波形上升沿A相高电平B相波形下降沿A相低电平 反转波形A相波形上升沿B相高电平B相波形上升沿A相低电平A相波形下降沿B相低电平B相波形下降沿A相高电平编码器接口定义接收正交编码器信号通过定时器输入捕获的通道1与通道2输入到定时器编码器接口正转编码器接口控制CNT自增反转控制自减编码器接口资源 每一个高级定时器与通用定时器都有一个编码器接口工作模式 仅在TI1计数 仅在TI2计数 在TI1与TI2都计数定时器编码器接口函数编码器接口配置函数函数使用 函数TIM_EncoderInterfaceConfig 入参定时器 计数模式 A相波形极性 B相波形极性 返回值无参数解析 计数模式选择单相波形计数还是俩项波形都计数TIM_EncoderMode_TI1 / TIM_EncoderMode_TI2 / TIM_EncoderMode_TI12A相波形极性A相波形不反转 TIM_ICPolarity_Rising / A相波形反转 TIM_ICPolarity_Falling B相波形极性B相波形不反转 TIM_ICPolarity_Rising / B相波形反转 TIM_ICPolarity_Falling函数调用示例TIM_EncoderInterfaceConfig(TIM3, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);定时器编码器接口模块函数int16_t Encoder_Get(void){ int16_t Temp; Temp TIM_GetCounter(TIM3); TIM_SetCounter(TIM3, 0); return Temp; }注意TIM_GetCounter函数返回的是uint16_t类型的数据范围0~65535 赋值给int16_t类型的数据范围-32768~32767TIM_GetCounter返回45678对应temp -19858俩者相减为65536隔一段时间取一次CNT值就代表编码器转速

相关新闻

2026/8/21 7:13:46

大模型API调用实战③-零基础保姆级教程

第 7 章:流式输出 —— 打字机效果的真实现7.1 基本用法:streamTrue只加一个参数,返回值从"响应对象"变成"可迭代的块(chunk)序列":stream client.chat.completions.create(model&quo…

2026/8/21 7:08:46

C++可变参数模板:从语法到实战,掌握现代C++泛型编程核心

1. 从“固定”到“不定”:为什么我们需要可变参数模板?如果你写过一段时间的C,尤其是在C11之前,你肯定遇到过这样的困境:你想写一个函数或者一个类,它能处理任意数量的参数,但类型和数量在编译时…

2026/8/21 7:08:46

虚拟化与容器化实战指南:技术选型

虚拟化与容器化技术实践指南 一、技术选型总体原则所有的应用,能跑Container,绝对不跑Virtual Machine;能跑VM,绝对不跑Physical Machine。这条原则背后是资源利用率与运维效率的考量: 容器:轻量级、启动快…

2026/8/21 10:55:23

AI Agent工程化实践:构建5人协作团队的架构与实现

在实际项目中引入 AI Agent 概念时,很多团队会陷入一个误区:认为只要调用几个大模型 API,写几个提示词,就能让 AI 自动完成复杂任务。结果往往是,项目初期看似进展飞快,但一到集成、测试、上线和迭代环节&a…

2026/8/21 10:55:23

Copula变分贝叶斯:解耦分布与依赖的多元建模新范式

1. 这不是又一个“高斯混合模型”教程:Copula VB到底在解决什么真问题? 你手头有一组二维数据——比如某城市每天的气温和湿度,或者某金融产品的日收益率与波动率,又或者某工厂传感器记录的温度与压力。它们明显不独立&#xff1a…

2026/8/21 10:55:23

AI技术如何提升简历与职位匹配度

1. 简历与职位匹配度分析的痛点每次投递简历都像在玩概率游戏?作为经历过上百次求职的老兵,我深知那种"已读不回"的焦虑。传统求职最大的盲点在于:我们永远不知道HR眼中的简历到底是什么样子。人工筛选简历时,HR平均只用…

2026/8/21 10:55:23

HR大模型智能Agent系统:提升招聘效率300%的实战方案

1. 项目背景与核心价值在人力资源领域,招聘流程往往占据HR团队60%以上的工作时间。传统招聘中,筛选简历、安排面试、沟通反馈等重复性工作消耗大量精力,而候选人体验却难以保证。我们团队通过半年时间研发的HR大模型智能Agent系统&#xff0c…

2026/8/21 10:50:20

TSN交换机时钟竞争测试:从BMCA原理到工程实践

如果你正在开发或测试支持TSN(时敏以太网)的交换机,那么“时钟竞争”这个词很可能已经让你头疼过。在传统的网络测试中,我们关注丢包、延迟、吞吐量,但在TSN世界里,时钟同步的稳定性才是决定整个系统能否正…

2026/8/20 10:17:13

工业通信系统底层逻辑:04 反射——高频能量撞墙之后会发生什么?

第四篇:反射——高频能量撞墙之后会发生什么? —— 你以为信号已经过去了,其实它正在回来打你 老Q的现场笔记 第五季,我们正式进入工业神经系统层。这里不再是单个设备的战斗,而是整个工厂“经脉”层面的秩序之战。从这一篇开始,你将第一次看清:看似简单的信号传播,背…

2026/8/20 20:11:18

工业传感器与变送器详解:序章 从物理世界到工业数据

序章 从物理世界到工业数据 ——重新认识工业传感器与变送器 工业自动化系统正变得日益复杂。今天的工业现场早已不是简单的控制回路,而是由多层技术共同构成的立体体系:PLC、DCS、SCADA、MES、工业互联网、边缘计算与人工智能。控制系统可以执行复杂算法,工业网络可以实现…

2026/8/21 0:03:13

Linux命令-uucico(UUCP传输程序)

Linux命令-uucico(UUCP传输程序) 🔰简介UUCP 体系简介 📖语法⚙️选项配置文件 💡示例示例 1:基本传输操作示例 2:主模式与从模式示例 3:调试与故障排查示例 4:UUCP 配置…

2026/8/21 0:03:13

Linux命令-uupick(UUCP文件接收工具)

Linux命令-uupick(UUCP文件接收工具)🔰简介uupick 在 UUCP 传输链中的位置📖语法⚙️选项交互命令💡示例示例 1:基本接收操作示例 2:仅处理来自特定系统的文件示例 3:完整 UUCP 文件…

2026/8/20 8:35:23

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/20 9:15:29

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/21 0:31:27

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…