STM32 通用定时器的几种配置方式

//------------------------------------------------------------------------------
// 1、普通定时使用 #include"stm32f10x.h"
#include"time.h" static Time_NVIC_Config( void )
{
NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
} static void Time_Config( void )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE );
//TIM_DeInit(TIM2);
TIM_TimeBaseInitStructure.TIM_Prescaler = ( - ); //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period = ( - ); //自动重装寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = ; //时钟分割,这里不涉及
#if 0
TIM_TimeBaseInitStructure.TIM_RepetitionCounter;
//This parameter is valid only for TIM1 and TIM8
#endif
TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure ); //配置参数
TIM_ClearITPendingBit( TIMx, TIM_IT_Update ); //清除中断标示位
TIM_ITConfig( TIMx, TIM_IT_Update, ENABLE ); //中断配置
TIM_Cmd( TIMx, ENABLE ); //启动定时器
} void Time_Init( void )
{
Time_Config( ); //定时器配置
Time_NVIC_Config( ); //嵌套中断向量初始化
} //------------------------------------------------------------------------------
// 2、PWM输出 #include"stm32f10x.h"
#include"time.h" #if 1 static Time_NVIC_Config( void )
{
NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
}
#endif void Time_OUT_PWM_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推免式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
} static void Time_OUT_PWM_Config( void )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE ); //开启时钟
TIM_DeInit( TIM2 ); TIM_TimeBaseInitStructure.TIM_Prescaler = ( - ); //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period = ( - ); //自动重装寄存器 PWM频率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = ; //时钟分频,这里不涉及
#ifdef Time1
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif
TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure ); //配置参数
TIM_ClearITPendingBit( TIMx, TIM_IT_Update ); //清除中断标示位 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM1模式 OCx电平根据ARR与CCRx比较结果发生反转
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道1
#ifdef Time1
TIM_OCInitStructure.TIM_OutputNState =;
#endif
TIM_OCInitStructure.TIM_Pulse = CCR1_VAL; //占空比800/1000
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //计数器值小于CCR值时输出高电平
#ifdef Time1
TIM_OCInitStructure.TIM_OCNPolarity =;
TIM_OCInitStructure.TIM_OCIdleState =;
TIM_OCInitStructure.TIM_OCNIdleState =;
#endif TIM_OC1Init( TIMx, &TIM_OCInitStructure );
TIM_OC1PreloadConfig( TIMx, TIM_OCPreload_Enable ); //使能CCR1预装载 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道2
TIM_OCInitStructure.TIM_Pulse = CCR2_VAL; TIM_OC2Init( TIMx, &TIM_OCInitStructure );
TIM_OC2PreloadConfig( TIMx, TIM_OCPreload_Enable ); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道3
TIM_OCInitStructure.TIM_Pulse = CCR3_VAL;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC3Init( TIMx, &TIM_OCInitStructure );
TIM_OC3PreloadConfig( TIMx, TIM_OCPreload_Enable ); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道4
TIM_OCInitStructure.TIM_Pulse = CCR4_VAL; TIM_OC4Init( TIMx, &TIM_OCInitStructure );
TIM_OC4PreloadConfig( TIMx, TIM_OCPreload_Enable );
TIM_ARRPreloadConfig( TIMx, ENABLE ); //开启ARR预装载
TIM_Cmd( TIMx, ENABLE ); //启动定时器
} void Time_OUT_PWM_Init( void )
{
Time_OUT_PWM_GPIO_Config( );
Time_OUT_PWM_Config( ); //定时器配置
} //------------------------------------------------------------------------------
// 3、输出比较模式 #include"stm32f10x.h"
#include"time.h" static Time_NVIC_Config( void )
{
NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
} static void Time_OUT_PWM_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推免式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
} static void Time_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOD, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //通用推免式输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOD, &GPIO_InitStructure );
} static void Time_OUT_PWM_Config( void )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE ); //开启时钟
TIM_DeInit( TIM2 ); TIM_TimeBaseInitStructure.TIM_Prescaler = ( - ); //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period = ( - ); //自动重装寄存器 PWM频率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = ; //时钟分频,这里不涉及
#ifdef Time1
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif
TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure ); //配置参数
TIM_ClearITPendingBit( TIMx, TIM_IT_Update ); //清除中断标示位 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Inactive; //ARR与CCRx相同时强制OCxREF为低
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道1
#ifdef Time1
TIM_OCInitStructure.TIM_OutputNState =;
#endif
TIM_OCInitStructure.TIM_Pulse = CCR1_VAL;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OCx=!OCxREF _High OCx=OCxREF
#ifdef Time1
TIM_OCInitStructure.TIM_OCNPolarity =;
TIM_OCInitStructure.TIM_OCIdleState =;
TIM_OCInitStructure.TIM_OCNIdleState =;
#endif TIM_OC1Init( TIMx, &TIM_OCInitStructure );
TIM_OC1PreloadConfig( TIMx, TIM_OCPreload_Enable ); //使能CCR1预装载
TIM_ITConfig( TIMx, TIM_IT_CC1, ENABLE ); //使能OC1比较中断 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Active; //ARR与CCRx相同时强制OCxREF为高
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道2
TIM_OCInitStructure.TIM_Pulse = CCR2_VAL;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //OCx=!OCxREF _High OCx=OCxREF TIM_OC2Init( TIMx, &TIM_OCInitStructure );
TIM_OC2PreloadConfig( TIMx, TIM_OCPreload_Enable );
TIM_ITConfig( TIMx, TIM_IT_CC2, ENABLE ); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing; //ARR与CCRx比较结果对OCxREF无效
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道3
TIM_OCInitStructure.TIM_Pulse = CCR3_VAL;
TIM_ITConfig( TIMx, TIM_IT_CC3, ENABLE ); TIM_OC3Init( TIMx, &TIM_OCInitStructure );
TIM_OC3PreloadConfig( TIMx, TIM_OCPreload_Enable ); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //ARR与CCRx比较结果对OCxREF采用PWM1模式
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //输出使能通道4
TIM_OCInitStructure.TIM_Pulse = CCR4_VAL;
//TIM_ITConfig(TIMx,TIM_IT_CC4,ENABLE); //PWM就没有必要设置中断 当然也可以在中断里面改变占空比
TIM_OC4Init( TIMx, &TIM_OCInitStructure );
TIM_OC4PreloadConfig( TIMx, TIM_OCPreload_Enable );
TIM_ARRPreloadConfig( TIMx, ENABLE ); //开启ARR预装载
TIM_Cmd( TIMx, ENABLE ); //启动定时器
} void Time_OUT_PWM_Init( void )
{
Time_OUT_PWM_GPIO_Config( );
Time_GPIO_Config( );
Time_NVIC_Config( );
Time_OUT_PWM_Config( ); //定时器配置
} //------------------------------------------------------------------------------
// 4、PWMI模式
#include"stm32f10x.h"
#include"time.h" static Time_NVIC_Config( void )
{
NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
} static void Time_IN_PWM_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( TIMx_IN_GPIO_RCC, ENABLE );
GPIO_InitStructure.GPIO_Pin = TIMx_IN_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( TIMx_IN_Port, &GPIO_InitStructure );
} static void Time_IN_PWM_Config( void )
{
#if 0
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
#endif
TIM_ICInitTypeDef TIM_ICInitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE ); //开启时钟
TIM_DeInit( TIM2 );
#if 0 TIM_TimeBaseInitStructure.TIM_Prescaler =(-); //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period =(-);//自动重装寄存器 PWM频率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision =;//时钟分频,这里不涉及
#ifdef Time1
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif
TIM_TimeBaseInit(TIMx,&TIM_TimeBaseInitStructure); //配置参数
TIM_ClearITPendingBit(TIMx,TIM_IT_Update);//清除中断标示位
#endif TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿有效
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //TIM Input 1, 2, 3 or 4 is selected to be
// connected to IC1, IC2, IC3 or IC4, respectively */
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //无预分频
TIM_ICInitStructure.TIM_ICFilter = 0x0; //无滤波
TIM_ICInit( TIMx, &TIM_ICInitStructure ); //初始化PWM输入模式 //参见函数体与参考手册关于PWMI说明
TIM_PWMIConfig( TIMx, &TIM_ICInitStructure );
TIM_SelectInputTrigger( TIMx, TIM_TS_TI2FP2 ); //选择TI2FP2作为TIMx输入触发 一个信号来之后 启动定时器开始计数 TIM_SelectSlaveMode( TIMx, TIM_SlaveMode_Reset ); //选择从模式控制器为复位模式,选中的TRGI上升沿重新初始化计数器
//从模式控制器连接到TI1FP1 TI2FP2 只要两者有效为设置的电平,就会复位计数器 参见TIME结构图 TIM_SelectMasterSlaveMode( TIMx, TIM_MasterSlaveMode_Enable ); //使能主从模式 ?????????????????? TIM_Cmd( TIMx, ENABLE ); TIM_ITConfig( TIMx, TIM_IT_CC2, ENABLE );
} void Time_IN_PWM_Init( void )
{
Time_IN_PWM_GPIO_Config( );
Time_NVIC_Config( );
Time_IN_PWM_Config( ); //定时器配置
} //------------------------------------------------------------------------------
// 5、单脉冲模式 #include"stm32f10x.h"
#include"time.h" static Time_NVIC_Config( void )
{
NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
NVIC_InitStructure.NVIC_IRQChannel = TIMx_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
} static Time_SinglePluse_IN_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( TIMx_IN_GPIO_RCC, ENABLE );
GPIO_InitStructure.GPIO_Pin = TIMx_IN_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( TIMx_IN_Port, &GPIO_InitStructure );
} static Time_SinglePluse_OUT_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( TIMx_OUT_GPIO_RCC, ENABLE );
GPIO_InitStructure.GPIO_Pin = TIMx_OUT_Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推免复用输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( TIMx_OUT_Port, &GPIO_InitStructure );
} static void Time_SinglePluse_Config( void )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIMx, ENABLE ); //开启时钟
TIM_DeInit( TIM2 ); TIM_TimeBaseInitStructure.TIM_Prescaler = ; //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period = ; //自动重装寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = ; //时钟分频,这里不涉及
#ifdef Time1
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif
TIM_TimeBaseInit( TIMx, &TIM_TimeBaseInitStructure ); //配置参数
TIM_ClearITPendingBit( TIMx, TIM_IT_Update ); //清除中断标示位 TIM_ICStructInit( &TIM_ICInitStructure ); TIM_ICInitStructure.TIM_Channel = TIM_Channel_2; //通道2为输入
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; //上升沿有效
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; //TIM Input 1, 2, 3 or 4 is selected to be
// connected to IC1, IC2, IC3 or IC4, respectively*/
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; //无预分频
TIM_ICInitStructure.TIM_ICFilter = 0x0; //无滤波
TIM_ICInit( TIMx, &TIM_ICInitStructure ); //初始化输入模式
TIM_SelectOnePulseMode( TIMx, TIM_OPMode_Single ); //选择单脉冲模式 这样 下一次更新时间是停止计数器
TIM_SelectInputTrigger( TIMx, TIM_TS_TI2FP2 ); //选择TI2FP2作为TIMx输入触发 一个信号来之后 启动定时器开始计数
TIM_SelectSlaveMode( TIMx, TIM_SlaveMode_Trigger ); //选择从模式控制器为触发模式 其连接到了TI2FP2 让从模式控制器启动计数器 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //输出模式选择为PWM模式2 用PWM2 向上计数时,CNT
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能通道
#ifdef Time1
TIM_OCInitStructure.TIM_OutputNState =;
#endif
TIM_OCInitStructure.TIM_Pulse = ; //CCRx里面存放的值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OCREF与OC实际输出相同
#ifdef Time1
TIM_OCInitStructure.TIM_OCNPolarity =;
TIM_OCInitStructure.TIM_OCIdleState =;
TIM_OCInitStructure.TIM_OCNIdleState =;
#endif
TIM_OC1Init( TIMx, &TIM_OCInitStructure ); //使用通道1作为单脉冲的输出通道 //TIM_Cmd(TIMx, ENABLE); //使用TI2FP1来触发定时器,不需要软件启动定时器
} void Time_SinglePluse_Init( void )
{
Time_SinglePluse_IN_GPIO_Config( ); //配置time2的通道2为输入
Time_SinglePluse_OUT_GPIO_Config( ); //配置time2的通道1为输出
Time_NVIC_Config( ); //可以不用
Time_SinglePluse_Config( ); //定时器配置
} //------------------------------------------------------------------------------
// 6、定时器联级 #include"stm32f10x.h"
#include"time.h" static Time_NVIC_Config( void )
{
NVIC_InitTypeDef NVIC_InitStructure; NVIC_SetVectorTable( NVIC_VectTab_FLASH, 0x0000 );
NVIC_PriorityGroupConfig( NVIC_PriorityGroup_1 );
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = ;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = ;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init( &NVIC_InitStructure );
} static Time_Connect_GPIO_Config( void )
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_6; //time2 ch1 pin.0 time3 cha1 pin.6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推免复用输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init( GPIOA, &GPIO_InitStructure );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6; //time4 ch1 pin.6
GPIO_Init( GPIOB, &GPIO_InitStructure );
} static void Time_Connect_Config( void )
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(
RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3 | RCC_APB1Periph_TIM4, ENABLE );
TIM_DeInit( TIM2 );
TIM_DeInit( TIM3 );
TIM_DeInit( TIM4 ); TIM_TimeBaseInitStructure.TIM_Prescaler = ; //时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period = ; //自动重装寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision = ; //时钟分频,这里不涉及
#ifdef Time1 //或者Time8
TIM_TimeBaseInitStructure.TIM_RepetitionCounter; //This parameter is valid only for TIM1 and TIM8
#endif
TIM_TimeBaseInit( TIM2, &TIM_TimeBaseInitStructure ); //配置参数
TIM_ClearITPendingBit( TIM2, TIM_IT_Update ); //清除中断标示位 TIM_TimeBaseInitStructure.TIM_Period = ;
TIM_TimeBaseInit( TIM3, &TIM_TimeBaseInitStructure );
TIM_ClearITPendingBit( TIM3, TIM_IT_Update ); TIM_TimeBaseInitStructure.TIM_Period = ;
TIM_TimeBaseInit( TIM4, &TIM_TimeBaseInitStructure );
TIM_ClearITPendingBit( TIM4, TIM_IT_Update ); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //输出模式选择为PWM模式2 用PWM2 向上计数时,CNT
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //使能通道
TIM_OCInitStructure.TIM_Pulse = ; //CCRx里面存放的值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OCREF与OC实际输出相同
TIM_OC1Init( TIM2, &TIM_OCInitStructure ); //使用通道1作为单脉冲的输出通道
TIM_SelectMasterSlaveMode( TIM2, TIM_MasterSlaveMode_Enable ); //使能主从模式 TIM_SelectOutputTrigger( TIM2, TIM_TRGOSource_Update ); //选择Time2的更新事件作为触发输出 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Pulse = ; TIM_OC1Init( TIM3, &TIM_OCInitStructure );
TIM_OC1Init( TIM4, &TIM_OCInitStructure ); TIM_SelectSlaveMode( TIM3, TIM_SlaveMode_Gated ); //从模式的输入触发选择为门控模式
TIM_SelectInputTrigger( TIM3, TIM_TS_ITR1 ); //从模式触发源选择为内部触发1?????????????为什么是内部触发1 不是0 2 3
//原因:ITR0 ITR1 ITR2 ITR3 对应主模式的TIM2 TIM3 TIM4 TIM5 TIM_SelectSlaveMode( TIM4, TIM_SlaveMode_Gated );
TIM_SelectInputTrigger( TIM4, TIM_TS_ITR1 ); TIM_Cmd( TIM2, ENABLE );
TIM_Cmd( TIM3, ENABLE );
TIM_Cmd( TIM4, ENABLE );
} void Time_Connect_Init( void )
{
Time_Connect_GPIO_Config( );
Time_NVIC_Config( ); //可以不用
Time_Connect_Config( ); //定时器配置
}

