STM32 定时器 定时时间的计算

STM32 定时器 定时时间的计算
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);//初始化定时器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秒中断溢出一次

TIM_TimeBaseStructure.TIM_Period = 2000; //计数值2000 ((1+TIM_Prescaler )/72M)*(1+TIM_Period )=((1+35999)/72 M)*(1+2000)=1秒*/

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=0Xab TIM1->BDTR|=0xab; 反过来验算//72Mhz,死区时间=13.89nsX108*2=3000us 经示波器验证,完全正确。 By zxx2013.07.18

stm32的定时器输入捕获与输出比较

stm32的定时器输入捕获与输出比较 (2015-09-28 09:26:24) 转载▼ 分类:stm32 标签: it 明确一点对比AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉-------测量频率用,也可以配置为输出比较--------输出PWM使用 输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。 外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。 时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信号的频率。 输出比较:定时器中计数寄存器在初始化完后会自动的计数。从bottom计数到top。并且有不同的工作模式。 另外还有个比较寄存器。一旦计数寄存器在从bottom到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。 然后根据不同的工作模式计数寄存器将清零或者计数到top值。

1、朋友,可以解释一下输入捕获的工作原理不? 计数寄存器的初值,是自己写进去的吗? 我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? timer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不? 那输出比较的原理你可以帮我介绍一下不?

比较单元的值是人为设进去的吧? 上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不同的波形了” 设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不? 011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?

详解STM32定时器

1.STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。 2.普通定时器TIM2-TIM5 2.1时钟来源 计数器时钟可以由下列时钟源提供: ·内部时钟(CK_INT) ·外部时钟模式1:外部输入脚(TIx) ·外部时钟模式2:外部触发输入(ETR) ·内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定时器Timer1而作为另一个定时器Timer2的预分频器。 由于今天的学习是最基本的定时功能,所以采用内部时钟。TIM2-TIM5的时钟不是直接来自于APB1,而是来自于输入为APB1的一个倍频器。这个倍频器的作用是:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其他数值时(即预分频系数为2、4、8或16),这个倍频器起作用,定时器的时钟频率等于APB1的频率的2倍。APB1的分频在STM32_SYSTICK的学习笔记中有详细描述。通过倍频器给定时器时钟的好处是:APB1不但要给TIM2-TIM5提供时钟,还要为其他的外设提供时钟;设置这个倍频器可以保证在其他外设使用较低时钟频率时,TIM2-TIM5仍然可以得到较高的时钟频率。 2.2计数器模式

05_STM32F4通用定时器详细讲解

