用SDK包开发K66FX18学习笔记(4)

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

发布了10 篇原创文章 · 获赞 12 · 访问量 580

猜你喜欢

转载自blog.csdn.net/hjy457459/article/details/102940648