FTM脈衝輸入捕獲
1、宏定義
#define INCAP_INSTANCE FTM1 //端口號
#define INCAP_CHANNEL0 kFTM_Chnl_0 //通道號
#define INCAP_CHANNEL1 kFTM_Chnl_1 //通道號
#define INCAP_PORT PORTA //引腳端口號
#define INCAP_PIN1 8U //引腳號
#define INCAP_PIN2 9U //引腳號
#define INCAP_AF kPORT_MuxAlt3 //複用爲輸入捕獲
#define INCAP_CLKSOURCE kCLOCK_PortA //端口時鐘
#define INCAP_IRQ FTM1_IRQn //中斷向量號
#define INCAP_INTERRUPT_HANDLE FTM1_IRQHandler //中斷服務函數
#define INCAP_CHANNEL_FLAG kFTM_Chnl0Flag //中斷通道標誌
2、輸入捕獲初始化
void BMQ_INPUTCAP(void)
{
ftm_config_t INCAPconfig;//初始化結構體句柄
CLOCK_EnableClock(INCAP_CLKSOURCE);//引腳時鐘初始化
PORT_SetPinMux(INCAP_PORT,INCAP_PIN1,INCAP_AF);//端口複用爲輸入捕獲模式
PORT_SetPinMux(INCAP_PORT,INCAP_PIN2,INCAP_AF);//端口複用爲輸入捕獲模式
FTM_GetDefaultConfig(&INCAPconfig);//初始化配置
FTM_Init(INCAP_INSTANCE,&INCAPconfig);//初始化
FTM_SetupInputCapture(INCAP_INSTANCE,INCAP_CHANNEL0,kFTM_RisingEdge,0);//配置輸入捕獲爲上升沿捕獲,濾波選擇不濾波,則最後參數爲0
FTM_SetupInputCapture(INCAP_INSTANCE,INCAP_CHANNEL1,kFTM_RisingEdge,0);//配置輸入捕獲爲上升沿捕獲
INCAP_INSTANCE->MOD = 0xffff;//空閒運行模式
FTM_EnableInterrupts(INCAP_INSTANCE,kFTM_Chnl0InterruptEnable); //選擇中斷通道爲通道0
EnableIRQ(INCAP_IRQ);//使能中斷
FTM_StartTimer(INCAP_INSTANCE, kFTM_SystemClock);//開啓定時器,配置時鐘源爲系統時鐘
}
定義一個全局變量
uint32_t count = 0;
輸入捕獲採用中斷採集,每次採集到一個上升沿,進入一次中斷,count值自加1
void INCAP_INTERRUPT_HANDLE(void)
{
if((INCAP_INSTANCE->STATUS & 0x01)==1)
{
count++;
FTM_ClearStatusFlags(INCAP_INSTANCE,INCAP_CHANNEL_FLAG);//清除通道的標誌位
}
}
最後,每次10ms打印一次再清零,就可以知道10ms採集了多少個脈衝了
PRINTF("%d\n",count);
count = 0;
DELAY_MS(10);
個人心得:這個輸入捕獲的捕獲值不用通過讀取CnV寄存器來獲取,兩個方法的效果是一樣的。