STM32通用定时器(TIM2-5)基本用法
STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)高级定时。。。

STM32定时器配置(TIM1、TIM2、TIM3、TIM4、TIM5、TIM8)⾼级定时。
⽂章结构:——> ⼀、定时器基本介绍——> ⼆、普通定时器详细介绍TIM2-TIM5——> 三、定时器代码实例⼀、定时器基本介绍之前有⽤过野⽕的学习板上⾯讲解很详细,所以直接上野⽕官⽅的资料吧,作为学习参考笔记发出来⼆、普通定时器详细介绍TIM2-TIM52.1 时钟来源计数器时钟可以由下列时钟源提供:·内部时钟(CK_INT)·外部时钟模式1:外部输⼊脚(TIx)·外部时钟模式2:外部触发输⼊(ETR)·内部触发输⼊(ITRx):使⽤⼀个定时器作为另⼀个定时器的预分频器,如可以配置⼀个定时器Timer1⽽作为另⼀个定时器Timer2的预分频器。
由于今天的学习是最基本的定时功能,所以采⽤内部时钟。
TIM2-TIM5的时钟不是直接来⾃于APB1,⽽是来⾃于输⼊为APB1的⼀个倍频器。
这个倍频器的作⽤是:当APB1的预分频系数为1时,这个倍频器不起作⽤,定时器的时钟频率等于APB1的频率(36MHZ);当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作⽤,定时器的时钟频率等于APB1的频率的2倍。
{假如APB1预分频为2(变成36MHZ),则定时器TIM2-5的时钟倍频器起作⽤,将变成2倍的APB1(2x36MHZ)将为72MHZ给定时器提供时钟脉冲。
⼀般APB1和APB2的RCC时钟配置放在初始化函数中例如下⾯的void RCC_Configuration(void)配置函数所⽰,将APB1进⾏2分频,导致TIM2时钟变为72MHZ输⼊。
如果是1分频则会是36MHZ输⼊,如果4分频:CKINT=72MHZ/4x2=36MHZ; 8分频:CKINT=72MHZ/8x2=18MHZ;16分频:CKINT=72MHZ/16x2=9MHZ}1//系统时钟初始化配置2void RCC_Configuration(void)3 {4//定义错误状态变量5 ErrorStatus HSEStartUpStatus;6//将RCC寄存器重新设置为默认值7 RCC_DeInit();8//打开外部⾼速时钟晶振9 RCC_HSEConfig(RCC_HSE_ON);10//等待外部⾼速时钟晶振⼯作11 HSEStartUpStatus = RCC_WaitForHSEStartUp();12if(HSEStartUpStatus == SUCCESS)13 {14//设置AHB时钟(HCLK)为系统时钟15 RCC_HCLKConfig(RCC_SYSCLK_Div1);16//设置⾼速AHB时钟(APB2)为HCLK时钟17 RCC_PCLK2Config(RCC_HCLK_Div1);18 //设置低速AHB时钟(APB1)为HCLK的2分频(TIM2-TIM5输⼊TIMxCLK频率将为72MHZ/2x2=72MHZ输⼊)19 RCC_PCLK1Config(RCC_HCLK_Div2);20//设置FLASH代码延时21 FLASH_SetLatency(FLASH_Latency_2);22//使能预取指缓存23 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);24//设置PLL时钟,为HSE的9倍频 8MHz * 9 = 72MHz25 RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);26//使能PLL27 RCC_PLLCmd(ENABLE);28//等待PLL准备就绪29while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);30//设置PLL为系统时钟源31 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);32//判断PLL是否是系统时钟33while(RCC_GetSYSCLKSource() != 0x08);34 }35//允许TIM2的时钟36 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);37//允许GPIO的时钟38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);39 }APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。
STM32通用定时器原理及应用

一、通用定时器原理STM32系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM 互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。
其它6个为普通定时器,时钟由APB1的输出产生。
下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图:实际上STM32的CPU文档给出的图与这个图略有区别。
但是我们还是想研究这个图。
原因是这个图对我们思路的理解比较有帮助。
从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝色部分。
下面以通用定时器2的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。
可能有同学还是有点不理解,OK,我们举一个例子说明。
假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。
有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。
再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。
如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz 的时钟频率。
能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。
stm32 timer 用法

