STM32通用定时器基本定时功能

发布时间:2026/6/8 17:26:13
STM32通用定时器基本定时功能
目录一、概述1.计数模式2.主要功能3.通用定时器的结构4.时钟源5.时基单元二、基本定时功能1.配置时基单元2.配置NVIC3.编写中断函数一、概述定时器实际上就是一个计数器stm32中集成了多个定时/计数器TIM根据型号和功能的不同STM32系列芯片最多包含了8个定时/计数器TIM1、TIM8为高级定时器TIM2、TIM3、TIM4、TIM5为通用定时器TIM6、TIM7为基本定时器。1.计数模式向上模式计数器从0计数到自动加载值ARR并产生向上溢出事件。向下模式计数器从自动加载只ARR向下计数到0并产生向下溢出事件。中央对齐模式计数器从0向上计数到自动加载值ARR后产生向上溢出事件。再从自动加载值ARR向下计数到0产生向下溢出事件。2.主要功能基本定时功能输出比较输入捕获编码器接口模式等等3.通用定时器的结构stm32通用定时器主要包含1个外部触发引脚TMx_ETR4个输入输出通道TMx_CH1~41个触发控制器1个时基控制单元由PSC预分频器自动重装寄存器CNT计数器等组成如图所示4.时钟源定时/计数器时钟可由以下时钟提供内部时钟CK_INT外部时钟模式1TIMx_CH1~4外部时钟模式2TIMx_ETR内部触发输入IR0~3来自其他定时器用来实现定时器之间的级联/同步触发5.时基单元PSC预分频器是将CLK时基的脉冲转换为以PSC数值为一个周期的脉冲波形。如下图所示当PSC预分频器数值为n时PSC每接收到一个上升沿/下降沿/双边沿会自动加1直到PSC的数值为nPSC才会输出一个上升沿/下降沿/双边沿CNT计数器是接收PSC发送的脉冲波形每接收到上升沿/下降沿/双边沿时会自动加1然后CNT会时不时的与ARR自动重装载值相比较。当CNT的数值ARR的数值时会溢出然后硬件会自动设置中断标志位随后进入中断函数。中断函数中必须使用软件复位清空中断标志位二、基本定时功能定时器实际上就是一个计数器。通过计指定的数来达到定时的功能。定时时间的计算脉冲72MHz,首先会进行预分频PSC随后频率变为CLK / ( PSC 1 ),那么CNT加1个数字的时间就是 PSC 1 / CLK 。那么计ARR个数字就是ARR * ( PSC 1 ) / CLK下面是定时器TIM最基础的功能流程配置时基单元配置NVIC编写中断函数1.配置时基单元void Timer_Init(void) { RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE); //开启TIM2总线时钟 TIM_InternalClockConfig(TIM2); //设置为内部时钟 TIM_TimeBaseInitTypeDef Tim2_InitStruction; Tim2_InitStruction.TIM_ClockDivision TIM_CKD_DIV1; //选择分频这里选择的是1分频 Tim2_InitStruction.TIM_CounterMode TIM_CounterMode_Up; //计数器模式这里选择的是向上计数 Tim2_InitStruction.TIM_Period 10000 - 1; //自动重装计数器 Tim2_InitStruction.TIM_Prescaler 7200 - 1; //预分频计数器 Tim2_InitStruction.TIM_RepetitionCounter 0; //高级计数器才有这里直接给0 TIM_TimeBaseInit(TIM2, Tim2_InitStruction); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //只有配置了这一步定时器才可以把中断请求发出去 TIM_Cmd(TIM2, ENABLE); //开启/关闭 定时器TIM2的函数 }详解RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);开启APB1总线中TIM2外设的时钟TIM_InternalClockConfig(TIM2);设置TIM2为内部时钟供应TIM_TimeBaseInit(TIM2, Tim2_InitStruction);此函数是STM32中定时器的基础初始化函数包含两个参数。1. 参数TIMx是指哪一个定时器2. 参数Tim2_InitStruction是一个TIM_TimeBaseInitTypeDef类型的结构体指针。TIM_TimeBaseInitTypeDef如下计数模式如下TIM_ClearFlag(TIM2, TIM_FLAG_Update);手动清除定时器的 “更新中断 / 事件标志位”TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);开启中断更新的使能只有配置了这个定时器才可以把中断发送出去TIM_Cmd(TIM2, ENABLE);开启/关闭 定时器TIM2的函数2.配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //优先级分组 NVIC_InitTypeDef NVIC_InitStruction; NVIC_InitStruction.NVIC_IRQChannel TIM2_IRQn; //设置通道 NVIC_InitStruction.NVIC_IRQChannelCmd ENABLE; //通道使能 NVIC_InitStruction.NVIC_IRQChannelPreemptionPriority 2; //抢占优先级 NVIC_InitStruction.NVIC_IRQChannelSubPriority 1; //响应优先级 NVIC_Init(NVIC_InitStruction); //初始化函数3.编写中断函数void TIM2_IRQHandler(void) { if(TIM_GetITStatus(TIM2, TIM_IT_Update) SET) //检查中断标志位是否被置为SET { num ; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除中断标志位 } }TIM_GetITStatus(TIM2, TIM_IT_Update)检查TIM2的更新中断是否发生如果发生那么置SET。没有置RESETTIM_ClearITPendingBit(TIM2, TIM_IT_Update);清除中断标志位