新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32通用定時器TIMx

        STM32通用定時器TIMx

        作者: 時間:2016-11-13 來源:網絡 收藏
        STM32計數器時鐘可由下列四種時鐘源提供:

        (1)內部時鐘(CK_INT)

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

        (2)外部時鐘模式1:外部輸入腳(TIx)

        (3)外部時鐘模式2:外部觸發(fā)輸入(ETR)

        (4)內部觸發(fā)輸入(ITRx)

        時鐘源(CK_INT)經預分頻(PSC)后得到定時時鐘(CK_CNT),每個定時時鐘計數寄存器計數(可設向上/向下/中央對齊模式),計數寄存器計數至捕獲比較寄存器(CCR),則產生CC中斷;計數寄存器計數至預裝載值(ARR),則產生UPDATE中斷,并重裝預載值。

        舉個例子:(以向上計數為例,每40us中斷一次)

          例程:
        (省略RCC設置部分)


        void TIM2_Configuration(void)
        {
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_OCInitTypeDef TIM_OCInitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);// for 36MHz


        TIM_DeInit(TIM2);
        TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
        TIM_TimeBaseStructure.TIM_Period = 1200;// 預裝初值
        TIM_TimeBaseStructure.TIM_Prescaler = 36-1;// 預分頻
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x00; // 時鐘分頻因子(用于ETR,TIX)
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上計數
        TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; // 重復計數
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);


        /*-------------------*/
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
        TIM_OCInitStructure.TIM_Pulse = 40; //40us中斷一次
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC1Init(TIM2, &TIM_OCInitStructure);
        TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);

        /*-------------------*/
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
        TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;
        TIM_OCInitStructure.TIM_Pulse = 800;//PWM 800/1200
        TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
        TIM_OC2Init(TIM2, &TIM_OCInitStructure);
        TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);

        /*-------------------*/
        //TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Gated);
        //TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0);

        TIM_ARRPreloadConfig(TIM2, DISABLE);

        TIM_ITConfig(TIM2, TIM_IT_CC1|TIM_IT_CC2|TIM_IT_Update, ENABLE);
        TIM_Cmd(TIM2, ENABLE);
        }


        /*--------------中斷程序-------------------*/
        void TIM2_IRQHandler(void)
        {

        uint16_t capture = 0;

        if(TIM_GetITStatus(TIM2, TIM_IT_CC1) != RESET)

        {

        if((timer_cnt1++)>49)

        {

        timer_cnt1 = 0;

        f_2ms = 1;

        }

        TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);

        capture = TIM_GetCapture1(TIM2);

        if(capture==1200)

        TIM_SetCompare1(TIM2, 40);

        else

        TIM_SetCompare1(TIM2, capture + 40);

        }

        if(TIM_GetITStatus(TIM2, TIM_IT_CC2) != RESET)

        {

        GPIO_SetBits(P_LCDBK, LCDBK);

        }

        if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)

        GPIO_ResetBits(P_LCDBK, LCDBK);

        TIM2->SR = 0x00;
        }



        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 辽宁省| 那曲县| 民乐县| 商丘市| 丁青县| 临湘市| 永和县| 府谷县| 通州区| 调兵山市| 拉萨市| 泊头市| 延吉市| 措勤县| 深水埗区| 新绛县| 通州市| 乌兰察布市| 安徽省| 乌拉特中旗| 如东县| 阿图什市| 广平县| 岳普湖县| 蒲城县| 枣阳市| 巨鹿县| 沅江市| 霍州市| 云浮市| 中卫市| 夏津县| 乌苏市| 兖州市| 昭通市| 马公市| 黑山县| 延吉市| 七台河市| 邻水| 仁布县|