STM32F4系列共有14个定时器,功能很强大。14个定时器分别为: 2个高级定时器:Timer1和Timer8 10个通用定时器:Timer2~timer5 和 timer9~timer14 2个基本定时器: timer6和timer7 本篇欲以通用定时器timer3为例,详细介绍定时器的各个方面,并对其PWM 功能做彻底的探讨。 Timer3是一个16位的定时器,有四个独立通道,分别对应着PA6 PA7 PB0 PB1 主要功能是:1输入捕获——测量脉冲长度。 2 输出波形——PWM 输出和单脉冲输出。 Timer3有4个时钟源: 1:内部时钟(CK_INT ),来自RCC 的TIMxCLK 2:外部时钟模式1:外部输入TI1FP1与TI2FP2 3:外部时钟模式2:外部触发输入TIMx_ETR ,仅适用于TIM2、TIM3、TIM4,TIM3,对应 着PD2引脚 4:内部触发输入:一个定时器触发另一个定时器。 时钟源可以通过TIMx_SMCR 相关位进行设置。这里我们使用内部时钟。 定时器挂在高速外设时钟APB1或低速外设时钟APB2上,时钟不超过内部高速时钟HCLK ,故当APBx_Prescaler 不为1时,定时器时钟为其2倍,当为1时,为了不超过HCLK ,定时器时钟等于HCLK 。 例如:我们一般配置系统时钟SYSCLK 为168MHz ,内部高速时钟 AHB=168Mhz ,APB1欲分频为4,(因为APB1最高时钟为42Mhz ),那么挂在APB1总线上的timer3时钟为84Mhz 。 《STM32F4xx 中文参考手册》的424~443页列出与通用定时器相关的寄存器一共20个, 以下列出与Timer3相关的寄存器及重要寄存器的简单介绍。 1 TIM3 控制寄存器 1 (TIM3_CR1) 作用:1使能自动重载TIM3_ARR 2定时器的计数器递增或递减计数。 3 事件更新。 4 计数器使能 2 TIM 3 控制寄存器 2 (TIM3_CR2) 3 TIM3 从模式控制寄存器 (TIM3_SMCR) 4 TIM3 DMA/中断使能寄存器 (TIM3_DIER) SYSCLK(最高 AHB_Prescaler APBx_Prescaler

STM32通用定时器

STM32通用定时器 一、定时器的基础知识 三种STM32定时器区别 通用定时器功能特点描述: STM3 的通用 TIMx (TIM2、TIM3、TIM4 和 TIM5)定时器功能特点包括: 位于低速的APB1总线上(APB1) 16 位向上、向下、向上/向下(中心对齐)计数模式,自动装载计数器(TIMx_CNT)。 16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数 为 1~65535 之间的任意数值。 4 个独立通道(TIMx_CH1~4),这些通道可以用来作为: ①输入捕获 ②输出比较 ③ PWM 生成(边缘或中间对齐模式) ④单脉冲模式输出 可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。 如下事件发生时产生中断/DMA(6个独立的IRQ/DMA请求生成器): ①更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ②触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ③输入捕获 ④输出比较 ⑤支持针对定位的增量(正交)编码器和霍尔传感器电路 ⑥触发输入作为外部时钟或者按周期的电流管理 STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 STM32 的每个通用定时器都是完全独立的,没有互相共享的任何资源。 定时器框图:

倍频得到),外部时钟引脚,可以通过查看数据手册。也可以是TIMx_CHn,此时主要是实现捕获功能; 框图中间的时基单元 框图下面左右两部分分别是捕获输入模式和比较输出模式的框图,两者用的是同一引脚,不能同时使用。

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)/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溢出中断标志] */

STM32F103ve定时器时间算法

S TM32 定时器定时时间的计算 2010-11-18 14:12:18| 分类:资料引用| 标签:|字号大中小订阅 引用 mxpopstar 的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秒中断溢出一次

STM32通用定时器学习

