无疑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;