一、简介:
不同的STM32系列有不同数量的定时器,针对现在学习的STM32F40x系列总共有14个定时器,针对这14个定时器能够将其分为3类,府第定时器、通用定时器和根本定时器,三种定时器迥然不同,下边会针对通用定时器来介绍定时器的原理和使用。关于通用定时器依据位数和计数方法的不同又能够分为3类,相关分类的图表如下:
二、使用:
1、更新:计数器的上溢或下溢。2、事情触发。3、输入捕获。4、输出比较。5、支撑针对定位的增量编码和霍尔传感器电路。5、触发输入作为外部时钟或按周期电源办理。下边会针对部分使用做相关介绍和代码剖析。
三、框图:
下图是通用定时器TIM2~TIM5的框图,其他定时器的框图和该框图是相似的,只不过是在该框图的基础上做相应的裁剪做出小的变化。
下边对定时器的框图做相关拆解,并对各个部分做相关剖析。
四、时钟挑选及分频:
这部分的功用由框图的如下图部分发生:
由图中能够发现时钟来历有:1、内部时钟(CK_INT)。2、外部时钟形式1;外部引脚TIx,由输入捕获部分发生。3、外部时钟形式2;外部触发输入ETR。4、内部触发输入ITRx,该时钟是由另一个定时器输出发生的,对应到框图中的TRGO。通过相应的挑选后发生时钟CK_PSC。
这部分一起会在相关寄存器设定计时器的计数模式、复位和使能等相关操作。
五、时基单元
时基单元框图如下:
其间包含:1、PSC预分频器;担任对挑选的时钟CK_PSC分频,发生终究计数器用到的时钟CK_CNT。2、CNT计数器:担任计数,做为定时器的中心单元。3、主动重载寄存器:担任在相关事情触发后,将寄存器中的值装载到计时器中。
六、输入捕获
对输入捕获功用的根本描绘便是;通过检测TIM_CHx上的边缘信号,在信号跳变时,将当时计数器的值存放到相应的捕获/比较寄存器中。该功用部分在框图中如下图所示:
其实这是定时器的4个相关通道,拿出其间一个做相关剖析,其间一个通道的框图如下:
TI1为通道输入信号,通过滤波后发生TI1F,再通过边缘检测(上升沿或下降沿),再通过相关挑选后发生的信号通过分频器分频后发生最终需求捕获的信号。
关于输入捕获相关库函数介绍如下;
void TIM_ICInit(TIM_TypeDef* TIMx,TIM_ICInitTypeDef* TIM_ICInitStruct); //设置通道的相关参数。void TIM_OCxPolarityConfig(TIM_TpeDef* TIMx,uint16_t TIM_OCPolarity); //通道极性设置。uint32_t TIM_GetCapturex(TIM_TypeDef* TIMx); //获取通道捕获值。
七、输出比较
对输出比较功用的描绘:在CCRx寄存器中设定相应的值,计数器中的值与该值做比较,依据比较成果和相应的极性和有效性设定,确认输出电压的凹凸电平状况。和输入捕获相同,拿出其间一个通道进行剖析,其间一个通道的框图如下:
通道信号通过输出形式控制器,做出形式、极性以及开关等设置后取得需求的输出信号。CCRx:捕获比较寄存器,用于设定比较值。CCMRx:设置PWM的形式。CCER:CC1P位设置极性有效性。CCER:CC1E位输出使能设定。
对输出比较相关库函数介绍如下:
void TIM_OCxInit(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct) //设置相关通道的参数。void TIM_SetComparex(TIM_TypeDef* TIMx, uint32_t Comparex); //设置比较值。
TIM_OCxPreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload); //使能输出比较预装载。
TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, ENABLE);//使能主动重装载预装载寄存器
八、相关初始化实例——输入捕获
//定时器5通道1输入捕获装备//arr:主动重装值(TIM2,TIM5是32位的!!)//psc:时钟预分频数void TIM5_CH1_Cap_Init(u32 arr,u16 psc){GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE); //TIM5时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //使能PORTA时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //GPIOA0GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功用GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN; //下拉GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA0GPIO_PinAFConfig(GPIOA,GPIO_PinSource0,GPIO_AF_TIM5); //PA0复用位定时器5TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数形式TIM_TimeBaseStructure.TIM_Period=arr; //主动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化TIM5输入捕获参数TIM5_ICInitStructure.TIM_Channel = TIM_Channel_1; //CC1S=01 挑选输入端 IC1映射到TI1上TIM5_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿捕获TIM5_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //映射到TI1上TIM5_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //装备输入分频,不分频 TIM5_ICInitStructure.TIM_ICFilter = 0x00;//IC1F=0000 装备输入滤波器 不滤波TIM_ICInit(TIM5, &TIM5_ICInitStructure);TIM_ITConfig(TIM5,TIM_IT_Update|TIM_IT_CC1,ENABLE);//答应更新中止 ,答应CC1IE捕获中止 TIM_Cmd(TIM5,ENABLE ); //使能定时器5NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority =0; //子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能NVIC_Init(&NVIC_InitStructure); //依据指定的参数初始化VIC寄存器、 }
九、相关初始化实例——PWM输出
//TIM14 PWM部分初始化 //PWM输出初始化//arr:主动重装值//psc:时钟预分频数void TIM14_PWM_Init(u32 arr,u32 psc){ //此部分需手动修正IO口设置GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟 GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功用GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHzGPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数形式TIM_TimeBaseStructure.TIM_Period=arr; //主动重装载值TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14//初始化TIM14 Channel1 PWM形式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //挑选定时器形式:TIM脉冲宽度调制形式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低TIM_OC1Init(TIM14, &TIM_OCInitStructure); //依据T指定的参数初始化外设TIM1 4OC1TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 TIM_Cmd(TIM14, ENABLE); //使能TIM14 }