STM32通用定时器 STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER做个剖析。实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用…… TIMER主要是由三部分组成: 1、时基单元。 2、输入捕获。 3、输出比较。 还有两种模式控制功能:从模式控制和主模式控制。 一、框图 让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了… 为了方便的看图,我对里面出现的名词和符号做个注解: TIMx_ETR:TIMER外部触发引脚 ETR:外部触发输入 ETRP:分频后的外部触发输入 ETRF:滤波后的外部触发输入 ITRx:内部触发x(由另外的定时器触发) TI1F_ED:TI1的边沿检测器。 TI1FP1/2:滤波后定时器1/2的输入 TRGI:触发输入 TRGO:触发输出 CK_PSC:应该叫分频器时钟输入 CK_CNT:定时器时钟。(定时周期的计算就靠它) TIMx_CHx:TIMER的输入脚 TIx:应该叫做定时器输入信号x ICx:输入比较x ICxPS:分频后的ICx OCx:输出捕获x OCxREF:输出参考信号 关于框图还有以下几点要注意: 1、影子寄存器。 有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预 装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的 寄存器,称为shadow register(影子寄存器);(详细请参考版主博客 https://www.360docs.net/doc/be10698652.html,/STM32/401461/message.aspx) 2、输入滤波机制 在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率 Fdts来采样N次进行滤波的。(具体也请参考版主博客 https://www.360docs.net/doc/be10698652.html,/STM32/263170/message.aspx) 3、输入引脚和输出引脚是相同的。 二、时基单元 时基单元有三个部分:CNT、PSC、ARR。CNT的计数方式分三种:向上、

stm32f407通用定时器输入捕获

通用定时器输入捕获 通用定时器作为输入捕获的使用。我们用TIM5的通道1(PA0)来做输入捕获,捕获PA0上高电平的脉宽(用KEY_UP按键输入高电平),通过串口来打印高电平脉宽时间。 输入捕获模式可以用来测量脉冲宽度或者测量频率。我们以测量脉宽为例,用一个简图来说明输入捕获的原理: 如图所示,就是输入捕获测量高电平脉宽的原理,假定定时器工作在向上计数模式,图中t1~t2时间,就是我们需要测量的高电平时间。测量方法如下:首先设置定时器通道x为上升沿捕获,这样,t1时刻,就会捕获到当前的CNT值,然后立即清零CNT,并设置通道x为下降沿捕获,这样到t2时刻,又会发生捕获事件,得到此时的CNT值,记为CCRx2。这样,根据定时器的计数频率,我们就可以算出t1~t2的时间,从而得到高电平脉宽。在t1~t2之间,可能产生N次定时器溢出,这就要求我们对定时器溢出,做处理,防止高电平太长,导致数据不准确。如图所示,t1~t2之间,CNT计数的次数等于:N*ARR+CCRx2,有了这个计数次数,再乘以CNT的计数周期,即可得到t2-t1的时间长度,即高电平持续时间。 STM32F4的定时器,除了TIM6和TIM7,其他定时器都有输入捕获功能。STM32F4的输入捕获,简单的说就是通过检测TIMx_CHx上的边沿信号,在边沿信号发生跳变(比如上升沿/下降沿)的时候,将当前定时器的值(TIMx_CNT)存放到对应的通道的捕获/比较寄存器(TIMx_CCRx)里面,完成一次捕获。同时还可以配置捕获时是否触发中断/DMA等。这里我们用TIM5_CH1来捕获高电平脉宽。 ============================================================== ===================== 捕获/比较通道(例如:通道1 输入阶段) ============================================================== ===================== 接下来介绍我们需要用到的一些寄存器配置,需要用到的寄存器:TIMx_ARR、TIMx_PSC、

STM32通用定时器学习

STM32入门篇之通用定时器彻底研究 STM32的定时器功能很强大,学习起来也很费劲儿,本人在这卡了5天才算看明白。写下下面的文字送给后来者,希望能带给你点启发。在此声明,本人也是刚入门,接触STM32不足10天,所以有失误的地方请以手册为准,欢迎大家拍砖。 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册…}才搞明白的!所以接下来我以手册的顺序为主线,增加一些自己的理解,并通过11个例程对TIMER 做个剖析。实验环境是STM103V100的实验板,MDK3.2 +Library2.东西都不怎么新,凑合用…… TIMER主要是由三部分组成: 1、时基单元。 2、输入捕获。 3、输出比较。 还有两种模式控制功能:从模式控制和主模式控制。 一、框图 让我们看下手册,一开始是定时器的框图,这里面几乎包含了所有定时器的信息,您要是能看明白,那么接下来就不用再看别的了… 为了方便的看图,我对里面出现的名词和符号做个注解: TIMx_ETR:TIMER外部触发引脚 ETR:外部触发输入 ETRP:分频后的外部触发输入 ETRF:滤波后的外部触发输入 ITRx:内部触发x(由另外的定时器触发) TI1F_ED:TI1的边沿检测器。 TI1FP1/2:滤波后定时器1/2的输入 TRGI:触发输入 TRGO:触发输出 CK_PSC:应该叫分频器时钟输入 CK_CNT:定时器时钟。(定时周期的计算就靠它) TIMx_CHx:TIMER的输入脚 TIx:应该叫做定时器输入信号x ICx:输入比较x ICxPS:分频后的ICx OCx:输出捕获x OCxREF:输出参考信号 关于框图还有以下几点要注意: 1、影子寄存器。 有阴影的寄存器,表示在物理上这个寄存器对应2个寄存器,一个是程序员可以写入或读出的寄存器,称为preload register(预 装载寄存器),另一个是程序员看不见的、但在操作中真正起作用的寄 存器,称为shadow register(影子寄存器);输入滤波机制 在ETR何TIx输入端有个输入滤波器,它的作用是以采样频率 Fdts来采样N次进行滤波的。 2、输入引脚和输出引脚是相同的。 二、时基单元 时基单元有三个部分:CNT、PSC、ARR。CNT的计数方式分三种:向上、

