新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 關(guān)于stm32的定時器的運用配置

        關(guān)于stm32的定時器的運用配置

        作者: 時間:2016-11-27 來源:網(wǎng)絡(luò) 收藏
        定時器stm32的一大利器,現(xiàn)在的項目中可以說沒有一個不會用到定時器的,所以掌握理解運用定時器才會做出好的產(chǎn)品來。
        本章內(nèi)容說一說關(guān)于stm32的定時器TIM_GetCounter(TIMx)的運用。之前的項目中曾經(jīng)用這個來獲取高低電平的時長,在超聲波測距,紅外遙控解碼中運用過。Stm32的定時器除了1和8其他都是通用定時器。如何用這句函數(shù)來捕捉電平時長呢?首先看一下初始化內(nèi)容,以TIM4為例
        void Timer4_CFG()
        {

        TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        GPIO_InitTypeDef GPIO_InitStructure;


        RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOE | RCC_APB2Periph_AFIO , ENABLE);

        GPIO_InitStructure.GPIO_Pin = IR_LED_PIN;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(IR_LED_PORT, &GPIO_InitStructure);


        TIM_TimeBaseStructure.TIM_Prescaler = 3599; //TIM_CKD_DIV1
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//
        TIM_TimeBaseStructure.TIM_Period = 200;// ARR
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
        //TIM_TimeBaseStructure.TIM_RepetitionCounter = 4;
        TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

        //TIM_PrescalerConfig(TIM4,3599,TIM_PSCReloadMode_Immediate);//72MHz/(3599+1)=20 000HZ 50uS
        TIM_ARRPreloadConfig(TIM4,DISABLE);

        TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE);
        TIM_ITConfig(TIM4,TIM_IT_Trigger,ENABLE);
        TIM_Cmd(TIM4, DISABLE);


        }
        APB1是36M時鐘,經(jīng)過分頻后產(chǎn)生20KHZ 50us周期的波形。TIM->CNT這個是計數(shù)器,在這里計算TIM_TimeBaseStructure.TIM_Period的值時有一定的規(guī)律,就是你采集的高低電平最大是多少要知道,比如我采集的波形中的電平最長的是4ms,基準計時器是50us,那么我要計算80個才能達到4ms,所以TIM_TimeBaseStructure.TIM_Period的值一定要比80大,否則就會出錯。這里要提醒大家TIM-CNT的值達到TIM_TimeBaseStructure.TIM_Period的值時,就會清零重新計數(shù)如下圖。這是利用定時器的TIMX-CNT計數(shù)器獲得高低電平的寄存器配置方法,當然cnt=TIM_GetCounter(TIMx);cnt要乘以50us才是真正的時間。


        如果不用計數(shù)器,想在中斷里用一個全局變量來表示中斷的次數(shù)來計算高低電平的時長,注意,這種方法可能因為程序功能多而造成不準確,在功能較少的情況下可以嘗試,那么配置定時器就又要改了,基準還是50us,
        TIM_TimeBaseStructure.TIM_Prescaler =3599; //TIM_CKD_DIV1
        這個時候不能考慮最大值了,而是考慮一個最小公約數(shù),比如我要采集的高低電平有多少呢,有8ms,4ms,1ms,500us,那么TIM_TimeBaseStructure.TIM_Period的值就有要求了,只要是50us的倍數(shù)并和50us相乘后小于500us還是他的約數(shù)就可以了。舉個例子

        TIM_TimeBaseStructure.TIM_Prescaler = 3599; //
        TIM_TimeBaseStructure.TIM_Period=1;//
        這兩句話代表50us發(fā)生一次中斷。


        關(guān)鍵詞: stm32定時器運用配

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 承德县| 乌兰县| 昭平县| 衡阳县| 胶州市| 弋阳县| 晋城| 章丘市| 达尔| 威海市| 德江县| 兴安盟| 湘乡市| 安阳县| 年辖:市辖区| 蓬安县| 邛崃市| 色达县| 苗栗市| 城步| 涞源县| 精河县| 六盘水市| 巴东县| 禹城市| 闸北区| 永登县| 醴陵市| 肃北| 确山县| 孝义市| 慈利县| 大名县| 博兴县| 宝兴县| 中阳县| 广昌县| 简阳市| 贺兰县| 厦门市| 西安市|