STM32F103輸入捕獲的實現


目的:實現對邊沿信號的捕捉並及時,可用作計算脈寬,或者頻率等功能;

需要外設:TIM8

需求:測量TIM8_CH2的輸入頻率;

操作:

  1.配置TIM8外設;

  2.讀取兩次下降沿的時間間隔

 

1.編寫相關函數

 

//  IO口的配置
void IO_Init(void)
{
 RCC->APB2ENR |= 1<<4;    //使能GPIOC時鍾

 GPIOC->CRL &= 0X0FFFFFFF;  //清除GPIO PC7的配置;
 GPIOC->CRL |= 0X40000000;  //PC7浮空輸入
}

//定時器8配置

//定時器8配置為輸入捕獲模式
//開啟APB2中TIM8時鍾
//設定分頻1Mhz ,計數值為65535
//使能CH2 ,IC2
//允許到CCR2中
void TIM8_INIT(u16 arr, u16 psc){
 
 RCC->APB2ENR |= 0x00002000;   //TIM8時鍾使能
 TIM8->ARR = arr;
 TIM8->PSC = psc;
 
 TIM8->CCMR1 |= 1<<8;   //IC2映射到CH2上
 TIM8->CCMR1 |= 0<<10;  //IC1輸入捕獲無預分頻
 TIM8->CCMR1 |= 0<<12;  //輸入捕獲無濾波
 
 TIM8->CCER  |= 0<<5;  //上升沿捕獲
 TIM8->CCER  |= 1<<4;  //輸入捕獲使能  允許捕獲后到CCR2中
 
 TIM8->CR1   &= ~(1<<0); //關閉定時器8;
}

 

//讀取脈寬時間
int Speed(void){          
 u16 temp1,temp2,temp ;
 TIM8->SR =0;                         //清除標志位
 TIM8->CR1   |= 0X01;             //開啟定時器8;
 while(!(TIM8->SR&0X04));         //讀取IC2狀態 第一個上升沿
 temp1 = TIM8->CCR2;              //讀取緩存區數據
 while(!(TIM8->SR&0X04));         //讀取IC2狀態 第二個上升沿
 temp2 = TIM8->CCR2;              //讀取緩存區數據
 TIM8->CR1   &=  ~(1<<0);         //關閉定時器8;
 if(temp1<temp2)
  temp =temp2-temp1;
 else if(temp1>temp2)
  temp=(0xffff-temp1)+temp2;
 else
  temp=0;                         //f=10的6次方/7*t  //t的單位為us
 
 return temp;  //返回時間 單位us
}

2.    使用函數

  在主函數中配置IO與TIM8,即可調用讀取時間的函數實現測量時間功能,時間單位為us;

  如果想要更短的時間可以修改分頻系數,當前使用的分頻為1Mhz;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM