新闻中心

EEPW首页>嵌入式系统>设计应用> STM32 通用定时器的几种配置方式

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

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


static void Time_IN_PWM_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_InitStructure;

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

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_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;
#endif
TIM_ICInitTypeDefTIM_ICInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);//开启时钟
TIM_DeInit(TIM2);
#if 0

TIM_TimeBaseInitStructure.TIM_Prescaler=(100-1);//时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period=(1000-1);//自动重装寄存器PWM频率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//时钟分频,这里不涉及
#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 = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);
}



static Time_SinglePluse_IN_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_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_InitTypeDefGPIO_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_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;
TIM_ICInitTypeDefTIM_ICInitStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE);//开启时钟
TIM_DeInit(TIM2);


TIM_TimeBaseInitStructure.TIM_Prescaler=1;//时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period=65535;//自动重装寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//时钟分频,这里不涉及
#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=12345;//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 = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);
}



static Time_Connect_GPIO_Config(void)
{
GPIO_InitTypeDefGPIO_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_TimeBaseInitTypeDefTIM_TimeBaseInitStructure;
TIM_OCInitTypeDefTIM_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=0;//时钟分频系数
TIM_TimeBaseInitStructure.TIM_Period=99;//自动重装寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//时钟分频,这里不涉及
#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=5;
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
TIM_ClearITPendingBit(TIM3,TIM_IT_Update);


TIM_TimeBaseInitStructure.TIM_Period=5;
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=49;//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 = 3;

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();//定时器配置
}

以上,结束。


上一页 1 2 下一页

评论


技术专区

关闭