新聞中心

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

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

        作者: 時間:2016-11-25 來源:網絡 收藏
        1、普通定時使用

        本文引用地址:http://www.104case.com/article/201611/321303.htm

        #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 = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        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 =(10000-1); //時鐘分頻系數
        TIM_TimeBaseInitStructure.TIM_Period =(7200-1); //自動重裝寄存器
        TIM_TimeBaseInitStructure.TIM_CounterMode =TIM_CounterMode_Up; //向上計數模式
        TIM_TimeBaseInitStructure.TIM_ClockDivision =0; //時鐘分割,這里不涉及
        #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 0

        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);
        }
        #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 =(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); //清除中斷標示位



        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 = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        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 =(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); //清除中斷標示位



        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 = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

        NVIC_Init(&NVIC_InitStructure);
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 沅陵县| 于田县| 伊宁市| 安远县| 焉耆| 郸城县| 上犹县| 平果县| 黄梅县| 常熟市| 阳西县| 新营市| 睢宁县| 杭州市| 衡东县| 泸溪县| 绥江县| 霍城县| 广南县| 湖南省| 滦平县| 大连市| 桐城市| 朝阳市| 武威市| 石门县| 安丘市| 乐东| 安塞县| 潮州市| 手机| 石门县| 墨江| 乌兰浩特市| 肃宁县| 吴旗县| 寿宁县| 泸西县| 河北省| 隆昌县| 离岛区|