您的位置 首页 元件

STM32学习笔记time定时器

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

STM32的守时器是个强壮的模块,守时器运用的频率也是很高的,守时器能够做一些根本的守时,还能够做PWM输出或许输入捕获功用。从体系结构图下看,名为TIMx的有八个,其间TIM1和TIM8挂在APB2总线上,而TIM2-TIM7则挂在APB1总线上。其间TIM1&TIM8称为府第操控守时器(advancedcontroltimer).他们地点的APB2总线也比APB1总线要好。APB2能够作业在72MHz下,而APB1最大是36MHz。

由上图可知,当APB1的预分频系数为1 时,这个倍频器不起作用,守时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8 或16)时,这个倍频器起作用,守时器的时钟频率等于APB1的频率两倍。也便是,当APB1不分频,TIM3的时钟速度为36MHz,当2分频是,APB1变成18MHz,可是TIM又会倍频,即TIM时钟等于18*2=36MHz。这儿咱们用向上计数的方法,即TIMx_CNT中的计数值到达TIMx_ARR中的值时,发生中止,TIMx_CNT又从0开端计。

无疑STM32的守时器是杂乱的,主要有守时,捕获,PWM发生功用。我花了点时刻看通用守时器2,3,4的框图,tim1则在通用守时器的基础上多加了些功用,称为府第守时器。
////////////////////////////////////////////////////////////////////////////////
依据程序来剖析:
/////////////守时器2装备500ms///////////////////////////////////////////////////////
TIM_DeInit(TIM2);//TIM2,3,4:SystemClk=APB1(Max36Mhz)
RCC->APB1ENR |= RCC_APB1ENR_TIM2EN; //使能TIM2的时钟
//////////守时器2装备///////////////////////////////
//方案:PSC = 349 则 CK_CNT = 36Mhz/(349+1) =>10us
// ARR = 50 000 1us * 50 000 =50ms
m_TIM_TimeBaseInitTypeDef.TIM_Prescaler = 349; //预分频 PSC(0-65535)
m_TIM_TimeBaseInitTypeDef.TIM_CounterMode = TIM_CounterMode_Up; //计数模
m_TIM_TimeBaseInitTypeDef.TIM_Period = 50000; //主动重载 ARR(0-65535)
m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1; //时钟分频因子1,2,4
m_TIM_TimeBaseInitTypeDef.TIM_RepetitionCounter = 0;//循环计数次数(仅仅TIM1,8有)
TIM_TimeBaseInit(TIM2,&m_TIM_TimeBaseInitTypeDef);
////////////////////////////////////////////////////
//使能装备中止=>:使能更新事情中止
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//Enables or disables the specified TIM interrupts.
//留意TIM_UpdateDisableConfig 用DISABLE函数处才将对应为清零而到达使能(UDIS=0:使能更新事情)
TIM_UpdateDisableConfig(TIM2,DISABLE);//Enables or Disables the TIMx Update event.
NV%&&&&&%->ISER[0] |= (1 << (TIM2_IRQChannel & 0x1F)); // enable interrupt
//开端计数
TIM_Cmd(TIM2,ENABLE);//Enables or disables the specified TIM peripheral.
首要在在守时功用上和传统的51,avr比,多了些功用,其他的相同。其输入时钟源为APB1/2,同等51,avr的体系时钟。忘了51,至少avr有时钟分频功用,stm32也有在函数装备中TIM_ClockDivision = TIM_CKD_DIV1; //(时钟分频因子1,2,4)在时钟输入上,时钟多了个挑选TIM_Prescaler(预分频),这个的参加灵敏性加大,它能够是0-65535的恣意值,则预传统的只能几个挑选则表现了装备的灵敏和有用。
//m_TIM_TimeBaseInitTypeDef.TIM_Prescaler = 349;
//m_TIM_TimeBaseInitTypeDef.TIM_ClockDivision = TIM_CKD_DIV1;

再说:51,avr的计数器初值,也是决议守时巨细的一个要素。详细完成:便是计数器计数自减或许增加到某个值,发生溢出中止,在自加的时分是从初值加到满值 溢出。自减时,是从初值减到0溢出,发生中止,在每次守时结束的守时器溢出后,其初值需要在中止函数中从头赋值给计数器。
在stm32中也是有个相同的功用,可是这儿是不同的。在自加的时分,从0开端,直到寄存器TIMx_ARR值巨细发生溢出中止,自减是从TIMx_ARR值巨细开端主动减直到0溢出,不通点1。在进入中止后,中止函数一个更新事情,这个更新事情将主动重载TIMx_ARR到计数器,这一点与51中的主动重载相似.
//m_TIM_TimeBaseInitTypeDef.TIM_Period = 50000;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/xinpin/yuanjian/265827.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部