STM32 通用定时器的几种配置方式的更多相关文章

  1. STM32通用定时器配置

    一.STM32通用定时器原理 STM32 系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生.其它6个 ...

  2. STM32通用定时器(转载)

    STM32的定时器功能很强大,学习起来也很费劲儿. 其实手册讲的还是挺全面的,只是无奈TIMER的功能太复杂,所以显得手册很难懂,我就是通过这样看手册:while(!SUCCESS){看手册-}才搞明 ...

  3. 使用java配置定时任务的几种配置方式及示例

    Spring定时器,主要有两种实现方式,包括Java Timer定时和Quartz定时器! 1.Java Timer定时 首先继承java.util.TimerTask类实现run方法 package ...

  4. IIS下PHP的三种配置方式比较

    在Windows IIS 6.0下配置PHP,通常有CGI.ISAPI和FastCGI三种配置方式,这三种模式都可以在IIS 6.0下成功运行,下面我就讲一下这三种方式配置的区别和性能上的差异. 1. ...

  5. STM32通用定时器原理

    /************************************************************************************************ 转载 ...

  6. STM32——通用定时器基本定时功能

    STM32——————通用定时器基本定时功能                                                                           1.  ...

  7. c3p0三种配置方式(automaticTestTable)

    c3p0的配置方式分为三种,分别是http://my.oschina.net/lyzg/blog/551331.setters一个个地设置各个配置项2.类路径下提供一个c3p0.properties文 ...

  8. tomcat下jndi的三种配置方式

    jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...

  9. 关于nginx upstream的几种配置方式

    平时一直依赖硬件来作load blance,最近研究Nginx来做负载设备,记录下upstream的几种配置方式. 第一种:轮询 upstream test{     server 192.168.0 ...

随机推荐

  1. 第5月第21天 bugly ios证书位置

    1.bugly 一. 本地测试 补丁编写规则参见: JSPatch 将补丁文件main.js拖拽到工程内: 开启 BuglyConfig 中的热更新本地调试模式: BuglyConfig *confi ...

  2. Java与.NET的WebServices相互调用

    一:简介 本文介绍了Java与.NET开发的Web Services相互调用的技术.本文包括两个部分,第一部分介绍了如何用.NET做客户端调用Java写的Web Services,第二部分介绍了如何用 ...

  3. 为什么要使用断路器Hystrix?

    为什么需要 Hystrix? 在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用(RPC).为了保证其高可用,单个服务又必须集群部署.由于网络原因或者自身的原因,服务并不能保证服 ...

  4. XShell 使用方法

    XShell是一款Windows下非常优秀的远程连接Linux主机的工具,是平常使用不可缺少的工具.复制和粘贴由于在linux的Shell下,Ctrl+c是中断当前指令,这个快捷键和win系统下的复制 ...

  5. nginx开启gzip压缩前端css,js

    利用nginx实现前后端分离, nginx配置文件,nginx.conf配置采用gzip压缩: 在server中添加: gzip on; #开启gzip gzip_min_length 1k; #低于 ...

  6. laravel队列,事件简单使用方法

    A.队列的使用 1.队列配置文件存储在 config/queue.php 根据自己的情况进行配置 2..env文件 QUEUE_DRIVER=database(根据个人情况配置,redis等) 3.创 ...

  7. kgtemp文件转mp3工具

    kgtemp文件是酷我音乐软件的缓存文件,本文从技术层面探讨如何解密该文件为mp3文件,并通过读取ID3信息来重命名. kgtemp解密 kgtemp文件前1024个字节是固定的包头信息,解密方案详细 ...

  8. CSS------Filter属性的使用方法

    转载: http://www.w3cplus.com/css3/ten-effects-with-css3-filter

  9. HDU4632 Poj2955 括号匹配 整数划分 P1880 [NOI1995]石子合并 区间DP总结

    题意:给定一个字符串 输出回文子序列的个数    一个字符也算一个回文 很明显的区间dp  就是要往区间小的压缩! #include<bits/stdc++.h> using namesp ...

  10. 【Java】 大话数据结构(8) 串的模式匹配算法(朴素、KMP、改进算法)

    本文根据<大话数据结构>一书,实现了Java版的串的朴素模式匹配算法.KMP模式匹配算法.KMP模式匹配算法的改进算法. 1.朴素的模式匹配算法 为主串和子串分别定义指针i,j. (1)当 ...