一、輸入捕獲概述
1、輸入捕獲框圖
2、輸入捕獲工作詳解
①設置輸入捕獲濾波器
可以設置濾波,濾除一些高電平脈寬不足的脈沖信號。
②設置捕獲極性
③輸入捕獲映射
④輸入捕獲分頻器
這里的捕獲是將計數器的值存入比較寄存器中,分頻次的作用是設置幾個上升沿/下降沿來臨,才執行一次捕獲。
⑤發生捕獲時產生中斷
3、相關引腳
在數據手冊中可以查看。
因為我們要使用按鍵模擬輸入的波形,PA0為WAKE_UP按鍵,所以可以使用TIM5通道1或者TIM2通道1。
二、相關庫函數
注意這里GPIO的下拉輸入,只是針對該實驗,因為按鍵只會模擬高電平。
一般在輸入捕獲中,GPIO使用浮空輸入。
三、相關實驗
1、實驗目的
2、相關代碼
time.h
#ifndef __TIMER_H
#define __TIMER_H
#include "stm32f10x.h"//標志位 1:是否完成本次捕捉 1:上次是否捕捉到高電平 6:計時器重裝載次數
extern u8 flag;
//獲取的比較值
extern u16 cValue;void Timer_Int_Init(u16 preScaler,u16 value);void Timer_PWM_Init(u16 preScaler,u16 value);void Timer_Cap_Init(u16 preScaler,u16 value);#endif
time.c
//定義flag
u8 flag = 0;
u16 cValue = 0;void TIM2_IRQHandler()
{//如果計時器發生更新if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET){//如果超過最大更新次數,則為捕捉完畢if((flag & 0x3F) == 0x3F){flag |= 0x80;}else{flag++;}//清空中斷標志位TIM_ClearITPendingBit(TIM2,TIM_IT_Update);}//如果捕捉到上升沿 / 下降沿if(TIM_GetITStatus(TIM2,TIM_IT_CC1) == SET){//如果上次未捕捉上升沿 此時需要捕捉上升沿if((flag & 0x40) == 0){flag = 0;cValue = 0;TIM_SetCounter(TIM2, 0); // 清零計數器TIM_Cmd(TIM2, ENABLE); // 然后啟動flag |= 0x40;TIM_OC1PolarityConfig(TIM2,TIM_OCPolarity_Low);//捕捉下降沿}else //如果上次已捕捉上升沿,此次應該捕捉下降沿{cValue = TIM_GetCapture1(TIM2);TIM_Cmd(TIM2,DISABLE); //停止定時器flag |= 0x80; //最高位設1TIM_OC1PolarityConfig(TIM2,TIM_OCPolarity_High); //捕捉上升沿}//清空中斷標志位TIM_ClearITPendingBit(TIM2,TIM_IT_CC1);}
}
main.c
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "timer.h"
#include "usart.h"int main()
{extern u8 flag;extern u16 cValue;u16 time = 0; //以ms計數u16 value = 8999;u16 preScaler = 8000;//一個計數周期為1sdelay_init();uart_init(115200);Timer_Cap_Init(preScaler,value);while(1){//需要檢測 完成位if((flag & 0x80) == 0x80){time = (flag & 0x3F) * 1000 + cValue / 9;flag = 0;//不會重復檢測//通過串口發送時間printf("%d\r\n",time);}}
}
3、實驗總結
①:要注意多個中斷共用一個中斷函數,所以在中斷函數中要進行判斷。
②:extern修飾的變量,定義一次,多次聲明。
③:printf中/r/n表示換行。