STM32定时时间的计算
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的学习笔记中有详细描述。
STM32TIM高级定时器死区时间的计算
STM32TIM⾼级定时器死区时间的计算STM32 TIM⾼级定时器的互补PWM⽀持插⼊死区时间,本⽂将介绍如何计算以及配置正确的死区时间。
⽂章⽬录什么是死区时间?死区时间主要是在逆变电路中,防⽌⼀个桥臂的上下两个开关器件同时导通,那么会导致电路电流上升,从⽽对系统造成损害。
因为开关元器件的t don tdon和t doff tdoff严格意义并不是相同的。
所以在驱动开关元器件门极的时候需要增加⼀段延时,确保另⼀个开关管完全关断之后再去打开这个开关元器件,这⾥的延时就是需要施加的死区时间。
数据⼿册的参数这⾥看了⼀下NXP的IRF540的数据⼿册,门极开关时间如下所⽰;然后找到相关的t don tdon,t dff tdff,t r tr,t f tf的相关典型参数;t don tdon:门极的开通延迟时间t doff tdoff:门极的关断延迟时间t r tr:门极上升时间t f tf:门极下降时间下⾯是⼀个IGBT的数据⼿册;下图是IGBT的开关属性,同样可以找到t don tdon,t dff tdff,t r tr,t f tf等参数,下⾯计算的时候会⽤到;如何计算合理的死区时间?这⾥⽤t dead tdead表⽰死区时间,因为门极上升和下降时间通常⽐延迟时间⼩很多,所以这⾥可以不⽤考虑它们。
则死区时间满⾜;T dead=[(T doffmax−T donmin)+(T pddmax−T pddmin)]∗1.2Tdead=[(Tdoffmax−Tdonmin)+(Tpddmax−Tpddmin)]∗1.2 T doffmax Tdoffmax:最⼤的关断延迟时间;T donmin Tdonmin:最⼩的开通延迟时间;T pddmax Tpddmax:最⼤的驱动信号传递延迟时间;T pddmin Tpddmin:最⼩的驱动信号传递延迟时间;其中T doffmax Tdoffmax和T donmin Tdonmin正如上⽂所提到的可以元器件的数据⼿册中找到;T pddmax Tpddmax和T pddmin Tpddmin⼀般由驱动器⼚家给出,如果是MCU的IO驱动的话,需要考虑IO的上升时间和下降时间,另外⼀般会加光耦进⾏隔离,这⾥还需要考虑到光耦的开关延时。
STM32高级定时器死区时间设置探究
STM32高级定时器死区时间设置探究一、死区设置位置:决定死区时间设置的位是‘刹车和死区寄存器TIM1->BDTR’中的DTG[7:0],设置范围是0x00~0xff。
二、死区时间设置公式如下:DT为死区持续时间,TDTS为系统时钟周期时长,Tdtg为系统时钟周期时长乘以倍数后的死区设置时间步进值。
在72M的定时器时钟下TDTS=1/72M=13.89ns.所以以第一个公式,死区时间能以13.89ns的步进从0调整到127*13.89ns=1764ns第二个公式则能(64+0)*2*13.89~(64+63)*2*13.89=1777.9ns~3528.88ns换个角度看,就是(128~254)*13.89同理,第三个公式就是3555.84ns~7000.56ns换个角度看,就是(256~504)*13.89第四个公式就是7111.68ns~14001.12ns换个角度看,就是(512~1008)*13.89综上:死区时间就是不同的公式代表不同范围的死区时间设置,这个范围是互不重叠的。
而但是在不同的死区时间范围内死区时间设置步进是不同的。
若某个系统时钟下的死区时间不够,可以通过改变定时器时钟来改变最大死区时间范围。
当根据硬件电路的特性定下死区时间后,可以根据目标死区时间范围来找到相应的公式,然后代入公式求解出相应的整数(有时候不一定是整数,那就选择最近的那个),拼接DTG[7:5]+DTG[4:0]即可。
例子:这样当我需要3us的死区持续时间时,则可这么计算:3us在第二个公式决定的死区范围之内。
所以选择第二个公式。
3000/(13.89*2)=108,所以DTG[5:0]=108-64=44,所以DTG=127+44=171=0XabTIM1->BDTR|=0xab;反过来验算//72Mhz,死区时间=13.89nsX108*2=3000us经示波器验证,完全正确。
By zxx2013.07.18。
STM32F103ZET6的基本定时器
STM32F103ZET6的基本定时器1、定时器的分类 STM32F103ZET6总共有8个定时器,它们是:TIM1~TIM8。
STM32的定时器分为基本定时器、通⽤定时器和⾼等定时器。
TIM6、TIM7是基本定时器。
基本定时器是只能向上计数的16位定时器,基本定时器只能有定时的功能,没有外部IO⼝,所以没有捕获和⽐较通道。
TIM2、TIM3、TIM4、TIM5是通⽤定时器。
通⽤定时器是可以向上计数,也可以向下计数的16位定时器。
通⽤定时器可以定时、输出⽐较、输⼊捕捉,每个通⽤定时器具有4个外部IO⼝。
TIM1、TIM8是⾼等定时器。
⾼等定时器是是可以向上计数,也可以向下计数的16位定时器。
⾼等定时器可以定时、输出⽐较、输⼊捕捉、还可以输出三相电机互补信号,每个⾼等定时器有8个外部IO⼝。
定时器分类图如下:2、基本定时器 基本定时器没有外部IO⼝,所以它只有定时的功能。
基本定时器只能向上计数,也就是说基本定时器只能递增计数。
基本定时器功能框图如下: 从功能图的1中可以看到,基本定时器的时钟TIMxCLK来⾃内部时钟,该内部时钟为经过APB1预分频器分频后提供的。
基本定时器跟APB1总线时钟的关系如下:如果APB1预分频系数为1,则基本定时器的时钟等于APB1总线时钟。
如果APB1预分频系数不为1,则基本定时器的时钟等于APB1总线时钟经过分频后的2倍。
⽐如APB1总线经过2分频后的时钟为36MHZ,那么基本定时器的时钟就是72MHZ3(36*2)。
功能图中的2是⼀个预分频器,来⾃内部的时钟经过预分器分频后的时钟,⽤来驱动基本定时器的计数器计数。
基本定时器的预分频器是⼀个16位的预分频器,预分频器可以对定时器时钟进⾏1~65536之间的任何⼀个数进⾏分频。
计算⽅式如下: 定时器⼯作时钟 = 来⾃APB1的时钟/(预分频系数+1) 功能图中的3是⼀个16位的计数器,该计数器能能向上计数,最⼤计数值位65535。
STM32定时器定时时间的计算
STM32 定时器定时时间的计算假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。
RCC_Configuration()的SystemInit()的RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。
因此,每次进入中断服务程序间隔时间为((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72 M)*(1+9999)=1秒*/定时器的基本设置1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间) 累计0xFFFF个频率后产生个更新或者中断(也是说定时时间到)3、TIM_TimeBaseStructure.TIM_CounterMode= TIM1_CounterMode_Up; //定时器模式向上计数4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值5、TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);//初始化定时器26、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断7、TIM_Cmd(TIM2, ENABLE);//打开定时器或者:TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999 72M/(35999+1)/2=1Hz 1秒中断溢出一次TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72 M)*(1+2000)=1秒*/目录内容提要写作提纲正文一、资产减值准备的理论概述 (4)(一)固定资产减值准备的概念 (4)(二)固定资产减值准备的方法 (5)(三)计提资产减值准备的意义 (5)二、固定资产减值准备应用中存在的问题分析 (5)(一)固定资产减值准备的计提模式不固定 (5)(二)公允价值的获取 (6)(三)固定资产未来现金流量现值的计量 (7)(四)利用固定资产减值准备进行利润操纵 (8)三、解决固定资产减值准备应用中存在的问题的对策 (10)(一)确定积累时间统一计提模式 (10)(二)统一的度量标准 (11)(三)提高固定资产可收回金额确定方式的操作性 (11)(四)加强对固定资产减值准备计提的认识 (12)(五)完善会计监督体系 (12)参考文献 (15)内容提要在六大会计要素中,资产是最重要的会计要素之一,与资产相关的会计信息是财务报表使用者关注的重要信息。
STM32高级定时器死区时间设置探究
STM32高级定时器死区时间设置探究一、死区设置位置:决定死区时间设置的位是‘刹车和死区寄存器TIM1->BDTR’中的DTG[7:0],设置范围是0x00~0xff。
二、死区时间设置公式如下:DT为死区持续时间,TDTS为系统时钟周期时长,Tdtg为系统时钟周期时长乘以倍数后的死区设置时间步进值。
在72M的定时器时钟下TDTS=1/72M=13.89ns.所以以第一个公式,死区时间能以13.89ns的步进从0调整到127*13.89ns=1764ns第二个公式则能(64+0)*2*13.89~(64+63)*2*13.89=1777.9ns~3528.88ns换个角度看,就是(128~254)*13.89同理,第三个公式就是3555.84ns~7000.56ns换个角度看,就是(256~504)*13.89第四个公式就是7111.68ns~14001.12ns换个角度看,就是(512~1008)*13.89综上:死区时间就是不同的公式代表不同范围的死区时间设置,这个范围是互不重叠的。
而但是在不同的死区时间范围内死区时间设置步进是不同的。
若某个系统时钟下的死区时间不够,可以通过改变定时器时钟来改变最大死区时间范围。
当根据硬件电路的特性定下死区时间后,可以根据目标死区时间范围来找到相应的公式,然后代入公式求解出相应的整数(有时候不一定是整数,那就选择最近的那个),拼接DTG[7:5]+DTG[4:0]即可。
例子:这样当我需要3us的死区持续时间时,则可这么计算:3us在第二个公式决定的死区范围之内。
所以选择第二个公式。
3000/(13.89*2)=108,所以DTG[5:0]=108-64=44,所以DTG=127+44=171=0XabTIM1->BDTR|=0xab;反过来验算//72Mhz,死区时间=13.89nsX108*2=3000us经示波器验证,完全正确。
By zxx2013.07.18。
stm32看门狗时间计算 独立看门狗和窗口看门狗的特性是什么
stm32看门狗时间计算独立看门狗和窗口看门狗的特性是什么STM32看门狗时间计算(TWDG):1.STM32看门狗的例子IWDG的时限定为280微秒。
这个时限可能会随着LSI(内部低速时钟)的频率漂移而产生微小的变化。
/* IWDG TImeout equal to 280 ms (the TImeout may varies due to LSI frequency dispersion) -------------------------------------------------------------*//* Enable write access to IWDG_PR and IWDG_RLR registers */IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);/* IWDG counter clock: 40KHz(LSI) / 32 = 1.25 KHz */IWDG_SetPrescaler(IWDG_Prescaler_32);/* Set counter reload value to 349 */IWDG_SetReload(349);/*该参数允许取值范围为0 0x0FFF */* Reload IWDG counter */IWDG_ReloadCounter();/* Enable IWDG (the LSI oscillator will be enabled by hardware) */IWDG_Enable();2.独立看门狗(IWDG)由专用的40kHz 的低速时钟为驱动; 因此,即使主时钟发生故障它也仍然有效。
窗口看门狗由从APB1 时钟分频后得到的时钟驱动,通过可配置的时间窗口来检测应用程序非正常的过迟或过早的行为。
可通过IWDG_SetPrescaler(IWDG_Prescaler_32); 对其时钟进行分频,4-256,通过以下方式喂狗:/* Reload IWDG counter */IWDG_ReloadCounter();3. 1.25KHz 即每周期为0.8ms共计时350 个周期,即350*0.8ms=280ms综合以上,STM32看门狗时间(时限)与频率计算公式为:看门狗定时时限= IWDG_SetReload()的值/ 看门狗时钟频率看门狗时钟频率=LSI(内部低速时钟)的频率(40KHz)/ 分频数stm32独立看门狗和窗口看门狗特性、区别:总结起来,两者大概有以下几点特性和区别:1)独立看门狗没有中断,窗口看门狗有中断2)独立看门狗有硬件软件之分,窗口看门狗只能软件控制3)独立看门狗只有下限,窗口看门狗又下限和上限4)独立看门狗是12位递减的。
stm32定时器时间计算
stm32定时器时间计算
STM32定时器的工作原理STM32之所以能够实现定时,是单片机内部在计数脉冲(来自晶振)
T=1/F (F为频率)
例如:我们以51单片机举例,假设单片机搭配12MHz的晶振,由于51单片机是12分频(即1个机器周期有12个时钟周期),则单片机的最小定时时间为
1 2 MHz / 2 = 1 MHz
Tt = 1 / 1 MHz = 1 us
最小定时时间T=1/1MHz=1us
51单片机定时器:
方式0 13位最大定时时间间隔2
=8.192ms
方式1 16位最大定时时间间隔2 =65.536ms
方式2 8位最大定时时间间隔2 =256us
由此我们知道对于一个定时器而言要做到精确定时需要关注2个内容
1、分频器(分频比)
2、定时计数器的值
STM32定时器的时钟CK_CNT表示定时器工作频率
TIMX_PSC表示分频系数
则定时器的工作频率计算公式为
CK_CNT=定时器时钟/(TIMx_PSC+1)
由此我们可得到STM32单片机1个时钟周期
为:T=1/ CK_CNT
例如普通定时器模块的时钟为72MH2,分频比位7199,那么我们想要得到一个1秒钟的定时,定时计数器的值需要设定为》TImx arr = 1 0 0 0 0。
stm32f1定时器计算公式
stm32f1定时器计算公式
STM32F1系列微控制器具有多种定时器,包括基本定时器
(TIM6和TIM7)、通用定时器(TIM2至TIM5)和高级定时器
(TIM1)。
这些定时器可用于测量时间间隔、生成脉冲、控制PWM
输出等多种应用。
对于定时器的计算公式,主要涉及到定时器的时钟频率、预分
频系数和计数器的周期值。
以下是一些常见的计算公式:
1. 计数器的周期值计算公式:
计数器的周期值决定了定时器溢出的时间间隔,计算公式为:
计数器周期值 = (定时器时钟频率 / (预分频系数定时器
工作频率)) 1。
2. PWM输出频率计算公式:
如果使用定时器来生成PWM输出,可以根据以下公式计算PWM输出的频率:
PWM输出频率 = 定时器工作频率 / (计数器周期值 + 1)。
3. 定时器中断频率计算公式:
如果需要定时器中断来执行特定的任务,可以根据以下公式计算定时器中断的频率:
中断频率 = 定时器工作频率 / (预分频系数 (计数器周期值 + 1))。
需要注意的是,不同的定时器具有不同的工作模式和特性,因此在使用时需要查阅相关的参考手册和技术资料,以确保计算公式的准确性和适用性。
另外,定时器的配置和使用也需要结合具体的应用场景和需求进行调整和优化。
STM32 定时器 定时时间的计算
STM32 定时器定时时间的计算假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值定时器的基本设置1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计0xFFFF 个频率后产生个更新或者中断(也是说定时时间到)3、TIM_TimeBaseStructure.TIM_CounterMode =TIM1_CounterMode_Up; //定时器模式向上计数4、TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值5、TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器26、TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);//打开中断溢出中断7、TIM_Cmd(TIM2, ENABLE);//打开定时器或者:TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频3599972M/(35999+1) /2=1Hz1 秒中断溢出一次TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1 秒*/tips:感谢大家的阅读,本文由我司收集整编。
仅供参阅!。
STM32高级定时器死区控制
STM32高级定时器都带有死区控制功能,一般来说死区控制主要用于马达、变频器等控制。
一、死区时间概念BLDC控制换相电路如下死区时间是两路互补PWM输出时,为了使桥式换相电路上管T1和下管T2、上管T3和下管T4、上管T5和下管T6不会因为开关速度问题发生同时导通(同时导通电源会短路)而设置的一个保护时段。
假设STM32高级定时器OCX和OCXN输出互补通道PWM,极性都是高电平有效,则下图中标注“延迟”那段时间就是死区时间,此时间段上管和下管都没有导通。
二、STM32高级定时器死区时间计算1. 配置寄存器2. 死区时间计算示例假设STM32F407的高级定时器TIM1的时钟为168MHz,设置tDTS=1/168us。
死区时间设置2us,经过估算该死区时间落在DTG[7:5]=110段。
(32+DTG[4:0]) /21 us= 2us,计算出DTG[4:0]=10=01010B,再与DTG[7:5]拼接,最后算得DTG[7:0]=10=11001010B=0xCA。
死区时间设置4us,经过估算该死区时间落在DTG[7:5]=111段。
2*(32+DTG[4:0]) /21 us= 4us,计算出DTG[4:0]=10=01010B,再与DTG[7:5]拼接,最后算得DTG[7:0]=10=11101010B=0xEA。
需注意死区时间计算是分段计算,每段公式不一样。
三、配置死区时间过程可能出现的问题问题:发现插入死区时间后,没有互补脉冲输出了。
一般是死区参数设置不合适导致出现了以下两种情况。
如果延迟时间大于有效输出(OCx 或OCxN)的宽度,则不会产生相应的脉冲。
注意:插入死区是为了保证桥式驱动电路中上下桥臂的开关管不会同时导通,提高控制安全性,但不是死区时间越长越好,死区是以牺牲开关管有效驱动脉冲时间为代价的,死区时间长短是由开关管硬件开关的速度决定。
STM32Cubemx配置定时器定时1mS
STM32Cubemx配置定时器定时1mS 最近才发现原来我把定时器⾥的配置参数代表的意义给搞混了,这⾥记录⼀下,防⽌以后⾃⼰忘记。
以建⽴⼀个定时1mS定时器为例: 1、先打开定时器 2、配置好时钟 3、配置定时器设置 重点来了,以前在这⾥我⼀直以为这⾥配置的就是时间,然后在调频率的时候,⼀直不对劲,知道查阅了硬⽯的资料才发现,这⾥配置的是进⼊定时器中断的频率,然后要定的时间要跟据这个频率来定时的。
由这个图可见,这⾥配置的是定时器产⽣中断的频率,然后再跟据频率与时间的关系推出定时的时间。
所以定时器频率为 f = 72M / Prescaler / Period = 72000 000 / 72 /1000 = 1000Hz; 定时时间T = 1 / f 则: 1s / 1000Hz = 1000 000us / 1000Hz = 1000us =1ms。
这样就可以定时1ms了啦,如果要做PWM频率调频,就直接改 pre 与 per 算出 f 就可以了。
具体公式如下图(上⾯的计算我是为了⽅便理解把公式逆运算了⼀次): 最后使⽤定时器中断跟关闭定时器中断以及回调函数即可, 使⽤中断的时候注意要先开启中断HAL_TIM_Base_Start_IT(&htim1); //使⽤定时器的时候调⽤这个函数启动HAL_TIM_Base_Stop_IT(&htim1); //停⽌定时器的时候调⽤这个函数关闭void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance == TIM1) { //编写回调逻辑,即定时器1定时1MS后的逻辑 }}补充:最后记得⽣成STM32Cubemx⽂件时打开定时器中断,不然进不了回调函数,⼀般的话习惯⽤TIM3做定时器。
STM32定时器所支持的三种计数模式及计数过程
STM32定时器所支持的三种计数模式及计数过程STM32常规定时器主要包括基本定时器、通用定时器和高级定时器。
不论哪一类定时器,都有个共同的计数定时单元,我们把它称之为时基单元。
该单元主要由三部分组成:分频模块、计数模块、自动重装载模块。
分频模块用来对外来的计数时钟进行分频,这里有个分频计数器,通过它来实现对时钟的分频功能。
与之对应的有个分频器寄存器TIMx_PSC,用来配置和存放分频比、分频系数。
计数模块用来对来自分频器输出的计数脉冲进行计数。
相应的这里有个寄存器—计数器寄存器TIMx_CNT,为了把该计数器跟别的计数器区别开来,不妨称它为核心计数器。
自动重装载模块用来配合计数器溢出,当计数器溢出时为之赋予初始计数值的功能单元。
与之相应的有个自动重装载寄存器TIMx_ARR.当自动重装载寄存器TIMx_ARR修改生效后就可以自动地作为计数器的计数边界或重装值。
关于自动重装及自动重装载寄存器TIMx_ARR是个相对比较难理解的地方,尤其关于ARR寄存器数据的含义。
我们在看STM32参考手册时,很难一下子理解得很到位,往往需要结合上下文内容反复阅读后去领会。
关于计数器的溢出与重装,在手册里只有些零散且并不算清晰的介绍,这里尽力跟大家做些交流,以供参考。
当计数器溢出时,自动重装载器为计数器重装计数初始值。
自动重装寄存器【ARR】为计数器设置计数边界或初始值,决定计数脉冲的多少或计时周期长短。
比如:计数器向上计数时,计到多少发生溢出;向下计数时从多少开始往下计数。
平常我们泛泛地说ARR寄存器为计数器提供计数边界或重装值,但它的具体含义及使用需要结合计数器的计数模式才能确定。
那一起看看STM32定时器所支持的三种计数模式及计数过程。
【文中图片可以点击放大观看】。
STM32f407系统定时器时钟配置计算
STM32f407系统定时器时钟配置计算首先,我们需要配置系统定时器的时钟源。
STM32F407的系统定时器可以使用内部时钟源(HCLK/8)或外部时钟源。
通过软件配置,我们可以选择其中一种时钟源。
1.配置内部时钟源:要使用内部时钟源,可以通过RCC寄存器来配置。
具体需要做以下几步:a. 使能系统定时器时钟:在 RCC_APBxENR 寄存器中设置位SysTickEN=1,其中 x 为适当的 APBx 总线索引。
b.配置系统定时器时钟源:在STK_CTRL寄存器中设置位CLKSOURCE=12.配置外部时钟源:如果要使用外部时钟源作为系统定时器的时钟源,我们需要将外部时钟源与系统的时钟树相连。
具体的配置方法因时钟源的不同而不同,可参考具体芯片的参考手册。
配置了系统定时器的时钟源后,我们可以计算定时器中断的时间间隔。
系统定时器中断的时间间隔=(计数器周期)*(重载值+1)/(时钟频率)其中,计数器周期为24位,取值范围为0~2^24-1、时钟频率为系统定时器的时钟源频率。
重载值是计数器的初始值,当计数器减到0时,会触发定时中断。
举个例子,假设系统定时器的时钟源频率为8MHz,我们希望计算系统定时器中断每100ms触发一次的重载值。
中断触发周期 = 100ms = 0.1s时钟频率=8MHz=8*10^6Hz由于重载值需要为整数,我们可以将计算结果四舍五入为最接近的整数,即重载值为477以上就是STM32F407系统定时器时钟配置和计算方法的简要介绍。
配置完系统定时器的时钟源,并计算出需要的重载值后,我们可以通过编程设置相关寄存器,来开始使用系统定时器进行定时中断的任务。
定时器计算方法
STM32定时器时间的计算方法STM32中的定时器有很多用法:(一)系统时钟(SysTick)设置非常简单,以下是产生1ms中断的设置,和产生10ms延时的函数:void RCC_Configuration(void){RCC_ClocksTypeDef RCC_ClockFreq;SystemInit();//源自system_stm32f10x.c文件,只需要调用此函数,则可完成RCC的配置. RCC_GetClocksFreq(&RCC_ClockFreq);//SYSTICK分频--1ms的系统时钟中断if (SysTick_Config(SystemFrequency / 1000)){while (1); // Capture error}}void SysTick_Handler(void)//在中断处理函数中的程序{while(tim){tim--;}}//调用程序:Delay_Ms(10);当然,前提是要设置好,变量tim要设置成volatile类型的。
(二)第二种涉及到定时器计数时间(TIMx)/*TIM3时钟配置*/TIM_TimeBaseStructure.TIM_Prescaler = 2; //预分频(时钟分频)72M/(2+1)=24M TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数TIM_TimeBaseStructure.TIM_Period = 65535; //装载值18k/144=125hzTIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);定时时间计算:TIM_TimeBaseStructure.TIM_Prescaler = 2;//分频2 72M/(2+1)/2=24MHzTIM_TimeBaseStructure.TIM_Period = 65535; //计数值65535((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+2)/72M)*(1+65535)=0.00273秒=366.2Hz */注意两点(来自大虾网,未经检验)(1)TIMx(1-8),在库设置默认的情况下,都是72M的时钟;(2)TIM_TimeBaseStructure.TIM_RepetitionCounter=0;是重复计数,就是重复溢出多少次才给你来一个溢出中断,它对应的寄存器叫TIM1 RCR.如果这个值不配置,上电的时候寄存器值可是随机的,本来1秒中断一次,可能变成N秒中断一次,让你超级头大!假设系统时钟是72Mhz,TIM1是由PCLK2(72MHz)得到,TIM2-7是由PCLK1得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。
STM32日记之SysTick1
STM32 systick 定时时间计算STM32学习笔记2]SysTick定时器2009-07-14 10:52[STM32学习笔记2]SysTick定时器 - [ARM]版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明/logs/35901649.html请先参考以下材料:《Cortex-M3权威指南》《Cortex-M3 Technical Reference Manual》Q:什么是SYSTick定时器?SysTick 是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。
只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。
Q:为什么要设置SysTick定时器?(1)产生操作系统的时钟节拍SysTick定时器被捆绑在NVIC中,用于产生SYSTICK异常(异常号:15)。
在以前,大多操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。
因此,需要一个定时器来产生周期性的中断,而且最好还让用户程序不能随意访问它的寄存器,以维持操作系统“心跳”的节律。
(2)便于不同处理器之间程序移植。
Cortex‐M3处理器内部包含了一个简单的定时器。
因为所有的CM3芯片都带有这个定时器,软件在不同 CM3器件间的移植工作得以化简。
该定时器的时钟源可以是内部时钟(FCLK,CM3上的自由运行时钟),或者是外部时钟( CM3处理器上的STCLK信号)。
不过,STCLK的具体来源则由芯片设计者决定,因此不同产品之间的时钟频率可能会大不相同,你需要检视芯片的器件手册来决定选择什么作为时钟源。
SysTick 定时器能产生中断,CM3为它专门开出一个异常类型,并且在向量表中有它的一席之地。
它使操作系统和其它系统软件在CM3器件间的移植变得简单多了,因为在所有CM3产品间对其处理都是相同的。
(3)作为一个闹铃测量时间。
SysTick定时器除了能服务于操作系统之外,还能用于其它目的:如作为一个闹铃,用于测量时间等。
STM32定时时间的计算
STM32定时时间的计算在STM32微控制器中,定时器(Timer)通常用于生成基准时间延迟和周期性触发任务。
在计算定时时间时,需要考虑定时器的时钟源、分频因子和自动重装载值等参数。
首先,确定定时器的时钟源。
定时器可以使用内部时钟源(如系统时钟)或外部时钟源(如外部晶振)。
根据实际需求和系统架构,选择合适的时钟源。
分频因子=(定时器时钟频率/所需时钟频率)-1注意,这里所需时钟频率应是定时器触发的频率(即每秒触发的次数)。
然后,确定自动重装载值。
自动重装载值决定了定时器溢出时的触发时间。
溢出时间(即定时时间)由ARR(自动重装载寄存器)和分频因子计算得出。
计算公式为:定时时间=(ARR+1)*(PSC+1)/定时器时钟频率最后,根据计算出的自动重装载值和分频因子设置对应定时器寄存器。
HAL_TIM_Base_Init(TIM_HandleTypeDef *htim) - 初始化定时器基本配置HAL_TIM_Base_Start(TIM_HandleTypeDef *htim) - 启动定时器HAL_TIM_Base_Stop(TIM_HandleTypeDef *htim) - 停止定时器HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim) - 配置定时器的GPIO和中断等外设需要注意的是,根据不同的STM32系列和型号,定时器的寄存器和函数可能会有所不同,根据具体开发板的参考手册和官方文档进行配置。
综上所述,STM32定时时间的计算主要涉及定时器的时钟源、分频因子和自动重装载值的确定。
根据计算公式和对应的定时器设置函数,可以实现精确的定时时间控制。
在实际应用中,可以根据具体需求灵活调整定时器的参数,以满足系统的要求。
第八章 STM32定时器
RCC_APB1PeriphClockCmd (RCC_APB1Periph_TIM2 ,ENABLE) ; }
8.7 TIM2应用实例概述
2.GPIO的配置
设系统时钟为72MHz ,则定时时间T: T= (TIM_Period+1)* (TIM_Pre scaler+1)/TI MxCLK= (35999+1)* (1999+1)/72MHz= 1s
8.6 通用定时器TIMx寄存器
STM32通用定时器的TIMx寄存器较多 ,有 18个 ,使用较复杂。
8.7 TIM2应用实例概述
3.NVIC的配置
设置初始化中断向量
void NVIC_Config (void)
{
/*设置优先分级组,选择中断通道*/
NVIC_In itTypeDef NVIC_In itStructure ;
NVIC_PriorityGroupConfig (NVIC_PriorityGrou p_0) ;
6) TIM_TimeBase In it ():TIMx初始化 7) TIM_ClearFlag (): 清除溢出中断标志; 8) TIM_ITConfig ():开启定时器中断 ,和NVIC作
用相当于双保险 ;便于以后开启和关闭定时器。
9) TIM_Cmd(): 允许定时器工作。
8.7 TIM2应用实例概述
具体选择哪个时钟可通过TIMx_SMCR寄 存器的相关位来设置 。CK_INT时钟是从APB1 倍频得到的 。从图中可看出 , 定时器的时钟 不是直接来自APB1或APB2 ,而是来自于输入 为APB1或APB2的一个倍频器。
stm32定时器延时时间
SYSTICK_CSR |= 0x06; //时间到关闭 SysTick使能用的时候在打开
}
int main(void)
{
SystemInit(); //注意这么是把系统时钟设初始化为 72M主频,这里是必须的
unsigned long SysTick_Delay;//全局变量
//配置寄存器
void SysTick_InitStructReadCmd(void)
{
SYSTICK_VAL = 0; //当前值寄存器清零
SYSTICK_LOAD = SystemCoreClock / 1000000; //重要部分就在这里 系统72000000 / 100000
#elif defined SYSCLK_FREQ_36MHz
uint32_t SystemCoreClock = SYSCLK_FREQ_36MHz;
#elif defined SYSCLK_FREQ_48MHz
uint32_z;
这个程序折磨我1个星期,没有吃好睡好,搞明白后我就马上做上笔记那给大家分享。
*/
//讲得简单易懂,当然精确定时还是要定时器的
uint32_t SystemCoreClock = SYSCLK_FREQ_72MHz;
#else /*!< HSI Selected as System Clock source */
// uint32_t SystemCoreClock = HSI_VALUE;
/* 好了我们开始讲解程序1us是怎么实现的,我们使用时钟源为APB时钟,APB系统频率陪配置为72MHZ
STM32f407系统定时器时钟配置、计算
STM32f407系统定时器时钟配置、计算STM32f407系统定时器时钟配置、计算1. 外部晶振的选择##确定自己单片机的外部晶振系统默认配置为25M,即打开官方库文件参数HSE Frequency(Hz) 一般为25000000HSE Frequency(Hz) | 25000000----------#if !defined (HSE_VALUE)#define HSE_VALUE ((uint32_t)25000000) /*!<Value of the External oscillator in Hz */#endif /* HSE_VALUE */... ... ...我自己的单片机外部晶振为8M,将参数改为80000002. 系统时钟确定2.1 改完之后参照stm32f4时钟树2.2 首先明确自己的系统总时钟找到自己程序PLL Parameters部分(工程system_stm32f4xx.c) /************************* PLL Parameters***************************//* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N */ //锁相环压腔振荡器时钟//PLL_VCO =(HSE_VALUE/PLL_M)* PLL_N=8/ 8* 336 = 336MHz#define PLL_M 8#define PLL_N 336/* SYSCLK = PLL_VCO / PLL_P */// 系统时钟SYSCLK = PLL_VCO / PLL_P=336 / 2 = 168MHz #define PLL_P 2/* USB OTG FS, SDIO and RNG Clock = PLL_VCO / PLLQ */ //USB,SD卡时钟= PLL_VCO / PLLQ=336 / 7 = 48MHz#define PLL_Q 7/************************************************************** *****/3. 计算出自己系统时钟为168M##3.1 对应时钟线这里需要计算各个定时器分配所得的计数时钟频率3.2 找到APB1,APB2配置部分3.3 程序位置/* Select regulator voltage output Scale 1 mode, System frequency up to 168 MHz */RCC->APB1ENR |= RCC_APB1ENR_PWREN;PWR->CR |= PWR_CR_VOS;/* HCLK = SYSCLK / 1*/RCC->CFGR |= RCC_CFGR_HPRE_DIV1;/* PCLK2 = HCLK / 2*/RCC->CFGR |= RCC_CFGR_PPRE2_DIV2;/* PCLK1 = HCLK / 4*/RCC->CFGR |= RCC_CFGR_PPRE1_DIV4;/* Configure the main PLL */RCC->PLLCFGR = PLL_M | (PLL_N << 6) | (((PLL_P >> 1) -1) << 16) |(RCC_PLLCFGR_PLLSRC_HSE) | (PLL_Q << 24);3.4 位置计算15:13位为 010 ----->AHB2 不分频12:10位为 101 ----->AHB1 4分频e. 原则“非1即2”明确APB1得到时钟84M,APB2计数时钟频率168M 4. 系统默认情况:4.1 定时周期、频率的计算/****************************************************默认配置:外部时钟启动失败,系统会自动使用内部时钟*HCLK = SYSCLK / 1 = 168MHz ,AHB×总线时钟*PCLK2 = HCLK / 2 = 84MHz*PCLK1 = HCLK / 4 = 42MHz* arr:自动重装载值* psc:时钟预分频树* 定时器溢出时间计算方法:T out=((arr+1)*(psc+1))/Ft us.* Ft=定时器工作频率,单位:Mhz*****************************************************/ 4.2 实例验证演示。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STM32 定时器定时时间的计算
假设系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到关键是设定时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。
RCC_Configuration()的SystemInit()的
RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。
因此,每次进入中断服务程序间隔时间为:
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+7199)/72M)*(1+9999)=1秒。
定时器的基本设置如下:
1、TIM_TimeBaseStructure.TIM_Prescaler = 7199;//时钟预分频数例如:时钟频率=72/(时钟预分频+1)。
2、TIM_TimeBaseStructure.TIM_Period = 9999; // 自动重装载寄存器周期的值(定时时间)累计 0xFFFF个频率后产生个更新或者中断(也是说定时时间到)。
3、TIM_TimeBaseStructure.TIM_CounterMode=TIM1_CounterMode_Up; //定时器模式向上计数。
4、 TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; //时间分割值。
5、 TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);//初始化定时器2。
6、 TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断。
7、 TIM_Cmd(TIM2, ENABLE);//打开定时器或者:
TIM_TimeBaseStructure.TIM_Prescaler = 35999;//分频35999,72M/
(35999+1)/2=1Hz 1秒中断溢出一次。
8、 TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000
((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72M)*(1+2000)=1秒。
9、注意使用不同定时器时,要注意对应的时钟频率。
例如TIM2对应的是APB1,而TIM1对应的是APB2
通用定时器实现简单定时功能
以TIME3为例作为说明,简单定时器的配置如下:
void TIM3_Config(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_DeInit(TIM3); //复位TIM2定时器
/* TIM2 clock enable [TIM2定时器允许]*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
/* TIM2 configuration */
TIM_TimeBaseStructure.TIM_Period = 49; // 0.05s定时
TIM_TimeBaseStructure.TIM_Prescaler = 35999; // 分频36000
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分割TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
/* Clear TIM2 update pending flag[清除TIM2溢出中断标志] */
TIM_ClearFlag(TIM3, TIM_FLAG_Update);
/* Enable TIM2 Update interrupt [TIM2溢出中断允许]*/
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* TIM2 enable counter [允许tim2计数]*/
TIM_Cmd(TIM3, ENABLE);
}
通用定时器实现外部脉冲计数功能(对外部时间计数)
以TIME2为例作为说明,提供一个小程序以供参考(只提供主程序,不提供其它的基础配置):
int main(void)
{
#ifdef DEBUG
debug();
#endif
inti_Loop;
intn_Counter;
RCC_Configuration(); // System Clocks Configuration
NVIC_Configuration(); // NVIC configuration
GPIO_Configuration(); // Configure the GPIO ports
USART_ART_BaudRate = 115200;
USART_ART_WordLength = USART_WordLength_8b;
USART_ART_StopBits = USART_StopBits_1;
USART_ART_Parity = USART_Parity_No ;
USART_ART_HardwareFlowControl=USART_HardwareFlowContr ol_None;
USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_ART_Clock = USART_Clock_Disable;
USART_ART_CPOL = USART_CPOL_Low;
USART_ART_CPHA = USART_CPHA_2Edge;
USART_ART_LastBit = USART_LastBit_Disable;
/* Configure the USARTx */
USART_Init(USART1, &USART_InitStructure);
/* Enable the USARTx */
USART_Cmd(USART1, ENABLE)
TIM_TimeBaseStructure.TIM_Period = 0xFFFF;
TIM_TimeBaseStructure.TIM_Prescaler = 0x00;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Time base
configuration
TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF,
TIM_ExtTRGPolarity_NonInverted, 0);
TIM_SetCounter(TIM2, 0);
TIM_Cmd(TIM2, ENABLE);
for(i_Loop = 0; i_Loop< 1000; i_Loop ++)
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
Delay(100);
GPIO_ResetBits(GPIOC, GPIO_Pin_6);
Delay(100);
}
n_Counter = TIM_GetCounter(TIM2);
while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); printf("检测到的脉冲个数为:%d\n",n_Counter);
while (1) {
}
}。