新聞中心

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

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

        作者: 時間:2016-11-25 來源:網絡 收藏


        static void Time_IN_PWM_GPIO_Config(void)
        {
        GPIO_InitTypeDef GPIO_InitStructure;

        本文引用地址:http://www.104case.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_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); //時鐘分頻系數
        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_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; //時鐘分頻系數
        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_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; //時鐘分頻系數
        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 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 兰州市| 克什克腾旗| 沂源县| 故城县| 凌云县| 湖口县| 凤凰县| 黔东| 顺平县| 招远市| 咸阳市| 得荣县| 静乐县| 潞城市| 卢龙县| 收藏| 花莲县| 葵青区| 都匀市| 京山县| 余干县| 石狮市| 乡宁县| 汽车| 周口市| 乐平市| 育儿| 伊川县| 罗平县| 巩义市| 昌平区| 遂川县| 桓仁| 长岭县| 遂平县| 宁陕县| 云龙县| 河东区| 西藏| 青铜峡市| 高青县|