新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32芯片定時器輸入捕獲模式

        STM32芯片定時器輸入捕獲模式

        作者: 時間:2016-11-28 來源:網絡 收藏
        stm32定時器有輸入捕獲模式,PWM輸入模式,強輸出模式,輸出比較模式這幾種。

        #include"HC04.h"//這個文件保存了用戶自己編寫的應用程序
        #include"SysTick.h"
        extern uint32_t L;//主函數中,定義了L這個全局變量,想要在此文件中用到,應該進行聲明

        void HC04_Config1(void)//此函數完成HC04避障模塊接收端的初始化,需要對定時器TIM2進行配置
        {
        GPIO_InitTypeDef GPIO_InitStructure1;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
        TIM_ICInitTypeDef TIM_ICInitStructure1;
        NVIC_InitTypeDef NVIC_InitStructure2;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//調用庫函數,開啟了GPIOA的外設時鐘,這句代碼的意思應該是,開啟了GPIOA的使用
        GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
        GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;//將管腳設置為浮空輸入模式,以此對應通用定時器TIM2~TIM7的使用,定時器將捕獲來自這幾個管腳的脈沖信號
        GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;//將引腳的時鐘設置為50MHz
        GPIO_Init(GPIOA,&GPIO_InitStructure1);



        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打開定時器TIM2的時鐘
        TIM_DeInit(TIM2);//復位TIM2定時器

        TIM_TimeBaseStructure1.TIM_Period =0xFFFF;//設置計數溢出大小,每計65536個數就產生一個更新事件,此處的參數還得再改(TIM_Period設置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間)
        TIM_TimeBaseStructure1.TIM_Prescaler =1-1;//預分頻系數為1,這樣計數器時鐘為72MHz/1 = 72MHz
        TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_DIV1;//TIM_ClockDivision的作用是做一段延時,一般在特殊場合的時候會用到
        TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up;//TIM_CounterMode選擇了計數器模式。有TIM_CounterMode_Up(TIM向上計數模式)TIM_CounterMode_Down(TIM向下計數模式)TIM_CounterMode_CenterAligned1(TIM中央對齊模式1計數模式),TIM_CounterMode_CenterAligned2(TIM中央對齊模式2計數模式),IM_CounterMode_CenterAligned3(TIM中央對齊模式3計數模式)
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1);//本段代碼配置了定時器的時基


        TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1;//選擇定時器TIM2的通道1,有四個通道可以選擇,TI1選擇意味著也選擇了TI2,因為兩者是組合在一起的
        TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿觸發,還有TIM_ICPolarity(輸入活動沿),TIM_ICPolarity_Falling輸入捕獲下降沿可以選擇 ;一旦IC1為上升沿觸發,則IC2就為下降沿觸發,因為兩者觸發極性相反
        TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection選擇輸入;TIM_ICSelection_DirectTI:TIM輸入2,3或4選擇對應的IC1或IC2或IC3或IC4相連;TIM_ICSelection_IndirectTI:TIM輸入2,3或4選的對應與IC2或IC1或IC4或IC3相連;TIM_ICSelection_TRC:TIM輸入2,3或3選擇與TRC相連
        TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_DIV1;//輸入預分頻,意思是控制在多少個輸入周期做一個捕獲,如果輸入的信號頻率沒有變,測得的周期也不會變,比如選擇四分頻,則每四個輸入周期做一次捕獲,這樣在輸入信號不頻繁的情況下,可以減少軟件被不斷中斷的次TIM_ICPrescaler TIM_ICPSC_DIV1(TIM捕獲在捕獲輸入行每探測到一個邊沿執行一次)TIM_ICPS_DIV2(TIM捕獲每2個事件執行一次)TIM_ICPS_DIV3TIM(捕獲每3個事件執行一次)
        TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
        TIM_ICInit(TIM2, &TIM_ICInitStructure1);//本段代碼配置了定時器通道的工作方式


        TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);//選擇時鐘觸發源,選擇有效的觸發輸入信號TI1FP1,之前選擇通道1,自然選擇TI1FP1;還有TI1FP2,TI2FP1,TI2FP2可以選擇
        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//配置從模式控制器為復位模式,這樣TI1捕獲到上升沿和計數值m之后計數器開始從0計數(配置從模式控制器模式)
        TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//啟動定時器的被動觸發,使能捕獲模式(配置主從模式控制器模式)
        //以上配置讓定時器處于PWM輸入狀態下工作
        TIM_ClearFlag(TIM2, TIM_IT_CC2);//清除定時器的溢出標志,表示定時器計數從0開始
        TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//開啟了定時器TIM2的中斷
        TIM_Cmd(TIM2, ENABLE);//打開TIM2定時器


        NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
        NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0為最高的優先級
        NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure2);//NVIC配置,對定時器TIM2的中斷進行優先級的配置
        //這個函數中,加粗的代碼對定時器TIM2進行了一次完整的配置

        }


        void HC04_Config2(void)//此函數完成HC04避障模塊觸發端的初始化
        {
        GPIO_InitTypeDef GPIO_InitStructure2;
        //調用庫函數,定義了一個結構體類型為GPIO_InitTypeDef的結構體,名為GPIO_InitStructure2

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        //調用庫函數,開啟了GPIOA的外設時鐘,這句代碼的意思應該是,開啟了GPIOA的使用

        GPIO_InitStructure2.GPIO_Pin=(HC04_Trig0)|(HC04_Trig1)|(HC04_Trig2)|(HC04_Trig3);
        //開啟了GPIOA管腳的pin4,pin5,pin6,pin7

        GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
        //將選擇的管腳設置為推挽輸出模式,此模式一般接邏輯器件

        GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
        //將引腳的時鐘設置為50MHz

        GPIO_Init(GPIOA,&GPIO_InitStructure2);
        //調用庫函數GPIO_Init(),初始化GPIOA,關鍵利用GPIO_InitStructure中的參數進行初始化

        GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
        //調用GPIO_ResetBits()的話,是將端口設置為低電平
        }

        void HC04_Config(void)
        {
        HC04_Config2();
        }


        uint32_t DistanceHDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig0);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig0);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }//讓生命探測裝置上的避障模塊HC04測量長度


        uint32_t DistanceDDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig1);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig1);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }//讓前方的避障模塊測量長度


        uint32_t DistanceLDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig2);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig2);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }


        uint32_t DistanceRDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig3);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig3);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }stm32定時器有輸入捕獲模式,PWM輸入模式,強輸出模式,輸出比較模式這幾種。

        #include"HC04.h"//這個文件保存了用戶自己編寫的應用程序
        #include"SysTick.h"
        extern uint32_t L;//主函數中,定義了L這個全局變量,想要在此文件中用到,應該進行聲明

        void HC04_Config1(void)//此函數完成HC04避障模塊接收端的初始化,需要對定時器TIM2進行配置
        {
        GPIO_InitTypeDef GPIO_InitStructure1;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure1;
        TIM_ICInitTypeDef TIM_ICInitStructure1;
        NVIC_InitTypeDef NVIC_InitStructure2;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//調用庫函數,開啟了GPIOA的外設時鐘,這句代碼的意思應該是,開啟了GPIOA的使用
        GPIO_InitStructure1.GPIO_Pin=(HC04_Echo0)|(HC04_Echo1)|(HC04_Echo2)|(HC04_Echo3);
        GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IN_FLOATING;//將管腳設置為浮空輸入模式,以此對應通用定時器TIM2~TIM7的使用,定時器將捕獲來自這幾個管腳的脈沖信號
        GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;//將引腳的時鐘設置為50MHz
        GPIO_Init(GPIOA,&GPIO_InitStructure1);



        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //打開定時器TIM2的時鐘
        TIM_DeInit(TIM2);//復位TIM2定時器

        TIM_TimeBaseStructure1.TIM_Period =0xFFFF;//設置計數溢出大小,每計65536個數就產生一個更新事件,此處的參數還得再改(TIM_Period設置了在下一個更新事件裝入活動的自動重裝載寄存器周期的值。它的取值必須在0x0000和0xFFFF之間)
        TIM_TimeBaseStructure1.TIM_Prescaler =1-1;//預分頻系數為1,這樣計數器時鐘為72MHz/1 = 72MHz
        TIM_TimeBaseStructure1.TIM_ClockDivision =TIM_CKD_DIV1;//TIM_ClockDivision的作用是做一段延時,一般在特殊場合的時候會用到
        TIM_TimeBaseStructure1.TIM_CounterMode=TIM_CounterMode_Up;//TIM_CounterMode選擇了計數器模式。有TIM_CounterMode_Up(TIM向上計數模式)TIM_CounterMode_Down(TIM向下計數模式)TIM_CounterMode_CenterAligned1(TIM中央對齊模式1計數模式),TIM_CounterMode_CenterAligned2(TIM中央對齊模式2計數模式),IM_CounterMode_CenterAligned3(TIM中央對齊模式3計數模式)
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure1);//本段代碼配置了定時器的時基


        TIM_ICInitStructure1.TIM_Channel = TIM_Channel_1;//選擇定時器TIM2的通道1,有四個通道可以選擇,TI1選擇意味著也選擇了TI2,因為兩者是組合在一起的
        TIM_ICInitStructure1.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿觸發,還有TIM_ICPolarity(輸入活動沿),TIM_ICPolarity_Falling輸入捕獲下降沿可以選擇 ;一旦IC1為上升沿觸發,則IC2就為下降沿觸發,因為兩者觸發極性相反
        TIM_ICInitStructure1.TIM_ICSelection=TIM_ICSelection_DirectTI;//TIM_ICSelection選擇輸入;TIM_ICSelection_DirectTI:TIM輸入2,3或4選擇對應的IC1或IC2或IC3或IC4相連;TIM_ICSelection_IndirectTI:TIM輸入2,3或4選的對應與IC2或IC1或IC4或IC3相連;TIM_ICSelection_TRC:TIM輸入2,3或3選擇與TRC相連
        TIM_ICInitStructure1.TIM_ICPrescaler = TIM_ICPSC_DIV1;//輸入預分頻,意思是控制在多少個輸入周期做一個捕獲,如果輸入的信號頻率沒有變,測得的周期也不會變,比如選擇四分頻,則每四個輸入周期做一次捕獲,這樣在輸入信號不頻繁的情況下,可以減少軟件被不斷中斷的次TIM_ICPrescaler TIM_ICPSC_DIV1(TIM捕獲在捕獲輸入行每探測到一個邊沿執行一次)TIM_ICPS_DIV2(TIM捕獲每2個事件執行一次)TIM_ICPS_DIV3TIM(捕獲每3個事件執行一次)
        TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
        TIM_ICInit(TIM2, &TIM_ICInitStructure1);//本段代碼配置了定時器通道的工作方式


        TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);//選擇時鐘觸發源,選擇有效的觸發輸入信號TI1FP1,之前選擇通道1,自然選擇TI1FP1;還有TI1FP2,TI2FP1,TI2FP2可以選擇
        TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//配置從模式控制器為復位模式,這樣TI1捕獲到上升沿和計數值m之后計數器開始從0計數(配置從模式控制器模式)
        TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//啟動定時器的被動觸發,使能捕獲模式(配置主從模式控制器模式)
        //以上配置讓定時器處于PWM輸入狀態下工作
        TIM_ClearFlag(TIM2, TIM_IT_CC2);//清除定時器的溢出標志,表示定時器計數從0開始
        TIM_ITConfig(TIM2,TIM_IT_CC2,ENABLE);//開啟了定時器TIM2的中斷
        TIM_Cmd(TIM2, ENABLE);//打開TIM2定時器


        NVIC_InitStructure2.NVIC_IRQChannel = TIM2_IRQn;
        NVIC_InitStructure2.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure2.NVIC_IRQChannelSubPriority = 1; //0為最高的優先級
        NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure2);//NVIC配置,對定時器TIM2的中斷進行優先級的配置
        //這個函數中,加粗的代碼對定時器TIM2進行了一次完整的配置

        }


        void HC04_Config2(void)//此函數完成HC04避障模塊觸發端的初始化
        {
        GPIO_InitTypeDef GPIO_InitStructure2;
        //調用庫函數,定義了一個結構體類型為GPIO_InitTypeDef的結構體,名為GPIO_InitStructure2

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        //調用庫函數,開啟了GPIOA的外設時鐘,這句代碼的意思應該是,開啟了GPIOA的使用

        GPIO_InitStructure2.GPIO_Pin=(HC04_Trig0)|(HC04_Trig1)|(HC04_Trig2)|(HC04_Trig3);
        //開啟了GPIOA管腳的pin4,pin5,pin6,pin7

        GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_Out_PP;
        //將選擇的管腳設置為推挽輸出模式,此模式一般接邏輯器件

        GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;
        //將引腳的時鐘設置為50MHz

        GPIO_Init(GPIOA,&GPIO_InitStructure2);
        //調用庫函數GPIO_Init(),初始化GPIOA,關鍵利用GPIO_InitStructure中的參數進行初始化

        GPIO_ResetBits(GPIOA,HC04_Trig0|HC04_Trig1|HC04_Trig2|HC04_Trig3);
        //調用GPIO_ResetBits()的話,是將端口設置為低電平
        }

        void HC04_Config(void)
        {
        HC04_Config2();
        }


        uint32_t DistanceHDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig0);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig0);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }//讓生命探測裝置上的避障模塊HC04測量長度


        uint32_t DistanceDDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig1);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig1);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }//讓前方的避障模塊測量長度


        uint32_t DistanceLDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig2);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig2);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }


        uint32_t DistanceRDetect(void)
        {
        GPIO_SetBits(GPIOA,HC04_Trig3);
        Delay_us(20);
        GPIO_ResetBits(GPIOA,HC04_Trig3);//生成20us的脈沖寬度的觸發信號

        HC04_Config1();
        return(L);
        }


        評論


        技術專區

        關閉
        主站蜘蛛池模板: 南康市| 永济市| 江陵县| 台东市| 临沧市| 固原市| 富顺县| 永寿县| 积石山| 安远县| 永康市| 闵行区| 雷山县| 秦安县| 建昌县| 滦南县| 阿克| 闵行区| 大厂| 铜鼓县| 时尚| 嘉祥县| 黄大仙区| 邛崃市| 灵石县| 三穗县| 怀来县| 娄底市| 襄垣县| 信丰县| 平江县| 沾益县| 收藏| 灌南县| 醴陵市| 阿坝| 凌源市| 抚顺县| 晋江市| 普陀区| 抚远县|