stm32 timer 用法摘要:1.引言2.STM32定时器简介3.STM32定时器工作原理4.STM32定时器配置与使用5.STM32定时器应用实例6.总结正文:1.引言STM32是一款广泛应用于嵌入式系统的微控制器,拥有丰富的外设资源。
其中,定时器(Timer)是STM32外设中非常关键的部分,它在系统时钟、输入捕捉、输出比较、PWM等功能中起着举足轻重的作用。
本文将详细介绍STM32定时器的用法。
2.STM32定时器简介STM32定时器主要包括基本定时器(Basic Timer)、高级定时器(Advanced Timer)和看门狗定时器(Watchdog Timer)。
其中,基本定时器主要用于系统时钟的生成和控制;高级定时器具有更多的功能,如输入捕捉、输出比较、PWM等;看门狗定时器用于检测系统的运行状态,防止系统崩溃。
3.STM32定时器工作原理STM32定时器的工作原理主要基于计数器、预分频器和比较器。
计数器用于记录定时器滴答(Tick)的数量;预分频器用于控制定时器滴答频率;比较器用于产生定时器溢出信号。
当定时器溢出时,定时器硬件会自动产生中断,通过编程可以设置相应的中断处理程序,实现特定功能。
4.STM32定时器配置与使用配置STM32定时器主要包括以下步骤:(1)使能定时器:通过设置相应寄存器位,使能定时器;(2)配置定时器工作模式:根据需求选择定时器工作模式,如计数模式、PWM模式等;(3)配置定时器时钟源:选择定时器时钟源,如内部时钟、外部时钟等;(4)配置定时器预分频器:设置定时器预分频器值,以满足定时器滴答频率要求;(5)配置比较器:设置比较器值,以产生定时器溢出信号;(6)配置中断:根据需求配置定时器中断,如使能中断、设置优先级等。
5.STM32定时器应用实例以下是一个简单的STM32定时器应用实例:使用STM32F103C8T6微控制器实现一个LED闪烁的程序。
(1)配置定时器:使能定时器TIM2,设置工作模式为计数模式,时钟源为内部时钟,预分频器值为72000,比较器值为65536。
stm32定时器

STM32定时器定时器功能简介区别于SysTick一般只用于系统时钟的计时,STM32的定时器外设功能非常强大。
STM32一共有8个都为16位的定时器。
其中TIM6、TIM7是基本定时器;TIM 2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器。
这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,都是专门为工控领域量身定做的。
定时器工作分析基本定时器基本定时器TIM6和TIM7只具备最基本的定时功能,就是累加的时钟脉冲数超过预定值时,能触发中断或触发DMA请求。
这两个基本定时器使用的时钟源都是TIMxCLK,时钟源经过PSC预分频器输入至脉冲计数器TIMx_CNT,基本定时器只能工作在向上计数模式,在重载寄存器TIMx_ARR中保存的是定时器的溢出值。
工作时,脉冲计数器TIMx_CNT由时钟触发进行计数,当TIMx_CNT的计数值X等于重载寄存器TIMx_ARR中保存的数值N时,产生溢出事件,可触发中断或DMA请求。
然后TIMx_CNT的值重新被置为0,重新向上计数。
通用定时器相比之下,通用定时器TIM2~TIM5就比基本定时器复杂得多了。
除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出PWM脉冲的场合,还具有编码器的接口。
通用定时器的基本计时功能与基本定时器的工作方式是一样的,同样把时钟源经过预分频器输出到脉冲计数器TIMx_CNT累加,溢出时就产生中断或DMA请求。
而通用定时器比基本定时器多出的强大功能,就是因为通用定时器多出了一种寄存器----捕获/比较寄存器TIMx_CRR(capture/compareregister)它在输入时被用于捕获(存储)输入脉冲在电平发生翻转时脉冲计数器TI Mx_CNT的当前计数值,从而实现脉冲的频率测量;在输出时被用来存储一个脉冲数值,把这个数值用于与脉冲计数器TIMx_CNT的当前计数值进行比较,根据比较结果进行不同的电平输出定时器的时钟源从时钟源方面来说,通用定时器比基本定时器多了一个选择,它可以使用外部脉冲作为定时器的时钟源。
第六章 STM32 定时器的使用 《基于ARM的单片机应用及实践--STM32案例式教学》课件