STM32定时器的频率配置

STM32定时器的频率配置 STM32 定时器产生不同频率的PWM 平时记性实在太差,调试完的程序,过两天又忘了,往往需要一阵子才能想起来,有时以前的资料找不到了,更是恼火,不得不重复到网上搜索。刚刚调试成功了一个类型的程序,立刻记下来,呵呵,不要又忘记了。 STM32产生PWM是非常的方便的,要需要简单的设置定时器,即刻产生!当然,简单的设置对于新手来产,也是麻烦的,主要包括: (1)使能定时器时钟:RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); (2)定义相应的GPIO: /* PA2,3,4,5,6输出->Key_Up,Key_Down,Key_Left,Key_Right,Key_Ctrl */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //下拉接地,检测输入的高电平 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度 GPIO_Init(GPIOA, &GPIO_InitStructure); /* PA7用于发出PWM波,即无线数据传送*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //50M时钟速度 GPIO_Init(GPIOA, &GPIO_InitStructure); (3)如果是产生PWM(频率不变,占空比可变),记得打开PWM控制,在TIM_Configuration()中。 TIM_Cmd(TIM3,ENABLE); /* TIM1 Main Output Enable */ TIM_CtrlPWMOutputs(TIM1,ENABLE); 利用定时器产生不同频率的PWM 有时候,需要产生不同频率的PWM,这个时候,设置与产生相同PWM的程序,有关键的不一样。 (一)设置的原理 利用改变定时器输出比较通道的捕获值,当输出通道捕获值产生中断时,在中断中将捕获值改变,这时,输出的I/O会产生一个电平翻转,利用这种办法,实现不同频率的PWM输出。 (二)关键设置 在定时器设置中:TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Disable); 在中断函数中:if (TIM_GetITStatus(TIM3, TIM_IT_CC2) != RESET) { TIM_ClearITPendingBit(TIM3, TIM_IT_CC2); capture = TIM_GetCapture2(TIM3); TIM_SetCompare2(TIM3, capture + Key_Value); }

浅析STM32定时器TIM_Period和TIM_Prescaler-20180322

浅析STM32定时器TIM_Period和TIM_Prescaler By:T7 Date:20180322 At:YSU-B307-2 1.//配置定时器基础结构体 2. TIM_DeInit(TIM2); 3. TIM_TimeBaseStructure.TIM_Period = (1000-1); //设置在下一个更新事件装入 活动的自动重装载寄存器周期的值计数到1000为1ms 4. TIM_TimeBaseStructure.TIM_Prescaler =(72-1); //设置用来作为TIMx时钟频率 除数的预分频值 1M的计数频率 1US计数 5. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;//不分频 6. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上 计数模式 7. TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInit Struct中指定的参数初始化TIMx的时间基数单位 8. 9. TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除更新中断,免得一打开中断立 即产生中断 10. TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //打开定时器更新中断 11. 分析这段代码: TIM_TimeBaseStructure.TIM_Period= 1000 – 1; TIM_TimeBaseStructure.TIM_Prescaler = 72– 1; 1.定时时间T = 1000 * 72 / 72000 000 = 1ms 2.TIM_Prescaler = 72 – 1; t = 72 / 72000 000 = 1us,即TIMx->CNT每1us加一次 3.TIM_Period = 1000;当TIMx->CNT计数值达到1000us(也就是一开始计算的定时时间 1ms),进入中断服务函数,msHcCount将自动加一 1.void TIM6_IRQHandler(void) //TIM3中断 2.{ 3.if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) //检查TIM3更新中断 发生与否 4. { 5. TIM_ClearITPendingBit(TIM6, TIM_IT_Update ); //清除TIMx更新 中断标志 6. msHcCount++; 7. } } 4.当定时器停止工作时,总的定时时间为t = msHcCount * 1000 + TIMx->CNT单位是us。

STM32F103的11个定时器详解

