新闻中心

EEPW首页>嵌入式系统>设计应用> STM32 学习笔记_TIME定时器详解2

STM32 学习笔记_TIME定时器详解2

作者: 时间:2016-11-26 来源:网络 收藏

本文引用地址://m.amcfsurvey.com/article/201611/321890.htm

实验7

TIMER-6:PWM输入

现象:由TIMER3输出通道1产生一路周期2秒占空比50%的PWM波,飞线到TIMER4的输入通道1,有TIMER4来测量该PWM得周期和占空比。

在做实验之前引入三种从模式控制:复位、触发、门控。通过SMCR选择后可以进入这三种从模式

SMCR

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

ETP

ECE

ETPS[1:0]

ETF[3:0]

MSM

TS[2:0]

SMS[2:0]

SMS: 100 101 110

复位 门控 触发

所谓从模式简单理解就是受控于别人了,包括何时启动、何时停止、何时复位。相关作用请看手册。提示一点就是进入这三种模式后时钟是谁的问题?肯定不是外部时钟1了,可以是内部时钟和外部时钟2.

接着看实验,PWM方式的原理是这样的,如前文提到过输入时可以把T1映射到CC1上去同时映射到CC2上,将CC1和CC2的捕获边沿搞成相反的,比如CC1捕获T1上升沿,CC2捕获T1下降沿,还要再设置T1为复位从模式,上升沿有效,这样T1上升沿后计数器开始计数。下降沿CC2捕获发生,此为PWM占空比,在来一个上升沿,CC1捕获发生此为PWM周期。注意CC1捕获的第一次无效。

这是从模式跟输入捕获的一种组合使用,从模式还可以跟输出比较组合使用。比如手册上的单脉冲实验。

接着做4个实验跟定时器的级联和定时器同步有关系,在实验前先得说说主模式的问题。在CR2寄存器中的MMS位决定了定时器的主模式方式,即决定TRGO.几种方式可以参看手册。要说明一点就是一个定期器既可以是主模式同时它也是从模式,这就好像你是一个中层干部一样,既可以领导别人同时又被别人领导,这个不冲突的。

简单介绍下4个实验。

实验8

TIMER-8:TIMER2作为TIMER3的分频器.

现象:LED以10秒周期闪烁。

TIMER3配置为PWM输出,但是始终有TIMER2的溢出时间频率来提供,其溢出频率为100Hz所以TIMER3 PWM的周期为10S.

实验9

TIMER-9:TIMER2来使能TIMER3.

现象:LD1前15秒以1秒的周期闪烁,后15秒熄掉,然后下个15秒再闪烁如此循环。

在这个实验里TIEMR3输出一个周期1秒的PWM波,仍然驱动LD1闪烁。同时从模式配成门控模式,TIEMR2将OC1作为TRGO,OC1是一个周期30S占空比50%的PWM波。

实验10

TIMER-10:IMER2启动TIMER3

现象:上电后延迟15秒LD1以1秒的周期闪烁。

此实验跟上个实验配置差不多只要把TIMER3有门控改为触发方式即可。

实验11

TIMER-11:TIMER4的通道1同时出发TIMER4和TIMER3两个定时器

现象:按下JOYSTICK 的“选择”键同时出发两个定时器开始。同时TIMER3驱动LD1以1秒周期闪烁。

以上4个实验实际上是主模式和从模式的组合以及主模式和外部时钟1的组合。其实根据自己的需要还可以做出多种组合,这就是STM32定时器强大的地方。

最后多熟悉下库函数,关于TIM的库(2.0版本),本人认为有两点错误:

1、 TIM.C中CR1_CounterMode_Mask 的值为0x039F应该改为0x038F这样才能覆盖CR1的DIR位。2、 TIM.C中TIM_PrescalerConfig函数原文if (TIM_PSCReloadMode == TIM_PSCReloadMode_Immediate){TIMx->EGR |= TIM_EventSource_Update;}else{TIMx->EGR &= TIM_EventSource_Update;}
红色的这句好像不对吧?应该TIMx->EGR &=~ TIM_EventSource_Update;才对吧。

stm32通用定时器

STM32的定时器是个强大的模块,定时器使用的频率也是很高的,定时器可以做一些基本的定时,还可以做PWM输出或者输入捕获功能。

时钟源问题:

名为TIMx的有八个,其中TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在

APB1总线上。其中TIM1&TIM8称为高级控制定时器(advanced control timer).他们所在的APB2总线也比APB1总线要好。APB2可以工作在72MHz下,而APB1最大是36MHz。

定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器。

下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

假定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的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

TIM通用定时器配置步骤:

1.配置TIM时钟  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);2.定时器基本配置void TIM2_Configuration(void){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;// TIM_OCInitTypeDef TIM_OCInitStructure ;TIM_DeInit(TIM2); //复位TIM2定时器TIM_TimeBaseStructure.TIM_Period = 5; // 2.5ms TIM_TimeBaseStructure.TIM_Prescaler = 36000; // 分频36000 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数方向向上计数TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);TIM_ClearFlag(TIM2, TIM_FLAG_Update);TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); TIM_Cmd(TIM2, ENABLE); }TIM_Period设置了在下一个更新事件装入活动的自动重装载寄存器周期的值。它的取值必须在0x0000和0xFFFF之间。TIM_Prescaler设置了用来作为TIMx时钟频率除数的预分频值。它的取值必须在0x0000和0xFFFF之间。TIM_ClockDivision的作用是做一段延时,一般在特殊场合的时候会用到,可不关心。TIM_CounterMode选择了计数器模式。    TIM_CounterMode_Up    TIM向上计数模式    TIM_CounterMode_Down    TIM向下计数模式    TIM_CounterMode_CenterAligned1 TIM中央对齐模式1计数模式    TIM_CounterMode_CenterAligned2 TIM中央对齐模式2计数模式    TIM_CounterMode_CenterAligned3 TIM中央对齐模式3计数模式单片机时钟频率72MHz,APB1 二分频36MHz,故TIM2自动2倍频至72MHz,故定时器中断频率为72000000/36000/5=400Hz3.使能定时器中断TIM_Cmd(TIM2, ENABLE);4.配置NVIC。NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);5.写中断函数void TIM2_IRQHandler(void){......//中断处理}

上一页 1 2 下一页

评论


技术专区

关闭