新聞中心

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

STM32 通用定時(shí)器的幾種配置方式

作者: 時(shí)間:2016-11-25 來(lái)源:網(wǎng)絡(luò) 收藏


static void Time_IN_PWM_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

本文引用地址:http://m.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); //開(kāi)啟時(shí)鐘
TIM_DeInit(TIM2);
#if 0

TIM_TimeBaseInitStructure.TIM_Prescaler =(100-1); //時(shí)鐘分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_Period =(1000-1); //自動(dòng)重裝寄存器 PWM頻率:72M/100/1000=720Hz
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimeBaseInitStructure.TIM_ClockDivision =0; //時(shí)鐘分頻,這里不涉及
#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); //清除中斷標(biāo)示位
#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; //無(wú)預(yù)分頻
TIM_ICInitStructure.TIM_ICFilter =0x0; //無(wú)濾波

TIM_ICInit(TIMx,&TIM_ICInitStructure); //初始化PWM輸入模式//參見(jiàn)函數(shù)體與參考手冊(cè)關(guān)于PWMI說(shuō)明
TIM_PWMIConfig(TIMx,&TIM_ICInitStructure);

TIM_SelectInputTrigger(TIMx, TIM_TS_TI2FP2); //選擇TI2FP2作為T(mén)IMx輸入觸發(fā) 一個(gè)信號(hào)來(lái)之后 啟動(dòng)定時(shí)器開(kāi)始計(jì)數(shù)

TIM_SelectSlaveMode(TIMx, TIM_SlaveMode_Reset); //選擇從模式控制器為復(fù)位模式,選中的TRGI上升沿重新初始化計(jì)數(shù)器
//從模式控制器連接到TI1FP1 TI2FP2 只要兩者有效為設(shè)置的電平,就會(huì)復(fù)位計(jì)數(shù)器 參見(jiàn)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(); //定時(shí)器配置
}

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; //推免復(fù)用輸出
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); //開(kāi)啟時(shí)鐘
TIM_DeInit(TIM2);


TIM_TimeBaseInitStructure.TIM_Prescaler =1; //時(shí)鐘分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_Period =65535; //自動(dòng)重裝寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimeBaseInitStructure.TIM_ClockDivision =0; //時(shí)鐘分頻,這里不涉及
#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); //清除中斷標(biāo)示位


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; //無(wú)預(yù)分頻
TIM_ICInitStructure.TIM_ICFilter =0x0; //無(wú)濾波

TIM_ICInit(TIMx,&TIM_ICInitStructure); //初始化輸入模式

TIM_SelectOnePulseMode(TIMx,TIM_OPMode_Single); //選擇單脈沖模式 這樣 下一次更新時(shí)間是停止計(jì)數(shù)器

TIM_SelectInputTrigger(TIMx, TIM_TS_TI2FP2); //選擇TI2FP2作為T(mén)IMx輸入觸發(fā) 一個(gè)信號(hào)來(lái)之后 啟動(dòng)定時(shí)器開(kāi)始計(jì)數(shù)

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


TIM_OCInitStructure.TIM_OCMode =TIM_OCMode_PWM2; //輸出模式選擇為PWM模式2 用PWM2 向上計(jì)數(shù)時(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實(shí)際輸出相同

#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來(lái)觸發(fā)定時(shí)器,不需要軟件啟動(dòng)定時(shí)器
}



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

6、定時(shí)器聯(lián)級(jí)

#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; //推免復(fù)用輸出
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í)鐘分頻系數(shù)
TIM_TimeBaseInitStructure.TIM_Period =99; //自動(dòng)重裝寄存器
TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計(jì)數(shù)模式
TIM_TimeBaseInitStructure.TIM_ClockDivision =0; //時(shí)鐘分頻,這里不涉及
#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); //清除中斷標(biāo)示位


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 向上計(jì)數(shù)時(shí),CNT
TIM_OCInitStructure.TIM_OutputState =TIM_OutputState_Enable;//使能通道
TIM_OCInitStructure.TIM_Pulse =49; //CCRx里面存放的值
TIM_OCInitStructure.TIM_OCPolarity =TIM_OCPolarity_High; //OCREF與OC實(shí)際輸出相同

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ā)選擇為門(mén)控模式
TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1); //從模式觸發(fā)源選擇為內(nèi)部觸發(fā)1?????????????為什么是內(nèi)部觸發(fā)1 不是0 2 3
//原因:ITR0 ITR1 ITR2 ITR3 對(duì)應(yīng)主模式的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(); //定時(shí)器配置
}

以上,結(jié)束。


上一頁(yè) 1 2 下一頁(yè)

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