STM32F103系列的单片机一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1个系统嘀嗒定时器 出去看门狗定时器和系统滴答定时器的八个定时器列表; 8个定时器分成3个组; TIM1和TIM8是高级定时器 TIM2-TIM5是通用定时器 TIM6和TIM7是基本的定时器 这8个定时器都是16位的,它们的计数器的类型除了基本定时器TIM6和TIM7都支持向上,向下,向上/向下这3种计数模式 计数器三种计数模式 向上计数模式:从0开始,计到arr预设值,产生溢出事件,返回重新计时 向下计数模式:从arr预设值开始,计到0,产生溢出事件,返回重新计时 中央对齐模式:从0开始向上计数,计到arr产生溢出事件,然后向下计数,计数到1以后,又产生溢出,然后再从0开始向上计数。(此种技术方法也可叫向上/向下计数) 基本定时器(TIM6,TIM7)的主要功能: 只有最基本的定时功能,。基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动 通用定时器(TIM2~TIM5)的主要功能: 除了基本的定时器的功能外,还具有测量输入信号的脉冲长度( 输入捕获) 或者产生输出波形( 输出比较和PWM) 高级定时器(TIM1,TIM8)的主要功能: 高级定时器不但具有基本,通用定时器的所有的功能,还具有控制交直流电动机所有的功能,你比如它可以输出6路互补带死区的信号,刹车功能等等 通用定时器的时钟来源; a:内部时钟(CK_INT) b:外部时钟模式1:外部输入脚(TIx)

c:外部时钟模式2:外部触发输入(ETR) d:内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器 通用定时期内部时钟的产生: 从截图可以看到通用定时器(TIM2-7)的时钟不是直接来自APB1,而是通过APB1的预分频器以后才到达定时器模块。 当APB1的预分频器系数为1时,这个倍频器就不起作用了,定时器的时钟频率等于APB1的频率; 当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1时钟频率的两倍。 自动装在寄存器arr值的计算: Tout= ((arr+1)*(psc+1))/Tclk; Tclk:TIM3的输入时钟频率(单位为Mhz)。 Tout:TIM3溢出时间(单位为us)。 计时1S,输入时钟频率为72MHz,加入PSC预分频器的值为35999,那么: ((1+psc )/72M)*(1+arr )=((1+35999)/72M)*(1+arr)=1秒 则可计算得出自动窗装载寄存器arr=1999 通用定时器PWM工作原理 以PWM模式2,定时器3向上计数,有效电平是高电平,定时器3的第3个PWM通道为例: 定时器3的第3个PWM通道对应是PB0这引脚,三角顶点的值就是TIM3_ARR寄存器的值,上图这条红线的值就TIM3_CCR3 当定时器3的计数器(TIM3_CNT)刚开始计数的时候是小于捕获/比较寄存器(TIM3_CCR3)的值, 此时PB0输出低电平,随着计数器(TIM3_CNT)值慢慢的增加, 当计数器(TIM3_CNT)大于捕获/比较寄存器(TIM3_CCR3)的值时,这时PB0电平就会翻转,输出高电平,计数器(TIM3_CNT)的值继续增加, 当TIM3_CNT=TIM3_ARR的值时,TIM3_CNT重新回到0继续计数,PB0电平翻转,输出低电平,此时一个完整的PWM信号就诞生了。 PWM输出模式; STM32的PWM输出有两种模式: 模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。区别如下: 110:PWM模式1,在向上计数时,一旦TIMx_CNT 在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM模式2-在向上计数时,一旦TIMx_CNTTIMx_CCR1时通道1为有效电平,否则为无效电平。 由以上可知:

STM32系统systick定时器与延迟时间计算

