STM32-TIM 02

发布时间:2026/10/10 0:49:33

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/10/6 5:00:12

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

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

2026/10/10 3:24:21

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

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

2026/10/6 5:14:37

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

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

2026/10/10 7:15:20

Codex CLI接入OpenAI兼容接口:config.toml配置与排错

如果你手头有 Codex CLI,又不想只接固定的云上模型,今天这篇文章值得你花五分钟看完。我会把config.toml逐行拆开讲,覆盖接入 OpenAI 兼容接口时的常见报错和排查思路,也算是我这半年反复折腾下来的一份笔记。文章面向两类人&…

2026/10/10 7:15:20

Cursor高效配置四步法:用规则驱动代码减量

1. 项目概述:这不是在教你怎么点开设置,而是在重建你和代码的协作关系“Cursor怎么配置才好用?这套规则让我少写一半代码”——这句话我第一次看到时,手停在键盘上三秒。不是因为夸张,而是太真实。过去两年&#xff0c…

2026/10/10 7:15:20

Claude作为创业决策协作者的实战闭环构建

1. 项目概述:这不是“AI创业课”,而是一份面向真实创业者的协作增强方案“Claude 创业计划扩展至更多创始人”——这个标题乍看像一则新闻通稿,但作为连续三年深度参与多个早期技术型创业项目孵化的从业者,我第一反应是&#xff1…

2026/10/10 7:15:20

用PINN做多变量回归预测:Matlab实现与调参全攻略

用PINN做多变量回归预测,还是多输入单输出,Matlab代码该怎么落地?这个问题我刚接触的时候绕了不少弯路。物理信息神经网络(PINN)这两年讨论度很高,核心其实一句话:让神经网络的预测结果不仅拟合…

2026/10/10 7:15:20

HED边缘检测实战:从VGG16到多任务学习的深度学习流水线

简介:HED_edgeDetect 是一份面向计算机视觉初学者与深度学习实践者的边缘检测资源包,围绕 HED(Hypercolumns for Edge Detection)这一基于卷积神经网络的端到端边缘检测方法展开,可用于理解多尺度特征融合、预训练与微…

2026/10/10 7:10:19

Python+Pillow制作艺术签名生成器:字体渲染与透明PNG实战

我一直在用 Python 做一些小工具,最近琢磨着一个挺有意思的需求——给自己设计一个优雅的艺术签名。平时签文件、写卡片、做水印,总觉得自己手写签名不够好看,或者干脆没有手写习惯,一笔一画下去自己都嫌弃。于是我用 Pillow 做了…

2026/10/8 10:03:18

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/9 20:15:56

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/8 6:05:44

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* 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 0:04:53

从逻辑门到计算机:数字电路核心原理与全加器搭建实战

如果你拆过一台旧电脑的主板,盯着那些黑乎乎的小芯片看上一会儿,可能会冒出同一个疑问:这堆引脚密集的元件,到底是怎么“变”出那么复杂的应用的?答案并不在某个神秘的部件里,而是在所有芯片内部都在反复使…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