LL庫實現定時器輸入捕獲

首先使用STcubeMX配置一下工程

我這裏使用的是定時器4的通道1

同時也打開了更新中斷,100ms中斷一次

需要特別注意的是,有些定時器的管腳是需要重映射的如果不重映射的話是沒辦法進入捕獲中斷的,這點STcubeMX在給我們初始化的時候沒有初始化,需要我們自己調用重映射函數:比如LL_GPIO_AF_EnableRemap_TIM4();

有了以上配置我們還需要手動打開中斷使能等操作,LL庫沒有爲我們打開。

	LL_TIM_ClearFlag_CC1(TIM4);
	LL_TIM_ClearFlag_UPDATE(TIM4);
	LL_TIM_EnableIT_CC1(TIM4);
	LL_TIM_EnableIT_UPDATE(TIM4);
	LL_TIM_CC_EnableChannel(TIM4,LL_TIM_CHANNEL_CH1);      //這個不要忘記打開了,不然無法捕獲
	LL_TIM_EnableCounter(TIM4);

然後就是中斷服務函數的編寫了

void TIM4_IRQHandler(void)
{
  /* USER CODE BEGIN TIM4_IRQn 0 */
	uint16_t dval = 0;
	if(LL_TIM_IsActiveFlag_UPDATE(TIM4) == SET)
	{
		LL_TIM_ClearFlag_UPDATE(TIM4);
		(TimeCount<UINT32_MAX)?(TimeCount++):(TimeCount = 0);

		if((TimeCount%LedFreq)<(LedFreq/2))
			LED(SET);
		else
			LED(RESET);
	}
	if(LL_TIM_IsActiveFlag_CC1(TIM4) == SET)
	{
		LL_TIM_ClearFlag_CC1(TIM4);
		if(IR_READ)
		{
			dval = LL_TIM_IC_GetCaptureCH1(TIM4);//該計數值代表低電平持續時間
			LL_TIM_IC_SetPolarity(TIM4, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_FALLING); //設置下降沿觸發捕獲
			LL_TIM_SetCounter(TIM4,0);    // 清零計數值
			IR_Receive[IR_ReceiveCount++] = dval;
		}
		else
		{
			dval = LL_TIM_IC_GetCaptureCH1(TIM4);//該計數值代表高電平持續時間
			LL_TIM_IC_SetPolarity(TIM4, LL_TIM_CHANNEL_CH1, LL_TIM_IC_POLARITY_RISING);  // 設置上升沿觸發
			LL_TIM_SetCounter(TIM4,0);    // 清零計數值
			IR_Receive[IR_ReceiveCount++] = dval;
		}
	}
  /* USER CODE END TIM4_IRQn 0 */
  /* USER CODE BEGIN TIM4_IRQn 1 */

  /* USER CODE END TIM4_IRQn 1 */
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章