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寄存器来获取,两个方法的效果是一样的。