第六章 STM32 定时器的使用
AHB预分频 /1,2,…,512
APB1预分频 /1,2,4,8,16
最大36MHz
PCLK1 至APB1外设
20个外设时钟使能位
TIM2,3,4,5,6,7 如果APB1预分频=1, 则乘1输出,否则乘2输出
6个外设时钟使能位
TIMXCLK 至TIM2~7
APB2预分频 /1,2,4,8,16
第六章 STM32 定时器的使用
PWM模式 脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器 确定频率、由TIMx_CCRx寄存器确定占空比的信号。 在TIMx_CCMRx寄存器中的OCxM位写入‘110’(PWM 模式1)或‘111’(PWM模式2),能够独立地设置每个 OCx输出通道产生一路PWM。必须设置TIMx_CCMRx 寄存器OCxPE位以使能相应的预装载寄存器, 最后要设置TIMx_CR1寄存器的ARPE位,(在向上计数 或中心对称模式中)使能自动重装载的预装载寄存器。
这个倍频器的作用:当APB1的预分频系数为1时,倍 频器不起作用,定时器的时钟频率等于APB1的频率; 当APB1的预分频系数为其它数值(即预分频系数为2、4 、8或16)时,这个倍频器起作用,定时器的时钟频率 等于APB1的频率两倍。
第六章 STM32 定时器的使用 下面举一个例子说明。假定AHB=36MHz,因为APB1 允许的最大频率为36MHz,所以APB1的预分频系数可 以取任意数值;当预分频系数=1时,APB1=36MHz, TIM2~7的时钟频率=36MHz(倍频器不起作用);
第六章 STM32 定时器的使用
3)设置TIM3_DIER允许更新中断 因为我们要使用TIM3的更新中断,所以设置DIER 的UIE位,并使能触发中断。
STM32设置定时器TIM2

STM32如何设置定时器STM32如何设置定时器下面以stm32的TIM2作为实例一步步配置成为定时器:第一种对定时器的基本配置TIM_TimeBaseStructure.TIM_Period = 1000;//设置自动装载寄存器TIM_TimeBaseStructure.TIM_Prescaler = 35999; //分频计数TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//选择向上计数TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_Cmd(TIM2, ENABLE); //是能定时器始能定时器的中断:TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);在开启时钟里一定要打开TIM2的时钟,函数表达式如下:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);4:中断向量函数的编写:void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitStructure;#ifdef VECT_TAB_RAM //如果程序在ram中调试那么定义中断向量表在Ram 中否则在Flash中NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);#else /* VECT_TAB_FLASH *//* Set the Vector Table base location at 0x08000000 */NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);#endif/* Enable the TIM2 global Interrupt */NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}5:中断函数的编写:当有TIM2的无论哪个中断触发中断发生那么就会进入这个函数TIM2_IRQHandler(void)所以这个更新事件的中断判断要依靠以下语句:if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)按照以上步骤配置可以顺利进行定时器的基本定时应用第二种方法:/* Enable TIM2 Update interrupt [TIM2溢出中断允许]*/ TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);中断中的设置为:if (TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)。
STM32CubeMX定时器的操作

