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 */
}

 

 

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值