HAL库 - 定时器输入捕获

输入捕获:捕捉信号变化的时间点,保存起来

常用函数

HAL_StatusTypeDef HAL_TIM_IC_Start(TIM_HandleTypeDef *htim, uint32_t Channel)
作用:启动输入捕获
*htim:定时器句柄的指针
Channel:通道编号,TIM_CHANNEL_1~`TIM_CHANNEL_4`

HAL_StatusTypeDef HAL_TIM_IC_Stop(TIM_HandleTypeDef *htim, uint32_t Channel)
作用:停止输入捕获
*htim:定时器句柄的指针
Channel:通道编号,TIM_CHANNEL_1~`TIM_CHANNEL_4`

__HAL_TIM_CLEAR_FLAG(__HANDLE__, __FLAG__)
作用:清除标志位
例如:__HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_CC1),清除TIM1计时器的CC1标志位

__HAL_TIM_GET_FLAG(__HANDLE__, __FLAG__)
作用:查询标志位的值
返回值(uint32_t):0 - 标志位等于0; 非零标志位等于1
例如查询TIM1计时器的CC1的标志位:uint32_t cc1Flag = __HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1);

示例:超时波测距

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  /* USER CODE BEGIN WHILE */	OLED_Init();	OLED_ShowString(1,1,"Distance:");  while (1)  {		//1、向CNT计数器写0		__HAL_TIM_SET_COUNTER(&htim1, 0); 		//2、清除CC1、CC2标志位		__HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_CC1);		__HAL_TIM_CLEAR_FLAG(&htim1, TIM_FLAG_CC2); 		//3、启用定时器		HAL_TIM_IC_Start(&htim1, TIM_CHANNEL_1);		HAL_TIM_IC_Start(&htim1, TIM_CHANNEL_2); 		//4、向Trig口发送脉冲,不少于10us		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_SET);		for(uint32_t i=0; i<10; i++);//每执行一次for循环认为是一个指令周期,8MHz.因此每次1us		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_14, GPIO_PIN_RESET); 		//5、等待cc1、cc2标志位		uint32_t expireTime = HAL_GetTick() + 50;//超时时间50ms		uint32_t success = 0;		while(HAL_GetTick() < expireTime )//如果没有超时		{		uint32_t cc1Flag = __HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC1);		uint32_t cc2Flag = __HAL_TIM_GET_FLAG(&htim1, TIM_FLAG_CC2);			if(cc1Flag && cc2Flag)			{				success = 1;//成功测量				break;			}		} 		//6、关闭定时器		HAL_TIM_IC_Stop(&htim1, TIM_CHANNEL_1);		HAL_TIM_IC_Stop(&htim1, TIM_CHANNEL_2); 		//7、计算结果		if(success == 1)		{			//读取cc1、cc2寄存器的值			uint16_t ccr1 = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_1);			uint16_t ccr2 = __HAL_TIM_GET_COMPARE(&htim1, TIM_CHANNEL_2);			//计算脉宽			float pulseWidth = (ccr2 - ccr1) * 1e-6f;			//计算距离 = 声速 * 传播时间 / 2			float distance = 340.0f * pulseWidth/2.0f;			//距离小于0.2,点灯			if(distance < 0.2)			{				HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,GPIO_PIN_RESET);				OLED_ShowNum(1,10,distance*1000.0,5);//显示距离			}			else			{				HAL_GPIO_WritePin(GPIOE,GPIO_PIN_0,GPIO_PIN_SET);				OLED_ShowNum(1,10,distance*1000.0,5);//显示距离			}		}    /* USER CODE END WHILE */    /* USER CODE BEGIN 3 */  }  /* USER CODE END 3 */}
🔍 ×