<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 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;//上升沿觸發(fā),還有TIM_ICPolarity(輸入活動沿),TIM_ICPolarity_Falling輸入捕獲下降沿可以選擇 ;一旦IC1為上升沿觸發(fā),則IC2就為下降沿觸發(fā),因為兩者觸發(fā)極性相反
          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捕獲在捕獲輸入行每探測到一個邊沿執(zhí)行一次)TIM_ICPS_DIV2(TIM捕獲每2個事件執(zhí)行一次)TIM_ICPS_DIV3TIM(捕獲每3個事件執(zhí)行一次)
          TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
          TIM_ICInit(TIM2, &TIM_ICInitStructure1);//本段代碼配置了定時器通道的工作方式


          TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);//選擇時鐘觸發(fā)源,選擇有效的觸發(fā)輸入信號TI1FP1,之前選擇通道1,自然選擇TI1FP1;還有TI1FP2,TI2FP1,TI2FP2可以選擇
          TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//配置從模式控制器為復位模式,這樣TI1捕獲到上升沿和計數值m之后計數器開始從0計數(配置從模式控制器模式)
          TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//啟動定時器的被動觸發(fā),使能捕獲模式(配置主從模式控制器模式)
          //以上配置讓定時器處于PWM輸入狀態(tài)下工作
          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為最高的優(yōu)先級
          NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure2);//NVIC配置,對定時器TIM2的中斷進行優(yōu)先級的配置
          //這個函數中,加粗的代碼對定時器TIM2進行了一次完整的配置

          }


          void HC04_Config2(void)//此函數完成HC04避障模塊觸發(fā)端的初始化
          {
          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的脈沖寬度的觸發(fā)信號

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


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

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


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

          HC04_Config1();
          return(L);
          }


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

          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;//上升沿觸發(fā),還有TIM_ICPolarity(輸入活動沿),TIM_ICPolarity_Falling輸入捕獲下降沿可以選擇 ;一旦IC1為上升沿觸發(fā),則IC2就為下降沿觸發(fā),因為兩者觸發(fā)極性相反
          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捕獲在捕獲輸入行每探測到一個邊沿執(zhí)行一次)TIM_ICPS_DIV2(TIM捕獲每2個事件執(zhí)行一次)TIM_ICPS_DIV3TIM(捕獲每3個事件執(zhí)行一次)
          TIM_PWMIConfig(TIM2, &TIM_ICInitStructure1);
          TIM_ICInit(TIM2, &TIM_ICInitStructure1);//本段代碼配置了定時器通道的工作方式


          TIM_SelectInputTrigger(TIM2, TIM_TS_TI1FP1);//選擇時鐘觸發(fā)源,選擇有效的觸發(fā)輸入信號TI1FP1,之前選擇通道1,自然選擇TI1FP1;還有TI1FP2,TI2FP1,TI2FP2可以選擇
          TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_Reset);//配置從模式控制器為復位模式,這樣TI1捕獲到上升沿和計數值m之后計數器開始從0計數(配置從模式控制器模式)
          TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);//啟動定時器的被動觸發(fā),使能捕獲模式(配置主從模式控制器模式)
          //以上配置讓定時器處于PWM輸入狀態(tài)下工作
          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為最高的優(yōu)先級
          NVIC_InitStructure2.NVIC_IRQChannelCmd = ENABLE;
          NVIC_Init(&NVIC_InitStructure2);//NVIC配置,對定時器TIM2的中斷進行優(yōu)先級的配置
          //這個函數中,加粗的代碼對定時器TIM2進行了一次完整的配置

          }


          void HC04_Config2(void)//此函數完成HC04避障模塊觸發(fā)端的初始化
          {
          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的脈沖寬度的觸發(fā)信號

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


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

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


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

          HC04_Config1();
          return(L);
          }


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

          HC04_Config1();
          return(L);
          }


          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();