目的:實現對邊沿信號的捕捉並及時,可用作計算脈寬,或者頻率等功能;
需要外設: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配置
//開啟APB2中TIM8時鍾
//設定分頻1Mhz ,計數值為65535
//使能CH2 ,IC2
//允許到CCR2中
void TIM8_INIT(u16 arr, u16 psc){
RCC->APB2ENR |= 0x00002000; //TIM8時鍾使能
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;