新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32 通用定時器的幾種配置方式

STM32 通用定時器的幾種配置方式

作者: 時間:2016-11-25 來源:網(wǎng)絡 收藏


static void Time_IN_PWM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

本文引用地址:http://butianyuan.cn/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_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
#endif
TIM_ICInitTypeDef TIM_ICInitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIMx,ENABLE); //開啟時鐘
TIM_DeInit(TIM2);
#if 0

TIM_TimeBaseInitStructure.TIM_Prescaler =(100-1); //時鐘分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_Period =(1000-1); //自動重裝寄存器 PWM頻率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計數(shù)模式
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); //配置參數(shù)
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輸入模式//參見函數(shù)體與參考手冊關(guān)于PWMI說明
TIM_PWMIConfig(TIMx,&TIM_ICInitStructure);

TIM_SelectInputTrigger(TIMx, TIM_TS_TI2FP2); //選擇TI2FP2作為TIMx輸入觸發(fā) 一個信號來之后 啟動定時器開始計數(shù)

TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_Reset); //選擇從模式控制器為復位模式,選中的TRGI上升沿重新初始化計數(shù)器
//從模式控制器連接到TI1FP1 TI2FP2 只要兩者有效為設置的電平,就會復位計數(shù)器 參見TIME結(jié)構(gòu)圖

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_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 =1; //時鐘分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_Period =65535; //自動重裝寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計數(shù)模式
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); //配置參數(shù)
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); //選擇單脈沖模式 這樣 下一次更新時間是停止計數(shù)器

TIM_SelectInputTrigger(TIMx, TIM_TS_TI2FP2); //選擇TI2FP2作為TIMx輸入觸發(fā) 一個信號來之后 啟動定時器開始計數(shù)

TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_Trigger); //選擇從模式控制器為觸發(fā)模式 其連接到了TI2FP2 讓從模式控制器啟動計數(shù)器


TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2; //輸出模式選擇為PWM模式2 用PWM2 向上計數(shù)時,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來觸發(fā)定時器,不需要軟件啟動定時器
}



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、定時器聯(lián)級

#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_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 =0; //時鐘分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_Period =99; //自動重裝寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計數(shù)模式
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); //配置參數(shù)
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 向上計數(shù)時,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的更新事件作為觸發(fā)輸出



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); //從模式的輸入觸發(fā)選擇為門控模式
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); //從模式觸發(fā)源選擇為內(nèi)部觸發(fā)1?????????????為什么是內(nèi)部觸發(fā)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(); //定時器配置
}

以上,結(jié)束。


上一頁 1 2 下一頁

關(guān)鍵詞: STM32通用定時器配置方

評論


技術(shù)專區(qū)

關(guān)閉