void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim) {
这样算就很好。
为了加深印象,我们另外再选择一组参数来实现同样的效果。预分频器指定为 24000,而计数器指定为 2000,定时器完成一轮计数所花的时间也是 1 秒。
下面的图显示了如何配置参数
为什么要减 1 呢,0 到 999 不恰好就是 1000 个数么? 如果要产生中断的话,还要设置 NVIC,如下图
功能代码
好了,生成工程文件后,我们要加入让 TIM2 工作的代码了,毕竟 STM32CubeMX 只是一个初始化器。
在 main.c 里面添加如下代码:
/* USER CODE BEGIN 2 */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET); HAL_TIM_Base_Start_IT(&htim2);
{ if(__HAL_TIM_GET_ITSTATUS(htim, TIM_IT_CC4) !=RESET) { __HAL_TIM_CLEAR_IT(htim, TIM_IT_CC4); htim->Channel = HAL_TIM_ACTIVE_CHANNEL_4; /* Input capture event */ if((htim->Instance->CCMR2 & TIM_CCMR2_CC4S) != 0x00) { HAL_TIM_IC_CaptureCallback(htim); } /* Output compare event */ else { HAL_TIM_OC_DelayElapsedCallback(htim); HAL_TIM_PWM_PulseFinishedCallback(htim); } htim->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED; }
STM32定时器定时时间配置总结

STM32定时器定时时间配置总结STM32系列微控制器内置了多个定时器模块,它们可以用于各种定时功能,如延时、周期性触发、脉冲计数等。
在使用STM32定时器之前,我们需要进行定时时间配置,本文将总结一下STM32定时器定时时间配置的相关知识,包括定时器工作模式、定时器时钟源选择、定时器时钟分频、定时器计数器重载值以及定时器中断配置等内容。
首先,我们需要选择定时器的工作模式。
STM32定时器支持多种工作模式,包括基本定时器模式、高级定时器模式、输入捕获模式和输出比较模式等。
基本定时器模式适用于简单的定时和延时操作,输入捕获模式适用于捕获外部事件的时间参数,输出比较模式适用于产生精确的PWM波形。
根据具体的应用需求,选择合适的工作模式。
其次,我们需要选择定时器的时钟源。
STM32定时器的时钟源可以选择内部时钟源(如系统时钟、HCLK等)或外部时钟源(如外部晶体)。
内部时钟源的稳定性较差,适用于简单的定时操作,而外部时钟源的稳定性较好,适用于要求较高的定时操作。
然后,我们需要选择定时器的时钟分频系数。
定时器的时钟分频系数决定了定时器的时钟频率,从而影响了定时器的计数速度。
我们可以通过改变时钟分频系数来调整定时器的计数速度,从而实现不同的定时时间。
时钟分频系数的选择需要考虑定时器的最大计数周期和所需的定时精度。
接着,我们需要配置定时器的计数器重载值。
定时器的计数器从0开始计数,当计数器达到重载值时,定时器将重新开始计数。
通过改变计数器重载值,可以实现不同的定时时间。
计数器重载值的选择需要考虑定时器的时钟频率和所需的定时时间。
最后,我们需要配置定时器的中断。
定时器中断可以在定时器计数达到重载值时触发,用于通知CPU定时器已经计数完成。
在定时器中断中,我们可以执行相应的中断服务程序,比如改变一些IO口的状态,实现定时操作。
通过配置定时器的中断使能和中断优先级,可以实现不同的中断操作。
需要注意的是,不同型号的STM32微控制器的定时器模块可能略有不同,具体的配置方法和寄存器设置也可能不同,请参考相应的数据手册和参考手册进行具体操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
if(TIM_GetITStatus(TIM3 , TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update); if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_8)) GPIO_ResetBits(GPIOA, GPIO_Pin_8); else GPIO_SetBits(GPIOA, GPIO_Pin_8); } } //注意使能定时器时钟
void TIMER3_Init() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); TIM_TimeBaseStructure.TIM_Period=10000;//ARR 的值 TIM_TimeBaseStructure.TIM_Prescaler=7200-1; TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_Cmd(TIM3, ENABLE); //开启时钟 }
void GPIO_PA_Init() {//PA8 管脚配置 GPIO_InitTypeDef GPIO_InitStructure; GPIO_DeInit(GPIOA); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP ;//推挽输出 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);//使能端口时钟 A GPIO_Init(GPIOA, &GPIO_InitStructure); }
void NVIC_Configuration() { NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); // 抢占式优先级别 NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel;//指定中断源 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 指定响应优先级别 1 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
int main(void) { Stm32_Clock_Init(9); //系统时钟设置 delay_init(72); //延时初始化 GPIO_PA_Init(); TIMER3_Init(); NVIC_Configuration(); while(1); }
void TIM3_er() {
STM32 通用定时器(TIM2-5)基本用法
STM32 的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基 本的定时,还可以做 PWM 输出或者输入捕获功能。从系统框架图下看,名为 TIMx 的有八 个,其中 TIM1 和 TIM8 挂在 APB2 总线上,而 TIM2-TIM7 则挂在 APB1 总线上。其中 TIM1&TIM8 称为高级控制定时器(advanced control timer).他们所在的 APB2 总线也比 APB1 总线要好。APB2 可以工作在 72MHz 下,而 APB1 最大是 36MHz。