STM32系统systick定时器与延迟时间计算 系统嘀嗒(SysTick)校准值寄存器 1.(SysTick) 系统嘀嗒时钟是由HCLK 分频出来的。HCLK=SYSCLK=72MHz /* Select HCLK/8 as SysTick clock source */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); 当系统嘀嗒时钟设定为9 兆赫 或是: SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); 当系统嘀嗒时钟设定为72 兆赫 2.系统嘀嗒校准值固定到9000,当系统嘀嗒时钟设定为9 兆赫,产生1ms 时基。/* SysTick interrupt each 9ms with counter clock equal to 1MHz */ SysTick_SetReload(9000); 该参数取值必须在1和0x00FFFFFF之间 3. 使能一下: /* Enable the SysTick Counter */ SysTick_CounterCmd(SysTick_Counter_Enable); /* Enable the SysTick Interrupt */ SysTick_ITConfig(ENABLE); 这还有另外一种设置方法: 经试验验证可行: //NVIC_InitTypeDef NVIC_InitStructure; /* Configure HCLK clock as SysTick clock source */ SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK); /* Configure the SysTick handler priority */ NVIC_SystemHandlerPriorityConfig(SystemHandler_SysTick, 2, 0); /* Configure one bit for preemption priority */ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); /* SysTick interrupt each 100 Hz with HCLK equal to 72MHz 每1ms发生一次SysTick中断*/ SysTick_SetReload(72000); /* Enable the SysTick Interrupt */ SysTick_ITConfig(ENABLE); /* Enable the SysTick Counter */ SysTick_CounterCmd(SysTick_Counter_Enable); 关键是:SysTick_CLKSourceConfig,和SysTick_SetReload

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); //打开中断溢出中断

STM32-基本定时器TIM6-TIM7基本定时功能

1. STM32的Timer简介 STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。其中系统嘀嗒定时器是前文中所描述的SysTick,看门狗定时器以后再详细研究。今天主要是研究剩下的8个定时器。 其中TIM1和TIM8是能够产生3对PWM互补输出的高级登时其,常用于三相电机的驱动,时钟由APB2的输出产生。TIM2-TIM5是普通定时器,TIM6和TIM7是基本定时器,其时钟由APB1输出产生。由于STM32的TIMER功能太复杂了,所以只能一点一点的学习。因此今天就从最简单的开始学习起,也就是TIM2-TIM5普通定时器的定时功能。 2基本定时器TIM6-TIM7 2.1 时钟基本特征 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。 它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC) 提供时钟。实际上,它 们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。 这2个定时器是互相独立的,不共享任何资源。 2.2 TIM6-7主要特征 TIM6和TIM7定时器的主要功能包括:

● 16位自动重装载累加计数器 ● 16位可编程( 可实时修改)预分频器,用于对输入的时钟按系数为1~65536 之间的任意数值 分频 ● 触发DAC的同步电路 ● 在更新事件(计数器溢出)时产生中断/DMA 请求 图144 基本定时器框图 2.3 计数器模式 TIM6-TIM7可以由向上计数。向上计数模式中,计数器从0计数到自动加载值(TIMx_ARR计数器内容),然后重新从0开始计数并且产生一个计数器溢出事件。 2.4 TIM6-TIM7基本定时器的寄存器 1.TIM6和TIM7控制寄存器1(TIMx_CR1)

关于stm32的定时器之计数器运用

关于stm32的定时器的运用 定时器是stm32的一大利器,现在的项目中可以说没有一个不会用到定时器的,所以掌握理解运用定时器才会做出好的产品来。 本章内容说一说关于stm32的定时器TIM_GetCounter(TIMx)的运用。之前的项目中曾经用这个来获取高低电平的时长,在超声波测距,红外遥控解码中运用过。Stm32的定时器除了1和8其他都是通用定时器。如何用这句函数来捕捉电平时长呢?首先看一下初始化内容,以TIM4为例 void Timer4_CFG() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO , ENABLE); GPIO_InitStructure.GPIO_Pin = IR_LED_PIN; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(IR_LED_PORT, &GPIO_InitStructure); TIM_TimeBaseStructure.TIM_Prescaler = 3599; //TIM_CKD_DIV1 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // TIM_TimeBaseStructure.TIM_Period = 200; // ARR TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //TIM_TimeBaseStructure.TIM_RepetitionCounter = 4; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //TIM_PrescalerConfig(TIM4,35,TIM_PSCReloadMode_Immediate);//36MHz/(3599 +1)=10 000 HZ 100uS TIM_ARRPreloadConfig(TIM4,DISABLE); TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE); TIM_ITConfig(TIM4,TIM_IT_Trigger,ENABLE); TIM_Cmd(TIM4, DISABLE); } APB1是36M时钟,经过分频后产生10KHZ 100us周期的波形。TIM->CNT这个

相关文档
最新文档